进阶
动态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代码上,所以需要手动的进行属性与字段之间的绑定,使用结果集那么所有的字段都要进行手动映射
<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 | 数据库字段名 |
property | java对象属性名 |
调用结果集:
<select resultMap="resultMap的id">
高级映射
表关系
clazz
班级号 班级名
--------------------------
| 1000 | 一班 |
| 1001 | 二班 |
--------------------------
student
姓名 年龄 班级号
-------------------------------------------
| 张三 | 18 | 1000 |
| 李四 | 16 | 1001 |
| 王五 | 17 | 1001 |
| 赵六 | 18 | 1000 |
-------------------------------------------
一对一(association)
学生类(Student){
姓名(string)name
年龄(string)age
班级(班级类)myClazz
}
写法一
<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=#
写法二
<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)
班级类(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对象关闭或提交之后,一级缓存中的数据才会被写入到二级缓存当中。此时二级缓存才可用