目录
SQL映射的XML文件
MyBatis 真正的强大在于映射语句,专注于SQL,功能强大,SQL映射的配置却是相当简单
SQL映射文件的几个顶级元素(按照定义的顺序)
mapper – namespace
cache – 配置给定命名空间的缓存
cache-ref – 从其他命名空间引用缓存配置
resultMap –用来描述数据库结果集和对象的对应关系
sql – 可以重用的SQL块,也可以被其他语句引用
insert – 映射插入语句
update – 映射更新语句
delete – 映射删除语句
select – 映射查询语句
mapper元素
namespace:命名空间
namespace和子元素的id联合保证唯一,区别不同的mapper
绑定DAO接口
namespace的命名必须跟某个接口同名
接口中的方法与映射文件中SQL语句id一一对应
<mapper namespace="cn.smbms.dao.user.UserMapper">
<select id="getUserList" …
……
</select>
</mapper>
select
select是MyBatis中最常用的元素之一
select语句有很多属性可以详细配置每一条语句
id
命名空间中唯一的标识符
接口中的方法与映射文件中的SQL语句id一一对应
parameterType
传入SQL语句的参数类型
resultType
SQL语句返回值类型的完整类名或别名
parameterType
基础数据类型
-
int、String、Date等
-
只能传入一个,通过#{参数名}即可获取传入的值
复杂数据类型
-
Java实体类、Map等
-
通过#{属性名}或者#{map的keyName}即可获取传入值
resultMap
描述如何将结果集映射到Java对象
<resultMap type="User" id="userList">
<result property="id" column="id"/>
<result property="userCode" column="userCode"/> //property="userCode"表示查询出来的属性对应的值赋给实体对象的哪个属性
//column="userCode"从数据库中查询的列名或者别名
<result property="userName" column="userName"/>
<result property="userRole" column=“userRole"/>
<result property="userRoleName" column="roleName"/>
</resultMap>
<select id="getUserList" resultMap="userList" parameterType="User"> //resultMap="userList"一个外部resultMap的id,表示返回结果映射到哪一个resultMap上
select u.*,r.roleName from smbms_user u,smbms_role r
where u.userName like CONCAT (‘%’,#{userName}, ‘%’)
and u.userRole = #{userRole} and u.userRole = r.id
</select>
resultType :直接表示返回类型
基本数据类型
复杂数据类型
resultMap :对外部resultMap的引用
应用场景:
数据库字段信息与对象属性不一致
复杂的联合查询,自由控制映射结果
二者不能同时存在,本质上都是Map数据结构
resultMap自动映射匹配前提:字段名与属性名一致
resultMap的自动映射级别-autoMappingBehavior
PARTIAL(默认):自动匹配所有
<settings>
<setting name="autoMappingBehavior" value="NONE"/> //NONE禁止自动匹配
</settings>
属性 | 描述 |
---|---|
id | 在命名空间中唯一的标识符,可以被用来引用这条语句 |
parameterType | 将会传入这条语句的参数类的完全限定名或别名 |
resultType | 从这条语句中返回的期望类型的类的完全限定名或别名。注意集合情形,那应该是集合可以包含的类型,而不能是集合本身。使用resultType或resultMap,但不能同时使用 |
resultMap | 命名引用外部的resultMap |
flushCache | 将其设置为true,不论语句什么时候被调用,都会导致缓存被清空。默认值:false |
useCache | 将其设置为true,将会导致本条语句的结果被缓存。默认值:true |
timeout | 这个设置驱动程序等待数据库返回请求结果,并抛出异常时间的最大等待值。默认不设置(驱动自行处理) |
fetchSize | 这是暗示驱动程序每次批量返回的结果行数 |
statementType | STATEMENT,PREPARED或CALLABLE的一种。让MyBatis选择使用Statement,PreparedStatement或CallableStatement。默认值:PREPARED |
resultSetType | FORWARD_ONLY|SCROLL_SENSITIVE|SCROLL_INSENSITIVE中的一种。默认是不设置(驱动自行处理) |
insert元素
<insert id="add" parameterType="User" >
insert into smbms_user (userCode,userName,userPassword)
values ( #{userCode},#{userName},#{userPassword})
</insert>
注意:insert、update、delete元素均没有resultType属性
update元素
<update id ="modify" parameterType="User">
update smbms_user set userCode = #{userCode},
userName = #{userName},
userPassword = #{userPassword} where id = #{id}
</update>
delete元素
<delete id ="deleteUserById" parameterType="int">
delete from smbms_user where id = #{id}
</delete>
resultMap
resultMap属性
id:resultMap的唯一标识
type:Java实体类
resultMap子元素
id
一般对应数据库中该行的主键id,设置此项可提高MyBatis性能
result
映射到JavaBean的某个“简单类型”属性
association
映射到JavaBean的某个“复杂类型”属性,比如JavaBean类
collection
映射到JavaBean的某个“复杂类型”属性,比如集合
association
复杂的类型关联,一对一
内部嵌套
-
映射一个嵌套JavaBean属性
属性
-
property:映射数据库列的实体对象的属性
-
javaType:完整Java类名或者别名
-
resultMap:引用外部resultMap
子元素
-
id
-
result
property:映射数据库列的实体对象的属性
column:数据库列名或者别名
collection
复杂类型集合,一对多
内部嵌套
-
映射一个嵌套结果集到一个列表
属性
-
property:映射数据库列的实体对象的属性
-
ofType:完整Java类名或者别名(集合所包括的类型)
-
resultMap:引用外部resultMap
子元素
-
id
-
result
property:映射数据库列的实体对象的属性
column:数据库列名或者别名
resultMap自动映射(autoMappingBehavior)的三个匹配级别
NONE
禁止自动匹配
PARTIAL(默认)
自动匹配所有属性,内部嵌套除外
FULL
自动匹配所有
缓存
MyBatis 提供了两种级别的缓存机制:
一级缓存(也称为本地缓存或会话缓存)和二级缓存(也称为全局缓存)。
这两种缓存有助于减少数据库访问次数,从而提高应用程序的性能。
MyBatis缓存
一级缓存
一级缓存是默认开启的,并且作用域是SqlSession级别。这意味着在同一个SqlSession中执行两次相同的查询时,第二次查询将直接从缓存中获取结果,而不是再次查询数据库。
特性:
默认开启。
作用于同一个SqlSession内。
当执行增删改操作或者手动清空缓存时,一级缓存会被清除。
缓存的数据以键值对的形式存储在内存中,其中键通常是缓存块的ID,而值则是查询的结果对象。
使用场景:
在同一个事务内多次查询相同的数据。
对性能要求较高,但数据不需要频繁更新的应用场景。
二级缓存
二级缓存是基于命名空间(namespace)级别的缓存,它的作用范围比一级缓存更广。如果多个SqlSession之间需要共享某些查询结果,那么可以启用二级缓存。
特性:
需要手动配置才能开启。
作用于同一个命名空间内的所有SqlSession。
可以通过设置
<cache>
标签来开启,并且可以自定义缓存策略。当执行增删改操作时,默认情况下不会自动清空二级缓存,除非显式地配置了刷新策略。
配置:
在映射文件中添加
<cache/>
标签来开启二级缓存。可以通过
<cache-ref namespace="otherNamespace"/>
来引用其他命名空间的缓存配置。使用场景:
数据不经常发生变化,但是读取频繁的情况。
多个用户可能同时请求相同的数据。
注意事项:
-
一级缓存是SqlSession级别的,当SqlSession关闭后,该缓存也就失效了。
-
二级缓存可以跨SqlSession共享,但如果涉及到大量并发写操作,则可能会导致缓存数据的一致性问题。
-
如果你的应用中存在高并发写操作,应该谨慎使用二级缓存,或者采取适当的缓存更新策略。
-
MyBatis的缓存机制虽然强大,但在实际使用中还需要结合具体的业务场景进行合理配置。对于特别复杂的缓存需求,可能需要考虑集成第三方缓存解决方案如Redis、Ehcache等。
二级缓存的配置
标签:语句,缓存,映射,resultMap,SQL,MyBatis,id,属性 From: https://blog.csdn.net/TuSi_Cat/article/details/143017757MyBatis的全局cache配置
在Mapper XML文件中设置缓存,默认情况下是没有开启缓存的
在Mapper XML文件配置支持cache后,如果需要对个别查询进行调整,可以单独设置cache