在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Java/ Mybatis表關(guān)聯(lián)多對(duì)一
Mybatis表關(guān)聯(lián)多對(duì)一
MyBatis打印輸出SQL語(yǔ)句
Mybatis表關(guān)聯(lián)一對(duì)多
mybaits if標(biāo)簽語(yǔ)句
MyBatis整合Spring MVC
MyBatis動(dòng)態(tài)SQL語(yǔ)句
MyBatis教程
MyBatis choose(when, otherwise)標(biāo)簽
Mybatis與Spring集成
MyBatis分頁(yè)
MyBatis SqlSessionDaoSupport實(shí)例
MyBatis where標(biāo)簽語(yǔ)句
Mybatis增刪改查(CURD)
Mybatis接口注解
Mybatis trim標(biāo)簽
Mybatis set標(biāo)簽
Mybatis 多對(duì)多
MyBatis環(huán)境配置及入門(mén)

Mybatis表關(guān)聯(lián)多對(duì)一

在上章的 一對(duì)多 中,我們已經(jīng)學(xué)習(xí)如何在 Mybatis 中關(guān)聯(lián)多表,但在實(shí)際項(xiàng)目中也是經(jīng)常使用 多對(duì)一 的情況,這些查詢是如何處理的呢,在這一節(jié)中我們來(lái)學(xué)習(xí)它。多表映射的多對(duì)一關(guān)系要用到 mybitis 的 association 來(lái)加以實(shí)現(xiàn)。這篇介紹的是多表中的多對(duì)一表關(guān)聯(lián)查詢。

應(yīng)用場(chǎng)景:首先根據(jù)帖子 ID 讀取一個(gè)帖子信息,然后再讀取這個(gè)帖子所屬的用戶信息。

1、先做一些準(zhǔn)備工作

我們首先在創(chuàng)建一個(gè) java 工程,工程名稱為:mybatis05-many2one(下載),還需要?jiǎng)?chuàng)建兩張表,它們分別是用戶表 user,和帖子表 post,一個(gè)戶用戶可以有多個(gè)帖子。

user表的結(jié)構(gòu)和數(shù)據(jù):

-- ----------------------------
-- Table structure for `user`
-- ----------------------------
CREATE TABLE `user` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(64) NOT NULL DEFAULT '',
  `mobile` int(10) unsigned NOT NULL DEFAULT '0',
  `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', 'yiibai', '100', '2015-09-23 20:11:23');

帖子表 post 的結(jié)構(gòu)和數(shù)據(jù):

-- ----------------------------
-- Table structure for `post`
-- ----------------------------
CREATE TABLE `post` (
  `post_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `userid` int(10) unsigned NOT NULL,
  `title` varchar(254) NOT NULL DEFAULT '',
  `content` text,
  `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`post_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of post
-- ----------------------------
INSERT INTO `post` VALUES ('1', '1', 'MyBatis關(guān)聯(lián)數(shù)據(jù)查詢', '在實(shí)際項(xiàng)目中,經(jīng)常使用關(guān)聯(lián)表的查詢,比如:多對(duì)一,一對(duì)多等。這些查詢是如何處理的呢,這一講就講這個(gè)問(wèn)題。我們首先創(chuàng)建一個(gè) post 表,并初始化數(shù)據(jù).', '2015-09-23 21:40:17');
INSERT INTO `post` VALUES ('2', '1', 'MyBatis開(kāi)發(fā)環(huán)境搭建', '為了方便學(xué)習(xí),這里直接建立java 工程,但一般都是開(kāi)發(fā) Web 項(xiàng)目。', '2015-09-23 21:42:14');
INSERT INTO `post` VALUES ('3', '2', '這個(gè)是別人發(fā)的', 'content,內(nèi)容...', '0000-00-00 00:00:00');  

從上面應(yīng)該看出,這幾個(gè)帖子對(duì)應(yīng)的 userid 都是1,所以需要用戶表 user 里面有 id=1 的數(shù)據(jù)??梢孕薷某蓾M足自己條件的數(shù)據(jù),按照 orm 的規(guī)則,表肯定需要一個(gè)對(duì)象與之對(duì)應(yīng),所以我們?cè)黾右粋€(gè) Post 類(lèi)。

2、創(chuàng)建表對(duì)應(yīng)的 JavaBean 對(duì)象

