有了前面几章的基础,对一些简单的应用是可以处理的,但在实际项目中,经常是关联表的查询,比如:最常见到的多对一,一对多等。这些查询是如何处理的呢,这一讲就讲这个问题。前面几篇教程中介绍的都是单表映射的一些操作,然而在我们的实际项目中往往是用到多表映射。在Java实体对象对中,一对多可以根据List和Set来实现,两者在mybitis中都是通过collection标签来配合来加以实现。这篇介绍的是多表中的多对一表关联查询。

应用场景:首先根据用户 ID 读取一个用户信息,然后再读取这个用户所发布贴子(post)。

1、先做一些准备工作

我们首先在创建一个 java 工程,工程名称为:mybatis04-one2many(下载),还需要创建两张表,它们分别是用户表 user,和帖子表 post,一个户用户可以有多个帖子。
user表的结构和数据:

  1. -- ----------------------------
  2. -- Table structure for `user`
  3. -- ----------------------------
  4. CREATE TABLE `user` (
  5. `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  6. `username` varchar(64) NOT NULL DEFAULT '',
  7. `mobile` int(10) unsigned NOT NULL DEFAULT '0',
  8. `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  9. PRIMARY KEY (`id`)
  10. ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
  11.  
  12. -- ----------------------------
  13. -- Records of user
  14. -- ----------------------------
  15. INSERT INTO `user` VALUES ('1', 'yiibai', '100', '2015-09-23 20:11:23');

帖子表 post 的结构和数据:

  1. -- ----------------------------
  2. -- Table structure for `post`
  3. -- ----------------------------
  4. CREATE TABLE `post` (
  5. `post_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  6. `userid` int(10) unsigned NOT NULL,
  7. `title` varchar(254) NOT NULL DEFAULT '',
  8. `content` text,
  9. `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  10. PRIMARY KEY (`post_id`)
  11. ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
  12.  
  13. -- ----------------------------
  14. -- Records of post
  15. -- ----------------------------
  16. INSERT INTO `post` VALUES ('1', '1', 'MyBatis关联数据查询', '在实际项目中,经常使用关联表的查询,比如:多对一,一对多等。这些查询是如何处理的呢,这一讲就讲这个问题。我们首先创建一个 post 表,并初始化数据.', '2015-09-23 21:40:17');
  17. INSERT INTO `post` VALUES ('2', '1', 'MyBatis开发环境搭建', '为了方便学习,这里直接建立java 工程,但一般都是开发 Web 项目。', '2015-09-23 21:42:14');
  18. INSERT INTO `post` VALUES ('3', '2', '这个是别人发的', 'content,内容...', '0000-00-00 00:00:00');  

从上面应该看出,这几个帖子对应的 userid 都是1,所以需要用户表 user 里面有 id=1 的数据。可以修改成满足自己条件的数据,按照orm的规则,表肯定需要一个对象与之对应,所以我们增加一个 Post 类。

2、创建表对应的 JavaBean 对象

这个例子中,我们需要在包 com.yiibai.pojo 下创建两个类,它们分别是: User.java 和 Post.java,我们一个一个地来看它们的代码,User.java 类的代码如下:

  1. package com.yiibai.pojo;
  2.  
  3. import java.io.Serializable;
  4. import java.util.Date;
  5. import java.util.List;
  6.  
  7. public class User implements Serializable{
  8. private int id;
  9. private String username;
  10. private String mobile;
  11. private List<Post> posts;
  12.  
  13. public int getId() {
  14. return id;
  15. }
  16.  
  17. public void setId(int id) {
  18. this.id = id;
  19. }
  20.  
  21. public String getUsername() {
  22. return username;
  23. }
  24.  
  25. public void setUsername(String username) {
  26. this.username = username;
  27. }
  28.  
  29. public String getMobile() {
  30. return mobile;
  31. }
  32.  
  33. public void setMobile(String mobile) {
  34. this.mobile = mobile;
  35. }
  36.  
  37. public List<Post> getPosts() {
  38. return posts;
  39. }
  40. public void setPosts(List<Post> posts) {
  41. this.posts = posts;
  42. }
  43.  
  44. @Override
  45. public String toString() {
  46. return "User [id=" + id + ", name=" + username + "]";
  47. }
  48.  
  49. }

Post.java 类的代码如下:

  1. package com.yiibai.pojo;
  2.  
  3. import java.io.Serializable;
  4.  
  5. public class Post implements Serializable{
  6. private int id;
  7. private User user;
  8. private String title;
  9. private String content;
  10.  
  11. public int getId() {
  12. return id;
  13. }
  14.  
  15. public void setId(int id) {
  16. this.id = id;
  17. }
  18.  
  19. public User getUser() {
  20. return user;
  21. }
  22.  
  23. public void setUser(User user) {
  24. this.user = user;
  25. }
  26.  
  27. public String getTitle() {
  28. return title;
  29. }
  30.  
  31. public void setTitle(String title) {
  32. this.title = title;
  33. }
  34.  
  35. public String getContent() {
  36. return content;
  37. }
  38.  
  39. public void setContent(String content) {
  40. this.content = content;
  41. }
  42. }

3、配置文件

在这一章节中,要用到的配置文件有两个,一个是 mybatis 的主配置文件:src/config/Configure.xml 和 User.java对应的配置文件 User.xml,我们先来看看 src/config/Configure.xml,其详细配置信息如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  3. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  4. <configuration>
  5. <typeAliases>
  6. <typeAlias alias="User" type="com.yiibai.pojo.User" />
  7. <typeAlias alias="Post" type="com.yiibai.pojo.Post" />
  8. </typeAliases>
  9.  
  10. <environments default="development">
  11. <environment id="development">
  12. <transactionManager type="JDBC" />
  13. <dataSource type="POOLED">
  14. <property name="driver" value="com.mysql.jdbc.Driver" />
  15. <property name="url" value="jdbc:mysql://127.0.0.1:3306/yiibai" />
  16. <property name="username" value="root" />
  17. <property name="password" value="" />
  18. </dataSource>
  19. </environment>
  20. </environments>
  21.  
  22. <mappers>
  23. <!-- // power by http://www.yiibai.com -->
  24. <mapper resource="com/yiibai/pojo/User.xml" />
  25. </mappers>
  26. </configuration>

这里需要注意的是 <typeAliases> 这个标签内容,它就是用于定义一个 JavaBean 类的别名,如将 com.yiibai.pojo.User 简写为 User,可以认为  com.yiibai.pojo.User 就是 User,User 就是  com.yiibai.pojo.User 。

另外一个配置文件 User.xml 的内容如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  4.  
  5. <mapper namespace="com.yiibai.userMaper">
  6. <!-- User 级联文章查询 方法配置 (一个用户对多个文章) -->
  7.  
  8. <resultMap type="User" id="resultUserMap">
  9. <result property="id" column="user_id" />
  10. <result property="username" column="username" />
  11. <result property="mobile" column="mobile" />
  12. <collection property="posts" ofType="com.yiibai.pojo.Post" column="userid">
  13. <id property="id" column="post_id" javaType="int" jdbcType="INTEGER"/>
  14. <result property="title" column="title" javaType="string" jdbcType="VARCHAR"/>
  15. <result property="content" column="content" javaType="string" jdbcType="VARCHAR"/>
  16. </collection>
  17. </resultMap>
  18.  
  19. <select id="getUser" resultMap="resultUserMap" parameterType="int">
  20. SELECT u.*,p.*
  21. FROM user u, post p
  22. WHERE u.id=p.userid AND id=#{user_id}
  23. </select>
  24.  
  25. </mapper>

4、测试程序运行

到这里,整个工作准备得已经差不多了,我们创建一个主类来测试上面程序,在 src 下创建一个 Main.java,代码如下:

  1. import java.io.Reader;
  2. import java.text.MessageFormat;
  3. import java.util.List;
  4.  
  5. import org.apache.ibatis.io.Resources;
  6. import org.apache.ibatis.session.SqlSession;
  7. import org.apache.ibatis.session.SqlSessionFactory;
  8. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  9.  
  10. import com.yiibai.pojo.Post;
  11. import com.yiibai.pojo.User;
  12.  
  13. public class Main {
  14. private static SqlSessionFactory sqlSessionFactory;
  15. private static Reader reader;
  16.  
  17. static {
  18. try {
  19. reader = Resources.getResourceAsReader("config/Configure.xml");
  20. sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
  21. } catch (Exception e) {
  22. e.printStackTrace();
  23. }
  24. }
  25.  
  26. public static SqlSessionFactory getSession() {
  27. return sqlSessionFactory;
  28. }
  29.  
  30. /**
  31. * @param args
  32. */
  33. public static void main(String[] args) {
  34. // TODO Auto-generated method stub
  35. SqlSession session = sqlSessionFactory.openSession();
  36. try {
  37. int userid = 1;
  38. User user = session.selectOne("com.yiibai.userMaper.getUser", 1);
  39. System.out.println("username: "+user.getUsername()+",");
  40. List<Post> posts = user.getPosts();
  41. for(Post p : posts) {
  42. System.out.println("Title:" + p.getTitle());
  43. System.out.println("Content:" + p.getContent());
  44. }
  45. } finally {
  46. session.close();
  47. }
  48. }
  49.  
  50. }

输出结果如下:

  1. username: yiibai,
  2. Title:MyBatis关联数据查询
  3. Content:在实际项目中,经常使用关联表的查询,比如:多对一,一对多等。这些查询是如何处理的呢,这一讲就讲这个问题。我们首先创建一个 post 表,并初始化数据.
  4. Title:MyBatis开发环境搭建
  5. Content:为了方便学习,这里直接建立java 工程,但一般都是开发 Web 项目。

附工程目录结构图如下:

Mybatis表关联一对多的更多相关文章

  1. Mybatis表关联一对多、多对一、多对多

    项目工程结构如下: 1. 搭建MyBatis框架环境 首先需要引入两个包:mybatis.jar 和 sqljdbc42.jar包 若分页需要导入两个包:pagehelper-5.1.0.jar 和 ...

  2. 后盾网lavarel视频项目---lavarel多表关联一对多操作实例

    后盾网lavarel视频项目---lavarel多表关联一对多操作实例 一.总结 一句话总结: 1.一对多中多那个部分的数据前端通过json弄到服务器 2.所有通过一操作多的时候,都要用上模型中定义的 ...

  3. Mybatis表关联多对一

    在上章的 一对多 中,我们已经学习如何在 Mybatis 中关联多表,但在实际项目中也是经常使用 多对一 的情况,这些查询是如何处理的呢,在这一节中我们来学习它.多表映射的多对一关系要用到 mybit ...

  4. mybatis表关联彻底理解

    1.多张表关联 三张表,用户表,主播表,关注表. 查询用户已经关注的主播的信息,那就要三张表关联起来啊.分别left join联在一起,通过id相同的连接在一起.最后where查找出最终条件. < ...

  5. 20.Yii2.0框架多表关联一对多查询之hasMany

    目录 新手模式 hasMany关联模式查询 新建mode层Article.php 新建mode层Category.php 新建控制器HomeController.php 新手模式 用上次的查询结果,作 ...

  6. Mybatis表关联多对多

    创建表 创建表对应的 JavaBean 对象 package com.tanlei.newer.model; import java.util.List; /** * @author:Mr.Tan * ...

  7. 21.Yii2.0框架多表关联一对多查询之性能优化--模型的使用

    控制器里 功能: 通过分类,查分类下的所有文章 //关联查询 public function actionRelatesearch(){ //关联查询 //查询方法一(查一行) 一维数组下的值是obj ...

  8. MyBatis实现关联表查询

    一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...

  9. MyBatis——实现关联表查询

    原文:http://www.cnblogs.com/xdp-gacl/p/4264440.html 一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创 ...

随机推荐

  1. npm WARN build `npm build` called with no arguments. Did you mean to `npm run-script build`?

    跑npm build结果如下: npm WARN build `npm build` called with no arguments. Did you mean to `npm run-script ...

  2. iOS开发之二维码扫描

    二维码扫描 01-导入系统库 02 新建继承自UIView的 LHQPreView 2.1导入系统库头文件 #import <AVFoundation/AVFoundation.h> 2. ...

  3. 【Java】Java复习笔记-第三部分

    修饰符abstract 抽象的,定义框架不去实现,可以修饰类和方法 abstract修饰类: 会使这个类成为一个抽象类,这个类将不能生成对象实例,但可以做为对象变量声明的类型,也就是编译时类型 抽象类 ...

  4. 对dump的文件进行状态统计

    1.jps -lvm  查出pid 2.jstack  pid >1.dump 3.grep java.lang.Thread.State 1.dump| awk '{print $2$3$4$ ...

  5. JAVA-JSP内置对象之request对象参数

    相关资料:<21天学通Java Web开发> request对象1.request对象不但可以用来设置和取得requset范围变量,还可以用来获得客户端请求参数请求的来源.表头.cooki ...

  6. 对象序列化为何要定义serialVersionUID的来龙去脉

    在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存.比如最常见的是Web服务器中的Session对象,当有10万用户并发访问,就有可能出现10万个Session对象 ...

  7. json数据在前端(javascript)和后端(php)转换

    学习目的:前后端数据交换   思路: json数据格式是怎么样? 后端各种语言怎么将自己内容转换成json格式的内容? 前端怎么接收json数据?有几种方式? js中怎么将json数据转换成js中的数 ...

  8. Thrift——栗子

    这张经典的图:黄色部分是用户实现的业务逻辑,褐色部分是根据Thrift定义的服务接口描述文件(IDL,接口定义语言)生成的客户端和服务端代码框架,红色部分是根据Thrift文件生成代码实现数据的读写操 ...

  9. 【Visual Studio】项目的引用显示黄色叹号

    情况一:个别引用的DLL显示黄色叹号. 通常是因为该DLL需要的.Net Framework版本与当前项目使用的版本不兼容.如该DLL需要的版本高于当前项目使用的版本.考虑修改项目的.Net Fram ...

  10. 【Unity Shader】三、漫反射Diffuse Shader例子

    学习目标: 漫反射Diffuse Shader,逐顶点计算和逐像素计算. 半兰伯特(HalfLambert)光照模型. 结合材质自身的色彩(Material Color)及环境光(Ambient). ...