博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Mybatis联合查询
阅读量:6839 次
发布时间:2019-06-26

本文共 4158 字,大约阅读时间需要 13 分钟。

  hot3.png

案例

一个博客系统中,用户可以任意发表博文(Post),用户还可以对博文进行评论(Comment)。于是在这个系统中,存在以下的关系:

174535_QpRn_254689.png

在数据库中,Author,Post和Comment存在于不同的表中。但Comment会使用外键关联Post,而Post又会外键关联Author。

create table author (  id int primary key,  name varchar(20));create table post (  id int primary key,  authorId int,  title varchar(100),  created timestamp,  content text,  foreign key (authorId) REFERENCES author(id));create table comment (  id int primary key,  postId int,  content text,  created timestamp,  foreign key (postId) REFERENCES post(id));

在java类中,Author, Post和Comment分别对应的java类型为:

public class Post {  private int id;  private Author author;  private String title;  private String content;  private Timestamp created;  private List
 comments;  // getters and setters}public class Author {  private int id;  private String name;  // getters and setters}public class Comment {  private int id;  private int postId;  private String content;  private Timestamp created;  // getters and setters}

下面使用Mybatis的联合查询,创建一个Post实例,其中comments会自动填充到Post的comments表中。

联合查询

首先给出mybatis的配置:

   
    
        
        
        
    
    
        
            
            
                
                
                
                
                            
        
    

以及SessionManager工厂类:

public class SessionManager {	private static SqlSessionFactory sessionFactory;		public static synchronized SqlSessionFactory getSessionFactory() {		if (sessionFactory != null) return sessionFactory;				String resource = "com/lux/stat/dest/mybatis-conf.xml";		try {			sessionFactory = new SqlSessionFactoryBuilder().build(Resources					.getResourceAsReader(resource));		} catch (IOException e) {			e.printStackTrace();		}		return sessionFactory;	}}

还有BlogMapper接口:

public interface BlogMapper {    public Post getPostById(int id);    public List
 getPosts();}

最后是测试用main函数:

public class Test {    public static void main(String[] args) {        // initData();        SqlSession session = SessionManager.getSessionFactory().openSession();        BlogMapper mapper = session.getMapper(BlogMapper.class);        Post post = mapper.getPostById(1);		        System.out.println(post.getAuthor().getName());        System.out.println(post.getComments().size());        System.out.println(post.getComments().get(0).getContent());                List
 posts = mapper.getPosts();        post=posts.get(0);        System.out.println(post.getAuthor().getName());        System.out.println(post.getComments().size());        System.out.println(post.getComments().get(0).getContent());        session.close();    }}

Mybatis联合查询提供了两种方式

方式一,嵌套查询

BlogMapper.xml

  
    
    
      
     select id, authorId, title, content, created from post where id=#{param1}    
     select id, authorId, title, content, created from post    
    select id,  name from author where id=#{param1}    
    select id,  content, created, postId from comment where postId=#{param1}  

此类方式的缺点是效率低。组合最后的实例,必须要执行多条语句。像本例的getPosts()方法,如果posts数目为n,那么执行sql的条数应该为1+n+n。

方式二,JOIN语句

BlogMapper.xml

  
    
    
    
    
    
      
      
        
      
      
      
          
     select A.id, A.title, A.content, A.created,             B.id as authorId, B.name,             C.id as commentId, C.content as comment, C.created as commentCreated     from post A      join author B on A.authorid=B.id     join comment C on A.id = C.postId    
     select A.id, A.title, A.content, A.created,             B.id as authorId, B.name,             C.id as commentId, C.content as comment, C.created as commentCreated     from post A      join author B on A.authorid=B.id     join comment C on A.id = C.postId     where A.id=#{param1}  

使用此种方法,可以一条join语句便组装好post实例。

转载于:https://my.oschina.net/xpbug/blog/324710

你可能感兴趣的文章
html备份
查看>>
阿里曾鸣:全球最值钱的互联网公司都做对了什么?
查看>>
千万不要嫁给程序猿,我是认真的
查看>>
刚拿百度offer回来,分享一份刚出炉的百度Java面试真题详解
查看>>
C语言之基本运算及自动类型转换和强制类型转换
查看>>
docker私有仓库管理系统harbor的部署使用
查看>>
centos 编译安装gcc8.1
查看>>
ICS Protocol Dissection
查看>>
Linux的DHCP服务配置
查看>>
我的友情链接
查看>>
【挨踢人物传】李晨光:兴趣铸就专业,努力决定成败
查看>>
横向ListView
查看>>
mysql主从同步操作
查看>>
隐藏自己的进程
查看>>
全国省市数据
查看>>
判断文件夹大小并复制到另一个地方
查看>>
CISCO 路由器 HWIC-4ESW 配置案例
查看>>
1 张图秒懂 Nova 16 种操作 - 每天5分钟玩转 OpenStack(44)
查看>>
hostPath Volume - 每天5分钟玩转 Docker 容器技术(148)
查看>>
Liunx 终端 bash 提示符 修改 DIY
查看>>