Mybatis实现连接查询和分段查询以及association和collection的运用

Posted 名字真的很急用

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis实现连接查询和分段查询以及association和collection的运用相关的知识,希望对你有一定的参考价值。

首先我们创建我们的数据库实现表与表之间的关系

    id  dept_name    
------  -------------
     1  开发部    
     2  市场部    
     3  客服部    
     4  xxxx部门   
     5  yyyyy部门  
     6  ttt部门    

这是我们数据库表中部门和员工信息,其中deptid作为外键连接表dept中的ID主键。

  id  name                       sex     email           deptid      ye  version  
------  -------------------------  ------  --------------  ------  ------  ---------
     1  张三                         女       qqq@qq.com           2     290          7
     2  tom                        女       tom@126.com          1     100          1
     3  jerry                      男       jerry@126.com        2     100          1
     4  张三                         女       张三@126.com           2     100          1
     6  李四                         男       lisi@126.com         1     100          1
     7  王五1                        男       lisi@126.com         3     100          1
     8  刘德华                        男       ldh@126.com          3     100          1
    10  李晓红                        女       lisi@126.com         3     100          1
    11  李晓红2                       女       lisi@126.com         1     100          1
    12  李晓红3                       女       lisi@126.com         2     100          1
    15  王璐璐                        男       wlulu@126.com        1     100          1
    16  王璐璐1                       男       wlulu@126.com        1     100          1
    17  刘亮亮1                       男       liull@126.com        1     100          1
    18  刘亮亮1                       男       liull@126.com        1     100          1
    19  刘亮亮8                       男       liull@126.com        1     100          1
    20  刘亮亮1                       男       liull@126.com        1     100          1
    21  刘亮亮1                       男       liull@126.com        1     100          1
    22  刘亮亮1                       男       liull@126.com        1     100          1
    23  刘亮亮1                       男       liull@126.com        1     100          1
    24  jim                        男       hehe@126.com         1     100          1
    25  jim222                     男       hehe@126.com         1     100          1
    26  jim333                     男       hehe@126.com         1     100          1
    27  jim444                     男       hehe@126.com         1     100          1
    28  李晓辉                        男       lxh@126.com          1     100          1
    29  jim333                     男       jim@126.com          1     100          1
    30  周润发                        男       zrf@126.com          1     100          1
    31  jim                        男       jim@126.com          1     100          1
    32  周润发                        男       zrf@126.com          1     100          1
    33  周润发                        男       zrf@126.com          1     100          1
    34  周润发                        男       zrf@126.com          1     100          1
    35  周润发                        男       zrf@126.com          1     100          1
    36  jim                        男       jim@126.com          1     100          1
    37  jim                        男       jim@126.com          1     100          1
    38  jim                        男       jim@126.com          1     100          1
    39  jim                        男       jim@126.com          1     100          1
    40  jim                        男       jim@126.com          1     100          1
    41  jim                        男       jim@126.com          1     100          1
    42  jim                        男       jim@126.com          1     100          1
    43  jim                        男       jim@126.com          1     100          1
    44  jim                        男       jim@126.com          1     100          1
    45  jim                        男       jim@126.com          1     100          1
    46  jim                        男       jim@126.com          1  (NULL)          1
    47  !¥#%……&%……¥                男       jim@126.com          1  (NULL)          1
    48  jim                        男       jim@126.com          1  (NULL)          1
    49  jim                        男       jim@126.com          1  (NULL)          1
    50  周润发                        男       jim@126.com          1  (NULL)          1
    51  jim                        男       jim@126.com          1  (NULL)          1
    52  jim                        男       jim@126.com          1  (NULL)          1
    53  jim                        男       jim@126.com          1  (NULL)          1
    54  周润发                        男       zrf@126.com          1  (NULL)          1
    55  周润发                        男       zrf@126.com          1  (NULL)          1
    56  周润发                        男       zrf@126.com          1  (NULL)          1
    57  jim                        男       jim@126.com          1  (NULL)          1
    58  jim                        男       jim@126.com          1  (NULL)          1
    59  jim                        男       jim@126.com          1  (NULL)          1
    60  周润发                        男       zrf@126.com          1  (NULL)          1
    61  周润发                        男       zrf@126.com          1  (NULL)          1
    62  周润发                        男       zrf@126.com          1  (NULL)          1
    63  周润发                        男       zrf@126.com          1  (NULL)          1
    64  周润发                        男       zrf@126.com          1  (NULL)          1
    65  周润发                        男       zrf@126.com          1  (NULL)          1
    66  周润发                        男       zrf@126.com          1  (NULL)          1

其二是我们mybatis_config.xml的配置文件,其中用到Setting配置信息来设置延迟加载。

