Skip to content

动态SQL

常用的动态sql标签

<where>: 当所有条件为空时不生成where关键字 自动去除sql前面多余的 and 和 or

<set>: 一般用于update语句,与where相似 ,自动去除sql后面多余的

<if text="">: text属性是必须的,可以在里面调用方法,它的值是false或true 可以是多参数的其中一个参数,或者map参数的对应key 或者pojo类参数的属性 对他们进行判断是否是预期值 如:多参数传递 arg0 != ""

<trim>:增加或删除前后缀

属性解释
prefix加前缀
suffix加后缀
prefixOverrides去掉前缀
suffixOverrides去掉后缀

where | and | or

<foreach>:循环

属性解释
collection指定要循环的数组或集合
item数组或集合中的元素
separator循环之间的分割符
open整体开始时添加
close整体结束时添加

<sql>: 生明sql片段

<include>: 引入sql片段

开启驼峰命名自动映射:<setting name="mapUnderscoreToCamelCase" value="true"/>

结果集

<resultMap>:在数据库和java代码中如果字段名称不一致,那么就会导致数据无法正常映射到相对应的java代码上,所以需要手动的进行属性与字段之间的绑定,使用结果集那么所有的字段都要进行手动映射

xml
<mapper>
	......
    <!--  结果集定义  -->
    <resultMap id="唯一标识" type="返回类型" autoMapping="true">
        <id column="id" property="id"/>
        <result column="username" property="username"/>
        <result column="password" property="password"/>
    </resultMap>
    ......
</mapper>

结果集中主键必须使用<id>标签其余字段使用<result>标签

属性说明
autoMapping自动映射(像是一些字段名和属性名重复的可以开启来让其自动映射属性)
column数据库字段名
propertyjava对象属性名

调用结果集: <select resultMap="resultMap的id">

高级映射

表关系

txt
                  clazz                       
           班级号       班级名         
       --------------------------      
       |   1000     |    一班    |    
       |   1001     |    二班    |    
       --------------------------     

                          student
           姓名             年龄          班级号
        -------------------------------------------
        |    张三       |      18     |   1000     |
        |    李四       |      16     |   1001     |
        |    王五       |      17     |   1001     |
        |    赵六       |      18     |   1000     |
        -------------------------------------------

一对一(association)

txt
学生类(Student){
    姓名(string)name
    年龄(string)age
    班级(班级类)myClazz
}

写法一

xml
<resultMap id="Stu" type="Student">
   <result column="姓名" property="name"/>
   <result column="年龄" property="age"/>
   <association property="myClazz" javaType="Clazz">  //关联
        <id property="Cid" column="班级号"/>
        <result column="班级名" property="myClazz.Cname"/>
   </association>
</resultMap>

SQL:SELECT 姓名 年龄 班级号 班级名 FROM clazz LEFT JOIN student ON clazz.班级号=student.班级号 WHERE id=#{id}

写法二

xml
<resultMap id="Stu" type="Student">
   <result column="姓名" property="name"/>
   <result column="年龄" property="age"/>
   <association property="myClazz" javaType="Clazz" select="selectClazzByCid" column="班级号(多参数用逗号隔开)" fetchType="lazy"/>  
</resultMap>

<!-- sql -->
<select id="selectStudentById" resultMap="Stu">
    SELECT 姓名 年龄 班级号  FROM Student  WHERE id=#{id}
</select>
<select id="selectClazzByCid" resultType="Clazz">
    select 班级号 班级名 from Clazz where Cid=#{Cid}
</select>

fetchType:懒加载(lazy | eager)

property: 指的是对象属性的值

javaType:指的是对象的类型

一对多(collection)

txt
班级类(Clazz){
    班级号(Integer) Cid
    班级名(string)  Cname
    学生(学生类[])   students
}

property: 指的是集合属性的值

ofType:指的是集合中元素的类型

上面可以使用autoMapping

全局开启懒加载(延迟加载)<setting name="lazyLoadingEnabled" value="true"/>

缓存机制

这个机制可以相对应的节省一些性能,在一个地方需要相同数据的时候不需要去数据库重复的查询数据

一级缓存(默认开启)

一级缓存 SqlSession 中,每一个对象对应一个一级缓存

什么时候不走缓存?

​ SqLSession对象不是同一个,肯定不走缓存

​ 查询条件不一样,肯定也不走缓存

什么时候一级缓存失效?

  • 执行了sqLSession的clearCache()方法,这是手动清空缓存
  • 执行了INSERT或DELETE或UPDATE语句。不管你是操作哪张表的,都会清空一级缓存

二级缓存(默认关闭)

二级缓存 SqlSessionFactory 中,每一个对象对应一个二级缓存

需要在对应sqlMapper.XML文件添加<cache> 二级缓存的实体类对象必须是可序列化的 也就是必须实现可序列化接口 SalSession对象关闭或提交之后,一级缓存中的数据才会被写入到二级缓存当中。此时二级缓存才可用