闲话:
是XML语法。在CDATA内部的所有内容都会被解析器忽略。如果文本包含了很多的"<“字符 <=和”&"字符,就像是程序代码一样,那么最好把他们都放到CDATA部件中
实际开发过程中需要使用比较复杂的sql语句,但是自己通过字符串的拼接,比较容易出现错误,那么为了解决这些问题mybatis提供了动态sql。
什么是动态sql?
使用一些标签动态拼接sql语句,mybatis可以自动删除一些多余的字符(逗号、and关键字等)、添加一些必须的字符(空格等),预防sql语句出现错误。
就是java中的单分支语句if,用于条件判断。
常用属性:
test,用于比较判断,如果为真就执行if标签中的内容,否则不执行。
1、下面测试跟据传进去的字段,来排序。比如传入name那就根据name来排序
/*测试if标签*/
@Test
public void test2(){
List<Student> students = studentMapper.testIf("name");
for(Student stu : students){
System.out.println(stu);
}
}
2、StudentMapper.java
/*测试if*/
List<Student> testIf(String condition);
3、StudentMapper.xml
<select id="testIf" resultType="com.hbw.bean.Student">
select sid,sname from student
<if test="'name'.equals(condition)">
ORDER BY sname
if>
<if test="'id'.equals(condition)">
ORDER BY sid
if>
select>
Where动态标签可以自动添加或者删除where关键字本身,还可以删除多余的前缀
异常——org.apache.ibatis.binding.BindingException: Parameter ‘x’ not found. Available parameters are [arg1, arg0, param1, param2]
点击
1、下面测试:根据条件查询
/*测试where标签*/
@Test
public void test3(){
List<Student> studentList = studentMapper.testWhere("","com");
for(Student student : studentList){
System.out.println(student);
}
}
2、StudentMapper.java
/*测试where*/
List<Student> testWhere(@Param("aaa") String sname,@Param("bbb") String semail);
3、StudentMapper.xml
<select id="testWhere" resultMap="BaseResultMap">
select sid,sname,sage,ssex,semail from student
<where>
<if test="aaa!=null">sname like concat('%',#{aaa},'%')if>
<if test="bbb!=null">
if>
where>
select>
choose when otherwise相当于java中的switch case default可以用于做条件筛选,我们可以使用该动态标签替换if动态标签
1、测试:根据传入的参数,进行排序;如果没有传参数,就以默认的id进行降序排列
/*测试Choose标签*/
@Test
public void test4(){
List<Student> studentList = studentMapper.testChoose("");
for(Student student : studentList){
System.out.println(student);
}
}
2、StudentMapper.java
/*测试choose*/
List<Student> testChoose(String condition);
3、StudentMapper.xml
<select id="testChoose" resultMap="BaseResultMap">
select sid,sname,sage,ssex,semail from student
<choose>
<when test="'NAME'.equals(condition)">
order by sname asc
when>
<when test="'AGE'.equals(condition)">
order by sage desc
when>
<otherwise>
order by sid desc
otherwise>
choose>
select>
Set动态标签可以自动添加或者删除set关键字本身,同时还可以删除多余的后缀,比如逗号。
1、测试:修改指定id的数据
/*测试set标签*/
@Test
public void test5(){
Student student = new Student();
student.setSid(21);
student.setSname("测试test");
student.setSage(58);
student.setSsex("男");
student.setSemail("[email protected]");
studentMapper.testSet(student);
}
2、StudentMapper.java
/*测试test标签*/
void testSet(Student student);
3、StudentMapper.xml
<update id="testSet">
update student
<set>
<if test="sname!=null">
sname = #{sname},
if>
<if test="sage!=null">
sage = #{sage},
if>
<if test="ssex!=null">
ssex = #{ssex},
if>
<if test="semail!=null">
semail = #{semail},
if>
set>
where sid = #{sid}
update>
Trim动态标签可以自动添加或者删除前缀或者后缀,可以替换where和set动态标签。
属性:
Prefix:指定自动添加的前缀
prefixOverrides:指定自动删除的前缀
Suffix:指定自动添加的后缀
suffixOverrides:指定自动删除的后缀
1、测试:修改指定id的数据
/*测试trim标签*/
@Test
public void test6(){
Student student = new Student();
student.setSid(22);
student.setSname("测试trim");
student.setSage(17);
student.setSsex("男");
student.setSemail("[email protected]");
studentMapper.testTrim(student);
}
2、StudentMapper.java
/*测试trim标签*/
void testTrim(Student student);
3、StudentMapper.xml
<update id="testTrim">
update student
<trim prefix="set" suffixOverrides=",">
<if test="sname!=null">
sname = #{sname},
if>
<if test="sage!=null">
sage = #{sage},
if>
<if test="ssex!=null">
ssex = #{ssex},
if>
<if test="semail!=null">
semail = #{semail},
if>
trim>
where sid = #{sid}
update>
Foreach动态标签就相当于java中的for循环,用于在sql语句中迭代集合或者数组
属性:
collection:表示要迭代的集合或者数组,默认是根据类型来获取的,集合默认类型别名是list,数组默认别名是array
open:表示要拼接的sql语句的前半部分;
item:表示要迭代的集合或者数组中的每一个元素对应的变量名称(随便取);
serarator:表示迭代的集合或者数组中的每一个元素之间的分隔符;
close:表示要拼接的sql语句的后半部分
比如,现在我有如下数据:
我想使用foreach将其一 一查询出来
1、测试
/*测试foreach标签*/
@Test
public void test7(){
List<Integer> list = new ArrayList<>();
list.add(17);
list.add(18);
list.add(19);
list.add(20);
list.add(21);
list.add(22);
List<Student> studentList = studentMapper.setForeach(list);
for(Student student : studentList){
System.out.println(student);
}
}
2、StudentMapper.java
/*测试foreach*/
List<Student> setForeach(List<Integer> list);
3、StudentMapper.xml
<select id="setForeach" resultType="com.hbw.bean.Student">
select sid,sname,sage,ssex,semail from student
<where>
<foreach collection="list" open="sid in (" item="aaa" separator="," close=")">
#{aaa}
foreach>
where>
select>
Mybatis懒加载又称延迟加载或按需加载,即根据需要加载所需内容。前提:必须有嵌套查询。分类:全局懒加载、局部懒加载。
1)全局懒加载
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
settings>
2)局部懒加载
在collection标签或者association标签中提供了fetchType属性可以设置局部懒加载:
fetchType=lazy表示开启局部懒加载;
fetchType=eager 表示开启积极加载;
示例——https://blog.csdn.net/abc67509227/article/details/89564634
注意:局部懒加载优先级高于全局懒加载
数据库缓存:第一次读取数据时,将从数据库中读取的数据存储到缓存中,下次获取时,直接从缓存中获取即可。当执行增、删、改之后,缓存会被清空。 Mybatis缓存分为:一级缓存、二级缓存。
Mybatis默认开启一级缓存,缓存作用范围小,在一个sqlSession中,随着sqlSession创建而创建,结束而销毁。
Mybatis二级缓存策略,需要手动设置,缓存作用范围大,在一个mapper中:二级缓存随着sqlSessionFactory的创建而创建,结束而销毁。
<setting name="cacheEnabled" value="true"/>
<cache>cache>
注意:二级缓存中的数据是在一级缓存提交时存储的
见我另一篇博客
https://blog.csdn.net/Today_He/article/details/109661857
注解 | 作用 |
---|---|
@Insert | 同mapper.xml的 |
@Update | 同mapper.xml的 |
@Delete | 同mapper.xml的 |
@Select | 同mapper.xml的 |
@Results | 同mapper.xml的定义结果集映射 |
@Result | 同mapper.xml的定义字段与属性的映射 |
@One | 同mapper.xml的定义一对一关联查询 |
@Many | 同mapper.xml的 定义一对多关联查询 |
Mybatis(上)——简介、入门案例、主配置文件、映射配置文件、基于接口操作数据库、模糊查询、参数传递、执行原理
mybatis(中)——操作多表(一对一、一对多、多对多)