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

mybatis目录

  • Ⅰ、动态SQL
    • 一、if标签
    • 二、where标签
    • 三、Choose 标签
    • 四、Set标签
    • 五、Trim标签
    • 六、Foreach标签
  • Ⅱ、mybatis懒加载
  • Ⅲ、缓存
    • 一级缓存
    • 二级缓存
  • Ⅳ、mybatisgenerator逆向工程
  • Ⅴ、mybatis纯注解操作数据库

闲话:

是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">
        
      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("[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标签

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标签

Foreach动态标签就相当于java中的for循环,用于在sql语句中迭代集合或者数组

属性:

collection:表示要迭代的集合或者数组,默认是根据类型来获取的,集合默认类型别名是list,数组默认别名是array
open:表示要拼接的sql语句的前半部分;
item:表示要迭代的集合或者数组中的每一个元素对应的变量名称(随便取);
serarator:表示迭代的集合或者数组中的每一个元素之间的分隔符;
close:表示要拼接的sql语句的后半部分

比如,现在我有如下数据:
mybatis(下)——<![CDATA[…]]>、动态sql语句详解、懒加载、缓存、逆向工程、纯注解操作数据库_第1张图片
我想使用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(中)——操作多表(一对一、一对多、多对多)

你可能感兴趣的:(mybatis,java,mybatis)