栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

实例讲解Java的MyBatis框架对MySQL中数据的关联查询

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

实例讲解Java的MyBatis框架对MySQL中数据的关联查询

mybatis 提供了高级的关联查询功能,可以很方便地将数据库获取的结果集映射到定义的Java Bean 中。下面通过一个实例,来展示一下Mybatis对于常见的一对多和多对一关系复杂映射是怎样处理的。
设计一个简单的博客系统,一个用户可以开多个博客,在博客中可以发表文章,允许发表评论,可以为文章加标签。博客系统主要有以下几张表构成:
Author表:作者信息表,记录作者的信息,用户名和密码,邮箱等。
Blog表   :  博客表,一个作者可以开多个博客,即Author和Blog的关系是一对多。
Post表  : 文章记录表,记录文章发表时间,标题,正文等信息;一个博客下可以有很多篇文章,Blog 和Post的关系是一对多。
Comments表:文章评论表,记录文章的评论,一篇文章可以有很多个评论:Post和Comments的对应关系是一对多。
Tag表:标签表,表示文章的标签分类,一篇文章可以有多个标签,而一个标签可以应用到不同的文章上,所以Tag和Post的关系是多对多的关系;(Tag和Post的多对多关系通过Post_Tag表体现)
Post_Tag表: 记录 文章和标签的对应关系。

一般情况下,我们会根据每一张表的结构 创建与此相对应的JavaBean(或者Pojo),来完成对表的基本CRUD操作。

上述对单个表的JavaBean定义有时候不能满足业务上的需求。在业务上,一个Blog对象应该有其作者的信息和一个文章列表,如下图所示:

如果想得到这样的类的实例,则最起码要有一下几步:
1. 通过Blog 的id 到Blog表里查询Blog信息,将查询到的blogId 和title 赋到Blog对象内;
2. 根据查询到到blog信息中的authorId 去 Author表获取对应的author信息,获取Author对象,然后赋到Blog对象内;
3. 根据 blogId 去 Post表里查询 对应的 Post文章列表,将List对象赋到Blog对象中;
这样的话,在底层最起码调用三次查询语句,请看下列的代码:

 
public static BlogInfo ordinaryQueryonTest(String blogId) 
{ 
 BigDecimal id = new BigDecimal(blogId); 
 SqlSession session = sqlSessionFactory.openSession(); 
 BlogInfo blogInfo = new BlogInfo(); 
 //1.根据blogid 查询Blog对象,将值设置到blogInfo中 
 Blog blog = (Blog)session.selectOne("com.foo.bean.BlogMapper.selectByPrimaryKey",id); 
 blogInfo.setBlogId(blog.getBlogId()); 
 blogInfo.setTitle(blog.getTitle()); 
  
 //2.根据Blog中的authorId,进入数据库查询Author信息,将结果设置到blogInfo对象中 
 Author author = (Author)session.selectOne("com.foo.bean.AuthorMapper.selectByPrimaryKey",blog.getAuthorId()); 
 blogInfo.setAuthor(author); 
  
 //3.查询posts对象,设置进blogInfo中 
 List posts = session.selectList("com.foo.bean.PostMapper.selectByBlogId",blog.getBlogId()); 
 blogInfo.setPosts(posts); 
 //以JSON字符串的形式将对象打印出来 
 JSonObject object = new JSonObject(blogInfo); 
 System.out.println(object.toString()); 
 return blogInfo; 
} 

从上面的代码可以看出,想获取一个BlogInfo对象比较麻烦,总共要调用三次数据库查询,得到需要的信息,然后再组装BlogInfo对象。

嵌套语句查询
mybatis提供了一种机制,叫做嵌套语句查询,可以大大简化上述的操作,加入配置及代码如下:

 
  
  
  
  
  
  
 
 
 
 SELECT 
  B.BLOG_ID, 
  B.TITLE, 
  B.AUTHOR_ID AS BLOG_AUTHOR_ID, 
  A.AUTHOR_ID, 
  A.USER_NAME, 
  A.PASSWORD, 
  A.EMAIL, 
  A.BIOGRAPHY, 
  P.POST_ID, 
  P.BLOG_ID AS BLOG_POST_ID , 
 P.CREATE_TIME, 
  P.SUBJECT, 
  P.BODY, 
  P.DRAFT 
FROM BLOG B 
LEFT OUTER JOIN AUTHOR A 
 ON B.AUTHOR_ID = A.AUTHOR_ID 
LEFT OUTER JOIN POST P 
 ON P.BLOG_ID = B.BLOG_ID 
 

 
public static BlogInfo nestedResultonTest() 
{ 
 SqlSession session = sqlSessionFactory.openSession(); 
 BlogInfo blogInfo = new BlogInfo(); 
 blogInfo = (BlogInfo)session.selectOne("com.foo.bean.BlogMapper.queryAllBlogInfo"); 
 JSonObject object = new JSonObject(blogInfo); 
 System.out.println(object.toString()); 
 return blogInfo; 
} 

嵌套结果查询的执行步骤:
1.根据表的对应关系,进行join操作,获取到结果集;
2. 根据结果集的信息和BlogInfo 的resultMap定义信息,对返回的结果集在内存中进行组装、赋值,构造BlogInfo;
3. 返回构造出来的结果List 结果。
对于关联的结果查询,如果是多对一的关系,则通过形如 进行配置,Mybatis会通过column属性对应的author_id 值去从内存中取数据,并且封装成Author对象;
如果是一对多的关系,就如Blog和Post之间的关系,通过形如 进行配置,MyBatis通过 blog_Id去内存中取Post对象,封装成List
对于关联结果的查询,只需要查询数据库一次,然后对结果的整合和组装全部放在了内存中。
以上是通过查询Blog所有信息来演示了一对多和多对一的映射对象处理。

ps:自身关联映射示例:
实体类

public class Module { 
 
 private int id; 
 private String key; 
 private String name; 
 private Module parentModule; 
 private List childrenModules; 
 private String url; 
 private int sort; 
 private String show; 
 private String del; 
 
 public int getId() { 
  return id; 
 } 
 
 public void setId(int id) { 
  this.id = id; 
 } 
 
 public String getKey() { 
  return key; 
 } 
 
 public void setKey(String key) { 
  this.key = key; 
 } 
 
 public String getName() { 
  return name; 
 } 
 
 public void setName(String name) { 
  this.name = name; 
 } 
 
 public Module getParentModule() { 
  return parentModule; 
 } 
 
 public void setParentModule(Module parentModule) { 
  this.parentModule = parentModule; 
 } 
 
 public String getUrl() { 
  return url; 
 } 
 
 public void setUrl(String url) { 
  this.url = url; 
 } 
 
 public int getSort() { 
  return sort; 
 } 
 
 public void setSort(int sort) { 
  this.sort = sort; 
 } 
 
 public String getShow() { 
  return show; 
 } 
 
 public void setShow(String show) { 
  this.show = show; 
 } 
 
 public String getDel() { 
  return del; 
 } 
 
 public void setDel(String del) { 
  this.del = del; 
 } 
 
 public List getChildrenModules() { 
  return childrenModules; 
 } 
 
 public void setChildrenModules(List childrenModules) { 
  this.childrenModules = childrenModules; 
 } 
} 

XML代码:
 
 
  
   
   
   
   
   
   
   
   
   
   
   
   
   
   
  
  
  
  select * from tb_module where module_id = #{module_id} 
  
  
  
 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/149982.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号