Mybatis多表查询

image.png

mybatis的连接池

我们在实际开发中都会用到连接池,因为他可以减少我们获取连接消耗的时间。

mybatis提供了三种配置数据库连接的方式:

  • 配置的位置:

    • SqlMapConfigDataSource标签,type属性就是说明采用何种方式连接
  • type的取值:

    • POOLED:采用传统的javax.sql.DataSource规范中的连接池,mybatis有针对规范的具体实现

    • UNPOOLED:采用传统的连接方式,虽然也实现了javax.sql.DataSource接口,但是没有用池的思想

    • JNDI:采用服务器的JNDI技术实现。不同服务器有不同实现。

      ​ 比如tomcat使用的是dbcp连接池

mybatis多表查询

1. 一对一(多对一)

因为多对一从多的一方来看,比如account,只能找到一个对应的user,因此在mybatis中把多对一视为一对一。

主要配置方面:

  • 实体类中添加关系映射
  • 映射配置文件中,添加结果集到封装的映射关系resultMap

以user-account为例,user和account是一对多,account对user是一对一。

这里先配置一对一。

1. 配置实体类

Account中添加user对象。

public class Account implements Serializable {
    private Integer id;
    private Integer uid;
    private Double money;
    private User user;
    
    //getter
    //setter

2. 配置映射配置文件

新建IAccountDao.xml,添加resultMap,其中主要添加了association标签配置映射到包含的pojo对象:


    
    
    
    
    
    
    
        
        
        
        
        
        
        
    


为方法添加合适的sql语句,返回结果的封装关系设置为accountMap


注意事项:

上面的column是对应你查出来的字段名称,然后注入到属性中,如果你用了as改名了,那么column也要改名,需要对应上

2. 一对多

同理,需要做两个事情。

  • 实体类中添加关系映射
  • 映射配置文件中,添加结果集到封装的映射关系resultMap

User类:添加List


public class User implements Serializable {
    private Integer id;
    private String name;
    private String address;
    private String sex;
    private Date birthday;
//注意:一对多时,‘一’这里添加的是List的‘多’集合
    private List accounts;

映射配置文件:

如果属性是一个集合的话,需要使用collection标签,ofType为集合存放的对象的全限定类名(这里用了别名),别的都一样


    
    
    
    
    
    
    
        
        
        
    



3. 多对多

新建表role,代表角色。一个用户有多个角色,一个角色可以属于多个用户,所以是多对多关系。

其实配置很简单。在数据库中需要一个中间表role_user,两个字段uid和rid:

image.png

在mybatis中只要配置两个一对多关系即可。

配置role-user的一对多

Role类添加List

public class Role implements Serializable {
    private Integer id;
    private String position;
    private String task;

    private List users;

IRoleDao.xml需要修改两个地方:

  1. IRoleDao.xml配置好映射关系:

    
    
    
    

    
        
        
        
        
        
        
    

  1. 修改select的sql语句,这个是关键,合并三张表查询出roleuser的字段。mybatis再利用映射关系给我们封装起来
   
   

测试:

//查询
@Test
public void testFindAll(){
    List roles=roleDao.findAll();
    for(Role role:roles){
        System.out.println(role);
        System.out.println(role.getUsers());
    }

}

有结果,可见封装成功了

Role{id=1, position='妻子', task='爱老公'}
[User{id=2, name='zyy', address='浙江省宁波市慈溪市', sex='女', birthday=Tue Dec 28 00:00:00 CST 1999}]
Role{id=2, position='老公', task='爱老婆'}
[User{id=1, name='cjc', address='上海市奉贤区南桥镇', sex='男', birthday=Mon Dec 28 00:00:00 CST 1998}]
Role{id=3, position='学生', task='好好学习'}
[User{id=1, name='cjc', address='上海市奉贤区南桥镇', sex='男', birthday=Mon Dec 28 00:00:00 CST 1998}, User{id=2, name='zyy', address='浙江省宁波市慈溪市', sex='女', birthday=Tue Dec 28 00:00:00 CST 1999}]
Role{id=4, position='职员', task='好好工作'}
[User{id=1, name='cjc', address='上海市奉贤区南桥镇', sex='男', birthday=Mon Dec 28 00:00:00 CST 1998}, User{id=2, name='zyy', address='浙江省宁波市慈溪市', sex='女', birthday=Tue Dec 28 00:00:00 CST 1999}]

同理,

配置user-role的一对多关系

直接给出代码,因为和上面的差不多,只要改sql语句、resultMap和User类即可。

User类

public class User implements Serializable {
    private Integer id;
    private String name;
    private String address;
    private String sex;
    private Date birthday;

    private List roles;

IUserDao.xml


    
    
    
    
    
    
    
        
        
        
    
    




结果

User{id=1, name='cjc', address='上海市奉贤区南桥镇', sex='男', birthday=Mon Dec 28 00:00:00 CST 1998}
[Role{id=2, position='老公', task='爱老婆'}, Role{id=3, position='学生', task='好好学习'}, Role{id=4, position='职员', task='好好工作'}]
User{id=2, name='zyy', address='浙江省宁波市慈溪市', sex='女', birthday=Tue Dec 28 00:00:00 CST 1999}
[Role{id=1, position='妻子', task='爱老公'}, Role{id=3, position='学生', task='好好学习'}, Role{id=4, position='职员', task='好好工作'}]
User{id=6, name='mybatis01', address='上海市徐汇区', sex='男', birthday=Sat Feb 01 00:00:00 CST 2020}
[]
User{id=7, name='mybatis02', address='上海市浦东新区', sex='女', birthday=Sat Feb 01 00:00:00 CST 2020}
[]
User{id=8, name='mybatis', address='??????', sex='?', birthday=Sat Feb 01 00:00:00 CST 2020}
[]
User{id=9, name='mybatis', address='??????', sex='?', birthday=Mon Feb 03 00:00:00 CST 2020}
[]
User{id=10, name='mybatis03', address='北京市顺义区', sex='男', birthday=Mon Feb 03 00:00:00 CST 2020}
[]

你可能感兴趣的:(Mybatis多表查询)