mybatis(下)——<![CDATA[…]]>、动态sql语句详解、懒加载、缓存、逆向工程、纯注解操作数据库

闲话:

<![CDATA[跳过解析的语句]]> <![CDATA[ ]]> 是XML语法。在CDATA内部的所有内容都会被解析器忽略。

如果文本包含了很多的"<“字符 <=和”&"字符,就像是程序代码一样,那么最好把他们都放到CDATA部件中


Ⅰ、动态SQL

实际开发过程中需要使用比较复杂的sql语句,但是自己通过字符串的拼接,比较容易出现错误,那么为了解决这些问题mybatis提供了动态sql。

什么是动态sql?
使用一些标签动态拼接sql语句,mybatis可以自动删除一些多余的字符(逗号、and关键字等)、添加一些必须的字符(空格等),预防sql语句出现错误。

一、if标签

就是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动态标签可以自动添加或者删除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">
        <![CDATA[and semail like concat('%',#{bbb},'%')]]>
      </if>
    </where>
  </select>

三、Choose 标签

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动态标签可以自动添加或者删除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("123@qq.cmo");
        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标签

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("456@qq.cmo");
        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标签

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懒加载

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>

注意:二级缓存中的数据是在一级缓存提交时存储的

Ⅳ、mybatisgenerator逆向工程

见我另一篇博客
👉https://blog.csdn.net/Today_He/article/details/109661857👈

Ⅴ、mybatis纯注解操作数据库

注解作用
@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(中)——操作多表(一对一、一对多、多对多)

  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈年_H

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值