這個(gè)例子中,我們需要在包 com.yiibai.pojo 下創(chuàng)建兩個(gè)類(lèi),它們分別是: User.java 和 Post.java,我們一個(gè)一個(gè)地來(lái)看它們的代碼,User.java 類(lèi)的代碼如下:

package com.yiibai.pojo;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

public class User implements Serializable{
	private int id;
	private String username;
	private String mobile;
	private List<Post> posts;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getMobile() {
		return mobile;
	}

	public void setMobile(String mobile) {
		this.mobile = mobile;
	}

	public List<Post> getPosts() {
		return posts;
	}
	public void setPosts(List<Post> posts) {
		this.posts = posts;
	}

	@Override
	public String toString() {
		return "User [id=" + id + ", name=" + username + "]";
	}

}
Post.java 類(lèi)的代碼如下:
package com.yiibai.pojo;

import java.io.Serializable;

public class Post implements Serializable{
	private int id;
	private User user;
	private String title;
	private String content;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}
}

3、配置文件

在這一章節(jié)中,要用到的配置文件有兩個(gè),一個(gè)是 mybatis 的主配置文件:src/config/Configure.xml 和 User.java對(duì)應(yīng)的配置文件 User.xml,我們先來(lái)看看 src/config/Configure.xml,其詳細(xì)配置信息如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<typeAliases>
		<typeAlias alias="User" type="com.yiibai.pojo.User" />
		<typeAlias alias="Post" type="com.yiibai.pojo.Post" />
	</typeAliases>

	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver" />
				<property name="url" value="jdbc:mysql://127.0.0.1:3306/yiibai" />
				<property name="username" value="root" />
				<property name="password" value="" />
			</dataSource>
		</environment>
	</environments>

	<mappers>
		<!-- // power by http://www.yiibai.com -->
		<mapper resource="com/yiibai/pojo/User.xml" />
	</mappers>
</configuration>
這里需要注意的是 <typeAliases> 這個(gè)標(biāo)簽內(nèi)容,它就是用于定義一個(gè) JavaBean 類(lèi)的別名,如將 com.yiibai.pojo.User 簡(jiǎn)寫(xiě)為 User,可以認(rèn)為  com.yiibai.pojo.User 就是 User,User 就是  com.yiibai.pojo.User 。

另外一個(gè)配置文件 User.xml 的內(nèi)容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.yiibai.userMaper">
	<!-- User 級(jí)聯(lián)文章查詢 方法配置 (多個(gè)文章對(duì)一個(gè)用戶)  -->
	
	<resultMap type="Post" id="resultPostsMap">
		<result property="id" column="post_id" />
		<result property="title" column="title" />
		<result property="content" column="content" />
		<association property="user" javaType="User">  
	        <id property="id" column="userid"/>   
	        <result property="username" column="username"/>   
	        <result property="mobile" column="mobile"/>   
        </association> 
	</resultMap>

	<select id="getPosts" resultMap="resultPostsMap" parameterType="int">
		SELECT u.*,p.*
		FROM user u, post p
		WHERE u.id=p.userid AND p.post_id=#{post_id} 
  </select>

</mapper>

注:在上面的配置文件中,使用到了一個(gè) <association>標(biāo)簽,關(guān)聯(lián)對(duì)應(yīng)的 User 類(lèi)。

4、測(cè)試程序運(yùn)行

到這里,整個(gè)工作準(zhǔn)備得已經(jīng)差不多了,我們創(chuàng)建一個(gè)主類(lèi)來(lái)測(cè)試上面程序,在 src 下創(chuàng)建一個(gè) Main.java,代碼如下:

import java.io.Reader;
import java.text.MessageFormat;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.yiibai.pojo.Post;
import com.yiibai.pojo.User;


public class Main {
	private static SqlSessionFactory sqlSessionFactory;
	private static Reader reader;

	static {
		try {
			reader = Resources.getResourceAsReader("config/Configure.xml");
			sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static SqlSessionFactory getSession() {
		return sqlSessionFactory;
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		SqlSession session = sqlSessionFactory.openSession();
		try {
			int postId = 1;
			Post post = session.selectOne("com.yiibai.userMaper.getPosts", postId); 
			System.out.println("title: "+post.getTitle());
			System.out.println("userName: "+post.getUser().getUsername());
		} finally {
			session.close();
		}
	}

}

輸出結(jié)果如下:

title: MyBatis關(guān)聯(lián)數(shù)據(jù)查詢
userName: yiibai


附工程目錄結(jié)構(gòu)圖如下: