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

Mybatis表關聯(lián)多對一

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

應用場景:首先根據帖子 ID 讀取一個帖子信息,然后再讀取這個帖子所屬的用戶信息。

1、先做一些準備工作

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

user表的結構和數據:

-- ----------------------------
-- 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 的結構和數據:

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

從上面應該看出,這幾個帖子對應的 userid 都是1,所以需要用戶表 user 里面有 id=1 的數據??梢孕薷某蓾M足自己條件的數據,按照 orm 的規(guī)則,表肯定需要一個對象與之對應,所以我們增加一個 Post 類。

2、創(chuàng)建表對應的 JavaBean 對象

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

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 類的代碼如下:
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é)中,要用到的配置文件有兩個,一個是 mybatis 的主配置文件:src/config/Configure.xml 和 User.java對應的配置文件 User.xml,我們先來看看 src/config/Configure.xml,其詳細配置信息如下:

<?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> 這個標簽內容,它就是用于定義一個 JavaBean 類的別名,如將 com.yiibai.pojo.User 簡寫為 User,可以認為  com.yiibai.pojo.User 就是 User,User 就是  com.yiibai.pojo.User 。

另外一個配置文件 User.xml 的內容如下:

<?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 級聯(lián)文章查詢 方法配置 (多個文章對一個用戶)  -->
	
	<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>

注:在上面的配置文件中,使用到了一個 <association>標簽,關聯(lián)對應的 User 類。

4、測試程序運行

到這里,整個工作準備得已經差不多了,我們創(chuàng)建一個主類來測試上面程序,在 src 下創(chuàng)建一個 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();
		}
	}

}

輸出結果如下:

title: MyBatis關聯(lián)數據查詢
userName: yiibai


附工程目錄結構圖如下:




下一篇:Mybatis 多對多