Mybatis第三天

第一章Mybatis 的动态 SQL 语句

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

1.1 动态 SQL 之<if>标签

我们根据实体类的不同取值,使用不同的 SQL 语句来进行查询。比如在 id 如果不为空时可以根据 id 查询,如果 username 不同空时还要加入用户名作为条件。这种情况在我们的多条件组合查询中经常会碰到。

1.1.1持久层Dao接口

1.1.2持久层Dao映射配置

注意:标签的 test 属性中写的是对象的属性名,如果是包装类的对象要使用 OGNL 表达式的写法。另外要注意 where 1=1 的作用~!

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 映射配置

标签<foreach>用于遍历集合,它的属性:collection:代表要遍历的集合元素,注意编写时不要写#{}open:代表语句的开始部分close:代表结束部分item:代表遍历集合的每个元素,生成的变量名sperator:代表分隔符

<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 文件中的查询配置信息

注意:因为上面查询的结果中包含了账户信息同时还包含了用户信息,所以我们的返回值类型 returnType的值设置为 AccountUser 类型,这样就可以接收账户信息和用户信息了

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 映射文件配置

collection 部分定义了用户关联的账户信息。表示关联查询结果集。 property="accList": 关联查询的结果集存储在 User 对象的上哪个属性。 ofType="account": 指定关联查询的结果集中的对象类型即List中的对象类型。此处可以使用别名,也可以使用全限定名。

3.2.5 测试方法

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容