第一章Mybatis 的动态 SQL 语句
Mybatis 的映射文件中,前面我们的 SQL 都是比较简单的,有些时候业务逻辑复杂时,我们的 SQL 是动态变化的,此时在前面的学习中我们的 SQL 就不能满足要求了。参考的官方文档,描述如下:

1.1 动态 SQL 之<if>标签
我们根据实体类的不同取值,使用不同的 SQL 语句来进行查询。比如在 id 如果不为空时可以根据 id 查询,如果 username 不同空时还要加入用户名作为条件。这种情况在我们的多条件组合查询中经常会碰到。
1.1.1持久层Dao接口

1.1.2持久层Dao映射配置

1.2.3测试

1.2动态SQL之<where>标签
为了简化上面 where 1=1 的条件拼装,我们可以采用<where>标签来简化开发。
1.2.1持久层 Dao 映射配置

1.3动态标签之<foreach>标签
1.3.1需求
传入多个 id 查询用户信息,用下边两个 sql 实现:
SELECT * FROM USERS WHERE username LIKE '%张%' AND (id =10 OR id =89 OR id=16)
SELECT * FROM USERS WHERE username LIKE '%张%' AND id IN (10,89,16)
这样我们在进行范围查询时,就要将一个集合中的值,作为参数动态添加进来。
这样我们将如何进行参数的传递?
1.3.1.1 在 QueryVo 中加入一个 List 集合用于封装参数

1.3.2持久层 Dao 接口

1.3.3 持久层 Dao 映射配置

<include>标签提取公共代码块

1.3.3.1 编写测试方法

1.4 Mybatis 中简化编写的 SQL 片段
Sql 中可将重复的 sql 提取出来,使用时用 include 引用即可,最终达到 sql 重用的目的。
1.4.1 定义代码片段

1.4.2 引用代码片段

第2章 Mybatis 多表查询之一对多
本次案例主要以最为简单的用户和账户的模型来分析 Mybatis 多表关系。用户为 User 表,账户为Account表。一个用户(User)可以有多个账户(Account)。具体关系如下:

2.1 一对一查询(多对一)
需求,查询所有账户信息,关联查询下单用户信息。
注意:因为一个账户信息只能供某个用户使用,所以从查询账户信息出发关联查询用户信息为一对一查询。如果从用户信息出发查询用户下的账户信息则为一对多查询,因为一个用户可以有多个账户。
2.1.1 方式一
2.1.1.1 定义账户信息的实体类

2.1.1.2 编写 Sql 语句

2.1.1.3 定义 AccountUser 类
为了能够封装上面 SQL 语句的查询结果,定义 AccountCustomer 类中要包含账户信息同时还要包含用户信息,所以我们要在定义 AccountUser 类时可以继承 User 类
注:作用就是把我们需要查询的信息放到一个类中

2.1.1.4 定义账户的持久层 Dao 接口

2.1.1.5 定义 AccountDao.xml 文件中的查询配置信息

2.1.1.6 创建 AccountTest 测试类


2.1.1.7小结
定义专门的 po 类作为输出类型,其中定义了 sql 查询结果集所有的字段。此方法较为简单,企业中使用普遍。
2.1.2方式二
使用 resultMap,定义专门的 resultMap 用于映射一对一查询结果。
通过面向对象的(has a)关系可以得知,我们可以在 Account 类中加入一个 User 类的对象来代表这个账户是哪个用户的。
2.1.2.1修改Account类
在Account类中国加入User类的对象作为Account类的一个属性

2.1.2.2修改AccountDao接口中的方法

2.1.2.3重新定义AccountDao.xml文件

3.2一对多查询
需求:查询所有用户信息及用户关联的账户信息。
分析:用户信息和他的账户信息为一对多关系,并且查询过程中如果用户没有账户信息,此时也要将用户信息查询出来,我们想到了左外连接查询比较合适。
3.2.1 编写 SQL 语句
SELECT u.*, acc.id id, acc.uid, acc.money FROM user u LEFT JOIN account acc ON u.id = acc.uid
3.2.2 User 类加入 List<Account>

3.2.3 用户持久层 Dao 接口中加入查询方法

3.2.4用户持久层 Dao 映射文件配置

3.2.5 测试方法
