Mybatis接口绑定与动态SQL

红太狼 2022-02-03 14:57 296阅读 0赞

一、Mybatis接口绑定方法及多参数传递

1.作用:

  1. 实现创建一个接口后把mapper.xml生成接口的实现类,通过接口对象直接可以获取xml中的sql

2.实现方式:

  1. 定义一个接口,使得mapper.xml文件中的<mapper>标签中的namespace属性为接口的全限定名 sql语句标签的id和接口中的方法名相同。参数类型的parameterType可以不写,直接在方法中传递即可,参数取值时基本类型可以直接用\#\{0\}\#\{1\}取或param1,param2取。也可以在接口的形参前加@Param("sname")的形式,取值时直接用\#\{sname\}取。对于对象还是用\#\{属性名\}取值。详细见代码:
  2. package com.test.mapper;
  3. import java.util.List;
  4. import org.apache.ibatis.annotations.Param;
  5. import com.test.pojo.PageInfo;
  6. import com.test.pojo.Student;
  7. /**
  8. * @author QuLei
  9. *定义处理学生信息表的接口
  10. */
  11. public interface StudentMapper {
  12. List<Student> selePage(PageInfo pageInfo);
  13. long selCountByPageInfo(@Param("sname")String sname, @Param("tname")String tname);
  14. }
  15. <?xml version="1.0" encoding="UTF-8"?>
  16. <!DOCTYPE mapper
  17. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  18. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  19. <mapper namespace="com.test.mapper.StudentMapper">
  20. <select id="selePage" resultType="Student" >
  21. select * from student
  22. <where>
  23. <if test="sname != null and sname != ''">
  24. <bind name="sname" value="'%'+sname+'%'"/>
  25. name like #{sname}
  26. </if>
  27. <if test="tname!=null and tname !=''">
  28. <bind name="tname" value="'%'+tname+'%'"/>
  29. and tid in (select id from teacher where name like #{tname})
  30. </if>
  31. </where>
  32. limit #{startNum},#{pageSize}
  33. </select>
  34. <select id="selCountByPageInfo" resultType="long">
  35. select count(*) from student
  36. <where>
  37. <if test="sname != null and sname != ''">
  38. <bind name="sname" value="'%'+sname+'%'"/>
  39. name like #{sname}
  40. </if>
  41. <if test="tname!=null and tname !=''">
  42. <bind name="tname" value="'%'+tname+'%'"/>
  43. and tid in (select id from teacher where name like #{tname})
  44. </if>
  45. </where>
  46. </select>
  47. </mapper>

二、动态SQL

1.根据不同的条件要执行不同的SQL命令,称为动态SQL.

2.Mybatis中的动态sql标签:

  • if 加条件判断,如果条件为真则执行(注意:里面的提哦案件是直接判断 使用的是OGNL表达式 另外&& 和 ||要换成 and 和 or)如代码:

    1. <select id="selePage" resultType="Student" >
    2. select * from student
    3. <where>
    4. <if test="sname != null and sname != ''">
    5. <bind name="sname" value="'%'+sname+'%'"/>
    6. name like #{sname}
    7. </if>
    8. <if test="tname!=null and tname !=''">
    9. <bind name="tname" value="'%'+tname+'%'"/>
    10. and tid in (select id from teacher where name like #{tname})
    11. </if>
    12. </where>
    13. limit #{startNum},#{pageSize}
    14. </select>
  • choose (when, otherwise) 和java中的switch一样只执行一个官方解释为:(Sometimes we don’t want all of the conditionals to apply, instead we want to choose only one case among many options. Similar to a switch statement in Java, MyBatis offers a choose element.)实例代码:

  • where 一般会和 一起使用,如果结果中有内容就会自动加上where关键字,并且去掉第一个and用于条件部分。实例代码:

  • set 用于更新语句中在前面添加 set关键字,并且去掉结尾的”,” 实例代码:


    update Author

    username=#{username},
    password=#{password},
    email=#{email},
    bio=#{bio}

    where id=#{id}
  • trim 添加或删除 有在前面添加和在后面添加以及去掉多余的部分,在前面去掉和在后面去掉 有四个属性 prefix前面添加内容 prefixOverrides去掉前面多余的内容 suffix 尾部添加内容 suffixOverrides 去掉尾部多余的内容

  • foreach 用于遍历集合 collection属性要遍历的集合 item迭代变量,#{迭代变量}获取内容 open 循环左边添加的内容 close循环右边添加的内容 separator每次循环时,元素之间的分隔符 实例代码: 注意:可以将任何可迭代对象(如 List、Set 等)、Map 对象或者数组对象传递给 foreach 作为集合参数。当使用可迭代对象或者数组时,index 是当前迭代的次数,item 的值是本次迭代获取的元素。当使用 Map 对象(或者 Map.Entry 对象的集合)时,index 是键,item 是值。

  • bind 给某个值绑定上一些内容(一般用于模糊查询或处理数据库中存储的钱前面加上符号)两个属性 name 要绑定的变量(如果为基本类型要用@Param注解来绑定) value中拼接字符串 将值拼接成想要的形式 这里注意使用字符串拼接的形式具体实例代码:



    name like #{sname}
  • 某些SQL片段如果希望复用时,可以使用定义这个片段,然后在需要的地方引入即可 只需要 中的refid属性引用sql标签的id即可,见实例代码:

    1. id,accin,accout,money
  1. <select id="">
  2. select <include refid="mysql"></include>
  3. from log
  4. <select>

三、Mybatis缓存

1.一级缓存

是session级别的缓存

2.二级缓存

为sqlsessionFactory级别的缓存,二级缓存一般缓存访问量大,不易被修改的数据

发表评论

表情:
评论列表 (有 0 条评论,296人围观)

还没有评论,来说两句吧...

相关阅读

    相关 动态和静态

    为了支持c++的多态性,才用了动态绑定和静态绑定。理解他们的区别有助于更好的理解多态性,以及在编程的过程中避免犯错误,需要理解四个名词: 1、对象的静态类型:对象在声明时采