本文部分参考:https://blog.csdn.net/qq_34777858/article/details/79209392
http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html
翻了一下Mybatis官方文档,之前看得不是很懂的位置,现在看有种豁然开朗的感觉。看到嵌套查询,写了几个Demo,觉得不错,整理记录一下。
构造的三张表:
CREATE TABLE `admin` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) DEFAULT NULL,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
CREATE TABLE `company` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) DEFAULT NULL,
`company_name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
项目结构
需要说明的是构造了两个特殊的pojo。
UserCompany:
public class UserCompany extends User{
private Company company;
public Company getCompany() {
return company;
}
public void setCompany(Company company) {
this.company = company;
}
}
UserAdmin:
public class UserAdmin extends User{
private List<Admin> lstAdmin;
public List<Admin> getLstAdmin() {
return lstAdmin;
}
public void setLstAdmin(List<Admin> lstAdmin) {
this.lstAdmin = lstAdmin;
}
}
其中构造的user与admin是一对多,而user与company是一对一的关系。
<resultMap id="userResultMap" type="com.test.mybatis.pojo.User">
<!-- Mybatis中自动映射,将会把查询出来的列名自动映射到实体类中相同的变量名中 ,如下可不写将会自动映射-->
<!-- <id column="id" property="id" jdbcType="INTEGER" />
<result column="name" property="name" jdbcType="VARCHAR" /> -->
<result column="password" property="password" jdbcType="VARCHAR" />
</resultMap>
<select id="selectUserById" resultMap="userResultMap" parameterType="java.lang.Integer">
SELECT *
FROM user
WHERE id=#{id}
</select>
<!-- 嵌套的一对一查询,将一映射到一个变量中 -->
<resultMap id="companyResultMap" type="com.test.mybatis.pojo.Company">
<id column="company_id" property="id" jdbcType="INTEGER" />
<result column="user_id" property="userId" jdbcType="INTEGER" />
<result column="company_name" property="companyName" jdbcType="VARCHAR" />
</resultMap>
<resultMap id="userCompanyResultMap" type="com.test.mybatis.pojo.UserCompany" extends="BaseResultMap">
<!-- 如上, extends="BaseResultMap",将会继承一个resultMap,复用代码。如下代码可不写 -->
<!-- <id column="id" property="id" jdbcType="INTEGER" />
<result column="name" property="name" jdbcType="VARCHAR" />
<result column="password" property="password" jdbcType="VARCHAR" /> -->
<association property="company" javaType="com.test.mybatis.pojo.Company" resultMap="companyResultMap">
<!-- 如上resultMap="companyResultMap",如下代码可不写 -->
<!-- <id column="company_id" property="id" jdbcType="INTEGER" />
<result column="user_id" property="userId" jdbcType="INTEGER" />
<result column="company_name" property="companyName" jdbcType="VARCHAR" /> -->
</association>
</resultMap>
<select id="selectUserCompanyInfo" resultMap="userCompanyResultMap">
SELECT u.id,u.name ,u.password,
com.id AS company_id,com.user_id,
com.company_name
FROM user AS u
LEFT JOIN company AS com ON com.user_id=u.id
</select>
<!-- 集合的嵌套查询 ,一对多,将多映射到集合中-->
<resultMap id="userAdminResultMap" type="com.test.mybatis.pojo.UserAdmin" extends="BaseResultMap">
<!-- <id column="id" property="id" jdbcType="INTEGER" />
<result column="name" property="name" jdbcType="VARCHAR" />
<result column="password" property="password" jdbcType="VARCHAR" /> -->
<collection property="lstAdmin" ofType="com.test.mybatis.pojo.Admin">
<id column="admin_id" property="id" jdbcType="INTEGER" />
<result column="admin_name" property="name" jdbcType="VARCHAR" />
</collection>
</resultMap>
<select id="selectUserAdminInfo" resultMap="userAdminResultMap">
SELECT u.*,a.id AS
admin_id,a.name AS admin_name
FROM user AS u
LEFT JOIN admin AS a ON
u.id=a.user_id
</select>
测试代码:
User user = userDao.selectUserById(1);
System.out.println(user.getName());
List<UserCompany> selectUserCompanyInfo = userDao
.selectUserCompanyInfo();
for (Iterator<UserCompany> iterator = selectUserCompanyInfo.iterator(); iterator
.hasNext();) {
UserCompany userCompany = iterator.next();
System.out.println(userCompany.getCompany().getCompanyName());
}
List<UserAdmin> lstUserAdmin = userDao.selectUserAdminInfo();
for (Iterator<UserAdmin> iterator = lstUserAdmin.iterator(); iterator
.hasNext();) {
UserAdmin userAdmin = (UserAdmin) iterator.next();
System.out.println(userAdmin.getName());
List<Admin> lstAdmin = userAdmin.getLstAdmin();
for (Iterator<Admin> iterator2 = lstAdmin.iterator(); iterator2
.hasNext();) {
Admin admin = iterator2.next();
System.out.println(admin.getName());
}
}
发现经验越多代码量往往越少。