sql += " and a = " + a;
}
if(b != null)
{
sql += " and b = " + b;
}
…
问题:
1)Java代码中出现大量if,可读性和维护性比较差
2)拼接字符串容易出现错误
MyBatis的一个重要特性就是动态SQL,能通过条件动态生成SQL语句
动态SQL包含几种标签:
-
sql
-
if
-
where
-
set
-
trim
-
foreach
1.2.1 sql标签
可以通过sql标签提高sql代码的复用性
定义代码片段
select count(*)
使用代码片段
from t_user
1.2.2 if标签
进行条件判断,判断成功会把if内部SQL拼接到外部SQL中,否则不拼接
SQL语句
问题:直接使用if会出现多余的where和and、or等关键词
1.2.3 where标签
用于配置条件,会去掉多余的where、and、or关键词
select * from xx
SQL语句
1.2.4 set标签
用于配置update语句,用于去掉多余的,
update xx
列 = 值,
列 = 值,
…
where 条件
1.2.5 trim标签
可以删除或添加前缀和后缀,用来拼接SQL
<trim prefix=“添加前缀” suffix=“添加后缀” prefixOverride=“删除后缀”
suffixOverride=“删除后缀”>
…
用trim代替set
…
1.2.6 foreach标签
用于循环拼接SQL
<foreach collection=“集合参数名称” item=“变量名” open=“开始符号”
close=“结束符号” seprator=“分割符” index=“下标”>
#{变量名}
====================================================================
表之间有几种关联关系:
-
一对一 如:一个人有一个身份证
-
一对多 如:一个部门有多个员工
-
多对一 如:多个员工属于一个部门
-
多对多 如:一个学生可以选择多门课程,一门课程也有多个学生
在进行数据库查询时,会遇到多张表相互关联的情况,下面以书籍和类型为例,配置最常见的一对多关系。
MyBatis映射文件中,在ResultMap里可以配置关联关系
主要有两种标签来映射关联属性:
-
collection 配置集合类型的属性
-
association 配置单独对象的属性
collection和association的相关参数:
-
property 属性的名称
-
select 查询方法
-
javaType 属性的类型
-
ofType 如果属性是集合,集合中对象的类型
-
column 外键字段名
2.3.1 查询集合
配置一的一方,查询书籍类型时,能同时查询到该类型的所有书籍
1) 给类型添加书籍集合,这里需要使用collection
public class BookType {
private long id;
private String type;
//书籍的集合
private List books;
…
}
2) 书籍类型Mapper接口
public interface IBookTypeDAO {
/**
-
按id查书籍类型
-
@param typeId
-
@return
*/
BookType selectBookTypeById(int typeId);
}
3) 在Book映射接口中定义方法
/**
-
根据类型id查询所有书籍
-
@param typeId
-
@return
*/
List selectBooksByTypeId(int typeId);
4) BookType的映射文件
<collection property=“books” select=“com.blb.bookms.dao.IBookDAO.selectBooksByTypeId”
javaType=“java.util.List” ofType=“Book” column=“id”>
select * from tb_book_type where id = #{typeId}
这里使用的是子查询的机制,在查询书籍类型后,将每个类型id作为参数,调用书籍接口的selectBooksByTypeId方法查询书籍集合。
2.3.2 查询单个对象
配置多的一方,通过书籍查询到它所属的类型
- 给Book添加BookType属性
/**
- 书籍
*/
public class Book {
…
/书籍类型
private BookType bookType;
2)书籍映射文件中,使用association配置bookType属性
<association property=“bookType” javaType=“BookType”
select=“com.blb.bookms.dao.IBookTypeDAO.selectBookTypeById” column=“type_id”>
select * from tb_book where id = #{id}
====================================================================
问题:在查询书籍类型时,如果只需要类型名称,不需要该类的书籍,但还是把书籍查询出来,岂不浪费时间?
我们需要一种机制来优化查询
延迟加载也叫懒加载,需要数据时再启动查询,是MyBatis对数据库的优化机制。
给MyBatis添加配置