MyBatis基础:MyBatis关联查询(4)
1. MyBatis关联查询简介
MyBatis中级联分为3中:association、collection及discriminator。
◊ association:一对一关联
◊ collection:一对多关联
◊ discriminator:鉴别器,可以根据实际选择采用哪个类作为实例,允许根据特定的条件去关联不同的结果集。
2. 一对一关联查询
表结构设计:user、user_profile

2.1 方式一
<?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.libing.helloworld.dao.IUserProfileDao">
<resultMap id="baseResultMap" type="com.libing.helloworld.model.UserProfile">
<id property="id" column="profile_id" />
<result property="userId" column="user_id" />
<result property="name" column="name" />
<result property="phone" column="phone" />
<result property="email" column="email" />
<result property="address" column="address" />
<association property="user" javaType="com.libing.helloworld.model.User">
<id property="id" column="id"/>
<result property="userName" column="user_name" />
<result property="password" column="password" />
</association>
</resultMap> <select id="findById" resultMap="baseResultMap">
SELECT
u.id,
u.user_name,
u.`password`,
user_profile.id profile_id,
user_profile.user_id,
user_profile.`name`,
user_profile.phone,
user_profile.email,
user_profile.address
FROM
user_profile,
`user` u
WHERE
user_profile.user_id = u.id
AND user_profile.id = #{id}
</select>
</mapper>
DEBUG [main] - ==> Preparing: SELECT u.id, u.user_name, u.`password`, user_profile.id profile_id, user_profile.user_id, user_profile.`name`, user_profile.phone, user_profile.email, user_profile.address FROM user_profile, `user` u WHERE user_profile.user_id = u.id AND user_profile.id = ?
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - <== Total: 1
2.2 方式二
UserMapper.xml:
<?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.libing.helloworld.dao.IUserDao">
<resultMap id="baseResultMap" type="com.libing.helloworld.model.User">
<id property="id" column="id" />
<result property="userName" column="user_name" />
<result property="password" column="password" />
</resultMap> <select id="findById" resultMap="baseResultMap">
SELECT
id,
user_name,
password
FROM
user
WHERE id = #{id}
</select>
</mapper>
UserProfileMapper.xml:
<?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.libing.helloworld.dao.IUserProfileDao">
<resultMap id="baseResultMap" type="com.libing.helloworld.model.UserProfile">
<id property="id" column="id" />
<result property="userId" column="user_id" />
<result property="name" column="name" />
<result property="phone" column="phone" />
<result property="email" column="email" />
<result property="address" column="address" />
<association property="user" column="user_id" select="com.libing.helloworld.dao.IUserDao.findById" />
</resultMap> <select id="findById" resultMap="baseResultMap">
SELECT
id,
user_id,
name,
phone,
email,
address
FROM
user_profile
WHERE id = #{id}
</select>
</mapper>
UserProfileTest.java:
package com.libing.helloworld.test; import java.io.InputStream; import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.log4j.PropertyConfigurator;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test; import com.libing.helloworld.dao.IUserProfileDao;
import com.libing.helloworld.model.UserProfile; public class UserProfileTest { SqlSession sqlSession = null; @Before
public void init() {
PropertyConfigurator.configure(UserProfileTest.class.getClassLoader().getResourceAsStream("log4j.properties"));
String resource = "mybatis-config.xml";
InputStream inputStream = UserProfileTest.class.getClassLoader().getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
sqlSession = sqlSessionFactory.openSession();
} @Test
public void findById() {
try {
IUserProfileDao userProfileDao = sqlSession.getMapper(IUserProfileDao.class);
UserProfile userProfile = userProfileDao.findById(1); Assert.assertNotNull(userProfile);
} catch (Exception e) {
e.printStackTrace();
} finally {
sqlSession.close();
}
} }
运行执行的SQL语句:
DEBUG [main] - ==> Preparing: SELECT id, user_id, name, phone, email, address FROM user_profile WHERE id = ?
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - ====> Preparing: SELECT id, user_name, password FROM user WHERE id = ?
DEBUG [main] - ====> Parameters: 1(Integer)
DEBUG [main] - <==== Total: 1
DEBUG [main] - <== Total: 1
3. 一对多关联查询
表结构设计:user、task