<?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>
<settings>

<setting value="true" name="cacheEnabled"/>
<setting value="true" name="lazyLoadingEnabled"/>

<setting value="false" name="aggressiveLazyLoading"/>
<!--开启二级缓存-->


</settings>
  <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://localhost:3306/mybatisdb"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
      </dataSource>
    </environment>
   
  </environments>
  
   <mappers>
    
    <package name="com.mapper"/>
    </mappers>
</configuration>

第三是我们持久化对象的类,以及set,get方法。

package com.po;

public class UserInfo {
    private int id;
    private String uname;//实体类的属性名 和 表的字段名称 不一样
    private String sex;
    private String email;
    private int deptid;
    private Dept dept;
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public int getDeptid() {
        return deptid;
    }

    public void setDeptid(int deptid) {
        this.deptid = deptid;
    }

    public Dept getDept() {
        return dept;
    }

    public void setDept(Dept dept) {
        this.dept = dept;
    }

    @Override
    public String toString() {
        return "UserInfo{" +
                "id=" + id +
                ", uname='" + uname + '\\'' +
                ", sex='" + sex + '\\'' +
                ", email='" + email + '\\'' +
                ", deptid=" + deptid +
                ", dept=" + dept +
                '}';
    }
}
package com.po;

import java.util.List;

public class Dept {
    private  int id;
    private  String dept_name;
    private List<UserInfo> userinfo;
    
    public List<UserInfo> getUserinfo() {
		return userinfo;
	}

	public void setUserinfo(List<UserInfo> userinfo) {
		this.userinfo = userinfo;
	}

	public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getDept_name() {
        return dept_name;
    }

    public void setDept_name(String dept_name) {
        this.dept_name = dept_name;
    }

	@Override
	public String toString() {
		return "Dept [id=" + id + ", dept_name=" + dept_name + ", userinfo=" + userinfo + "]";
	}


    
    }

最后就是实现我们mapper映射的关系配置。

<?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.mapper.UserMapper">
    
    <select resultType="com.po.UserInfo" id="selectAllStudent"> select id,name as uname,sex,email,deptid from userinfo </select>
    
 <resultMap id="userinfomap1" type="com.po.UserInfo">

<id property="id" column="id"/>

<result property="uname" column="name"/>

<result property="sex" column="sex"/>

<result property="email" column="email"/>

<result property="deptid" column="deptid"/>

</resultMap>
<select resultType="com.po.UserInfo" id="selectAllStudent2" resultMap="userinfomap1"> select id,name ,sex,email,deptid from userinfo </select>


<resultMap id="userinfomap2" type="com.po.UserInfo">

<id property="id" column="id"/>

<result property="uname" column="name"/>

<result property="sex" column="sex"/>

<result property="email" column="email"/>

<result property="dept.id" column="did"/>

<result property="dept.dept_name" column="dname"/>

</resultMap>
<select id="selectUserAndDept" resultMap="userinfomap2"> SELECT u.*, d.id AS did, d.dept_name AS dname FROM userinfo u INNER JOIN dept d ON u.deptid=d.id </select>

<!--分段查询 -->



<resultMap id="userinfomap3" type="com.po.UserInfo">

<id property="id" column="id"/>

<result property="uname" column="name"/>

<result property="sex" column="sex"/>

<result property="email" column="email"/>

<association property="dept" column="deptid" select="com.mapper.DeptMapper.selectDeptById"> </association>

</resultMap>

<!-- 可以使用延迟加载(懒加载)(按需加载) 我们每次查询User对象的时候,都将一起查询出来 部门信息在我们使用的时候再去查询 分段查询的基础之上加上两个配置 <setting name="lazyLoadingEnabled" value="true"/> <setting name="aggressiveLazyLoading" value="false"/> -->


<select id="selectUserAndDeptSetp" resultMap="userinfomap3"> SELECT id ,name as uname, sex, email , deptid FROM userinfo </select>




<select resultType="com.po.UserInfo" id="getUserByDeptId"> select id,name as uname,sex,email,deptid from userinfo where deptid = #{id} </select>

</mapper>
<?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.mapper.DeptMapper">
<select resultType="com.po.Dept" id="selectDeptById">

select id,dept_name from dept where id=#{id}
</select>


<resultMap id="deptandusermap1" type="com.po.Dept">
<id column="did" property="id"/>
<result column="dname" property="dept_name"/>


<collection property="userInfo&#

以上是关于Mybatis实现连接查询和分段查询以及association和collection的运用的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis

MyBatis

MyBatis之级联小结

mybatis学习笔记(10)-一对一查询

Mybatis延迟加载的实现以及使用场景

Mybatis的模糊查询以及自动映射