Mybatis框架—SQL映射文件
1.SQL映射文件的几个顶级元素配置
-
mapper:映射文件的根元素节点,只有一个namespace属性,其作用是用于区分不同的mapper;绑定DAO接口,即面向接口编程,当namespace绑定某一接口后,可以不用写该接口的实现类,mybatis会通过接口的完整限定类名查找到对应的mapper配置来执行SQL语句。因此namespace的命名必须要跟接口同名
-
cache:配置给定命名空间的缓存
-
acahe-ref:从其他命名空间引用缓存配置
-
resultMap:用来描述数据库结果集和对象的对应关系
-
sql:可重用的SQL块,也可以被其他语句引用
-
insert:映射插入语句
<insert id="insertProvider" parameterType="com.accp.pojo.provider"> INSERT INTO `smbms_provider` (proCode,proName,proDesc) VALUES (#{proCode}, #{proName},#{proDesc}) </insert>
-
update:映射更新语句
<update id="updateProvider" parameterType="com.accp.pojo.provider"> UPDATE `smbms_provider` SET modifyDate=#{modifyDate},modifyBy=#{modifyBy} WHERE id=#{id} </update>
-
delete:映射删除语句
<delete id="deleteById" parameterType="com.accp.pojo.provider"> DELETE FROM `smbms_provider` WHERE id=#{id} </delete>
-
select:映射查询语句
<select id="selectBill" resultType="com.accp.pojo.bill"> SELECT b.*,p.* FROM smbms_bill b, smbms_provider p WHERE b.providerId=p.`id` AND b.providerId=#{providerId} AND b.`isPayment`=#{isPayment} AND b.productName like CONCAT ('%',#{productName},'%') </select>
2.resultType和resultMap的关联和区别
-
resultType表示返回类型,包括是基础数据类型和复杂数据类型
-
resultMap则是对应外部resultMap定义的引用,对应外部resultMap的id,表示返回结果映射到哪一个resultMap上
-
resultType和resultMap的关联: 在mybatis进行查询映射时候,其实查询出来的每个字段值都放在一个对应的Map中,其中键名是字段名,值则是其对应的值。当select元素提供返回类型属性是resultType的时候,mybatis会将Map里面的键值对取出赋给resultType所指定对象的对应属性(既调用对象里属性的set方法进行填充)。 当我们提供的返回类型是resultMap时候,因为Map不能很好的表示领域模型,所以就需要通过进一步的定义把它转化为对应的实体对象。 resultType和resultMap本质上是一样的,都是Map数据结构,但是这两者只能二选一
-
resultMap的自动映射级别:
- NONE:禁止自动匹配
- PARTIAL:(默认)自动匹配所有属性,有内部嵌套(association、collection)的除外
- FULL:自动匹配所有
<settings> <setting name="autoMappingBehavior" value="NONE"/> </settings>
3.使用@Param注解实现多参数入参
int deleteById(@Param("id") int id);
<delete id="deleteById" parameterType="com.accp.pojo.provider">
DELETE FROM `smbms_provider` WHERE id=#{id}
</delete>
4.使用resultMap实现高级结果映射
-
resultMap基本配置项
1.1.resultMap属性
- id:resultMap的唯一标识
- type:表示该resultMap的映射结果类型(通常是java实体类)
1.2.resultMap子节点属性
- id:一般对应数据库中该行的主键id,设置此项可以提升mybatis性能
- result:映射到JavaBean的某个“简单类型”属性,如基础类型、包装类
<resultMap type="com.accp.pojo.user" id="userMap"> <id property="id" column="id"></id> <result property="userCode" column="userCode"/> <result property="userName" column="userName"/> <result property="userPassword" column="userPassword"/> </resultMap>
-
association
2.1.association属性
- JavaType:完整地java类名或别名,若映射到JavaBean,则mybatis通常会自动检测到其类型;若映射到一个HashMap,则应明确指定JavaType,来确保所需行为。此处为com.accp.pojo.role
- property:映射数据库列的实体对象的属性,此处为在user里面定义的role属性
2.2.association子节点属性
- id
- result
- property:映射数据库列的实体对象的属性。此处为role属性
- column:数据库列名或别名
<resultMap type="com.accp.pojo.user" id="userMap"> <id property="id" column="id"></id> <result property="userCode" column="userCode"/> <result property="userName" column="userName"/> <result property="userPassword" column="userPassword"/> <association property="role" javaType="com.accp.pojo.role"> <id property="id" column="id"></id> <result property="roleCode" column="roleCode"/> <result property="roleName" column="roleName"/> </association> </resultMap>
-
collection
- ofType:完整的java类名或别名,即集合所包含的类型。此处为Address
- property:映射数据库列的实体对象的属性。此处为在User里定义的属性:addressList
private List<Address> addressList;
<resultMap type="com.accp.pojo.user" id="userMap"> <id property="id" column="id"></id> <result property="userCode" column="userCode"/> <result property="userName" column="userName"/> <result property="userPassword" column="userPassword"/> <collection property="addressList" ofType="address"> <id property="id" column="id"></id> <result property="tel" column="tel"/> <result property="postCode" column="postCode"/> </collection> </resultMap>
5.mybatis缓存
-
一级缓存:是基于mybatis自带的HashMap本地缓存,作用范围为session域内,当session调用flish()或close()方法后,该session中的所有缓存就会被清空
-
二级缓存:超出session范围之外,可以被所有sqlsession共享
-
二级缓存配置
(1)在mybatis-config.xml中设置
<settings> <setting name="cacheEnabled" value="true"/> </settings>
(2)在mapper.xml中设置缓存
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"></cache>
(3)在mapper文件配置支持cache后,如需对个别查询进行调整,可单独设置cache
<select id="selectBill" resultType="com.accp.pojo.bill" useCache="true"> ...... </select>