3.1 方式一
3.2 方式二
package com.libing.helloworld.model;
import java.util.List;
public class User {
private int id;
private String userName;
private String password;
private List<Task> tasks;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public List<Task> getTasks() {
return tasks;
}
public void setTasks(List<Task> tasks) {
this.tasks = tasks;
}
}
User.java
package com.libing.helloworld.model;
public class Task {
private int id;
private int userId;
private String taskName;
private String content;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getTaskName() {
return taskName;
}
public void setTaskName(String taskName) {
this.taskName = taskName;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
Task.java
<?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.libing.helloworld.dao.ITaskDao">
<resultMap id="baseResultMap" type="com.libing.helloworld.model.Task">
<id property="id" column="id" />
<result property="userId" column="user_id" />
<result property="taskName" column="task_name" />
<result property="content" column="content" />
</resultMap> <select id="findTasksByUserId" resultMap="baseResultMap">
SELECT
id,
user_id,
task_name,
content
FROM
task
WHERE user_id = #{userId}
</select>
</mapper>
TaskMapper.xml
<?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.libing.helloworld.dao.IUserDao">
<resultMap id="baseResultMap" type="com.libing.helloworld.model.User">
<id property="id" column="id" />
<result property="userName" column="user_name" />
<result property="password" column="password" />
<collection property="tasks" column="id" select="com.libing.helloworld.dao.ITaskDao.findTasksByUserId"></collection>
</resultMap> <select id="findById" resultMap="baseResultMap">
SELECT
id,
user_name,
password
FROM
user
WHERE id = #{id}
</select>
</mapper>
@Test
public void findAll() {
try {
IUserDao userDao = sqlSession.getMapper(IUserDao.class);
User user = userDao.findById(1); Assert.assertNotNull(user);
} catch (Exception e) {
e.printStackTrace();
} finally {
sqlSession.close();
}
}
执行的SQL语句:
DEBUG [main] - ==> Preparing: SELECT id, user_name, password FROM user WHERE id = ?
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - ====> Preparing: SELECT id, user_id, task_name, content FROM task WHERE user_id = ?
DEBUG [main] - ====> Parameters: 1(Integer)
DEBUG [main] - <==== Total: 0
DEBUG [main] - <== Total: 1
4. N + 1问题
5. 延迟加载
MyBatis基础:MyBatis关联查询(4)的更多相关文章
- 三、mybatis多表关联查询和分布查询
前言 mybatis多表关联查询和懒查询,这篇文章通过一对一和一对多的实例来展示多表查询.不过需要掌握数据输出的这方面的知识.之前整理过了mybatis入门案例和mybatis数据输出,多表查询是在前 ...
- mybatis一对多关联查询+pagehelper->分页错误
mybatis一对多关联查询+pagehelper->分页错误. 现象: 网上其他人遇到的类似问题:https://segmentfault.com/q/1010000009692585 解决: ...
- JAVA入门[9]-mybatis多表关联查询
概要 本节要实现的是多表关联查询的简单demo.场景是根据id查询某商品分类信息,并展示该分类下的商品列表. 一.Mysql测试数据 新建表Category(商品分类)和Product(商品),并插入 ...
- mybatis一对多关联查询——(九)
1.需求: 查询所有订单信息及订单下的订单明细信息. 订单信息与订单明细为一对多关系. 2. sql语句 确定主查询表:订单表 确定关联查询表:订单明细表 在一对一查询基础上添加订单明细表关 ...
- 7.mybatis一对多关联查询
和第5节一对一查询类似,但是不同的是,一对一使用的是association,而一对多使用collection. 实例: 1个班级Class,对应1个老师Teacher,对应多个学生Student 1. ...
- 5.mybatis一对一表关联查询
方式一:嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集,封装联表查询的数据(去除重复的数据) SELECT * FROM class c,teacher t WHERE c.tid = t.t ...
- MyBatis:一对一关联查询
MyBatis从入门到放弃三:一对一关联查询 前言 简单来说在mybatis.xml中实现关联查询实在是有些麻烦,正是因为起框架本质是实现orm的半自动化. 那么mybatis实现一对一的关联查询则是 ...
- mybatis多表关联查询之resultMap单个对象
resultMap的n+1方式实现多表查询(多对一) 实体类 创建班级类(Clazz)和学生类(Student),并在Student中添加一个Clazz类型的属性,用于表示学生的班级信息. mappe ...
- MyBatis框架之关联查询
概述:关联查询主要在<resultMap>元素中,用<association>配置一对一.用<collection> 配置一对多 一.一对一查询 1.使 ...
- mybatis多对多关联查询
多对多关系 一个学生可以选多门课程,而一门课程可以由多个学生选择,这就是一个典型的多对多关联关系.所谓多对多关系,其实是由两个互反的一对多关系组成.即多对多关系都会通过一个中间表来建立,例如选课表.学 ...
随机推荐
- SpringBoot 整合 apollo
简介 Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流程治理等特性,适用于微服务配置管理场景 ...
- 【eclipse】eclipse报错:the resource is not on the build path of a java project
最近在eclipse中,使用svn导入svn上的一个maven项目,但是导入后类的包并没有以源码包的方式显示,而是以普通文件包的方式显示出来,在对类进行F3等操作时就报错:“the resource ...
- Centos7.3安装和配置Mysql5.7
主要转自这篇文章:https://www.cnblogs.com/wishwzp/p/7113403.html 这篇文章已经讲的很详细,亲测可用,对于基本不懂linux的小白应该也能看得懂.只是没有修 ...
- JavaScript是如何工作的:编写自己的Web开发框架 + React及其虚拟DOM原理
这是专门探索 JavaScript 及其所构建的组件的系列文章的第 19 篇. 如果你错过了前面的章节,可以在这里找到它们: JavaScript 是如何工作的:引擎,运行时和调用堆栈的概述! Jav ...
- springboot之JdbcTemplate
springboot可以使用JdbcTemplate进行数据库访问,代码如下 添加pom文件 <parent> <groupId>org.springframework.boo ...
- Web前端 Web前端和Web后端的区分
一.绪论 1. 前台:呈现给用户的视觉和基本的操作. 后台:用户浏览网页时,我们看不见的后台数据跑动.后台包括前端.后端. 前端:对应我们写的html.css.javascript 等网页语言作用在前 ...
- CentOS7 分布式安装 Hadoop 2.8
1. 基本环境 1.1 操作系统 操作系统:CentOS7.3 1.2 三台虚拟机 172.20.20.100 master 172.20.20.101 slave1 172.20.20.102 sl ...
- 基于WanAndroid开放API实现的文章阅读APP
简介 基于WanAndroid开放API开发的技术文章阅读App.主要功能包括:首页.体系.项目.公众号.搜索.登录.收藏.夜间模式等. 用到的第三方框架 RxJava RxAndroid Retro ...
- Kotlin入门(33)运用扩展属性
进行App开发的时候,使用震动器要在AndroidManifest.xml中加上如下权限: <!-- 震动 --> <uses-permission android:name=&qu ...
- QT信号槽connect的第五个参数
用过QT的小伙伴都知道连接信号槽的connect方法,但是这个方法有第五个参数,一般都是用的默认的 connect(th,SIGNAL(started()),tmpmyobject,SLOT(show ...