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的运用的主要内容,如果未能解决你的问题,请参考以下文章