Mybatis-Mapper配置(一)

SQL 映射文件的几个顶级元素(按照应被定义的顺序列出)

  1. cache – 该命名空间的缓存配置。
  2. cache-ref – 引用其它命名空间的缓存配置。
  3. resultMap – 描述如何从数据库结果集中加载对象,是最复杂也是最强大的元素。
  4. parameterMap – 老式风格的参数映射。此元素已被废弃,并可能在将来被移除!请使用行内参数映射。
  5. sql – 可被其它语句引用的可重用语句块。
  6. insert – 映射插入语句。
  7. update – 映射更新语句。
  8. delete – 映射删除语句。
  9. select – 映射查询语句。

select

1. select标签的属性

<select
  id="selectPerson"
  parameterType="int"
  parameterMap="deprecated"
  resultType="hashmap"
  resultMap="personResultMap"
  flushCache="false"
  useCache="true"
  timeout="10"
  fetchSize="256"
  statementType="PREPARED"
  resultSetType="FORWARD_ONLY">

insert、update、delete

1. 标签的基本属性

<insert
  id="insertAuthor"
  parameterType="domain.blog.Author"
  flushCache="true"
  statementType="PREPARED"
  keyProperty=""
  keyColumn=""
  useGeneratedKeys=""
  timeout="20">

2. MySQL支持主键自增

<!-- parameterType:参数类型,可以省略, 
	获取自增主键的值:
		mysql支持自增主键,自增主键值的获取,mybatis也是利用statement.getGenreatedKeys();
		useGeneratedKeys="true";使用自增主键获取主键值策略
		keyProperty;指定对应的主键属性,也就是mybatis获取到主键值以后,将这个值封装给javaBean的哪个属性
-->
<insert id="addEmp"
		parameterType="com.my.mybatis.bean.Employee"
		useGeneratedKeys="true" keyProperty="id" databaseId="mysql">
	insert into tbl_employee(last_name,email,gender) 
	values(#{lastName},#{email},#{gender})
</insert>

3. Oracle不支持主键自增

<!-- 
	获取非自增主键的值:
		Oracle不支持自增;Oracle使用序列来模拟自增;
		每次插入的数据的主键是从序列中拿到的值;如何获取到这个值;
-->
<insert id="addEmp" databaseId="oracle">

	<!-- 
		BEFORE运行顺序:
			先运行selectKey查询id的sql;查出id值封装给javaBean的id属性
			再运行插入的sql;就可以取出id属性对应的值
		AFTER运行顺序:
			先运行插入的sql(从序列中取出新值作为id);
			再运行selectKey查询id的sql;
	-->
	<selectKey keyProperty="id" order="BEFORE" resultType="Integer">
		<!-- 编写查询主键的sql语句 -->
		<!-- BEFORE-->
		select EMPLOYEES_SEQ.nextval from dual 
		
		<!-- AFTER:
		 select EMPLOYEES_SEQ.currval from dual -->
	</selectKey>
	
	<!-- 插入时的主键是从序列中拿到的 -->
	<!-- BEFORE:-->
	insert into employees(EMPLOYEE_ID,LAST_NAME,EMAIL) 
	values(#{id},#{lastName},#{email}) 
	
	<!-- AFTER:
	insert into employees(EMPLOYEE_ID,LAST_NAME,EMAIL) 
	values(employees_seq.nextval,#{lastName},#{email}) -->
</insert>

4. selectKey 元素的属性

参数

1. 单个参数:mybatis不会做特殊处理

  • #{参数名/任意名}:取出参数值

2. 多个参数:mybatis会做特殊处理

  • 多个参数会被封装成一个map
    • Key:param1...paramN,或者是参数的索引
    • Value:传入的参数值
    • #{ param1}就是从map中获取指定的key的值
  • 明确指定封装参数时map的key;@Param("指定的key ")
    • key:使用@Param注解指定的值
    • value:参数值
    • #{指定的key}取出对应的参数值

3. POJO参数:#{属性名}:取出传入的pojo的属性值

4. Map参数:#{key}:取出map中对应的值

5. #{}和${}的区别?

  • #{}:是以预编译的形式,将参数设置到sql语句中;PreparedStatement;防止sql注入
  • ${}:取出的值直接拼装在sql语句中;会有安全问题;原生jdbc不支持占位符的地方我们就可以使用${}进行取值
select * from tbl_employee order by ${f_name} ${order}

6. #{}可以规定参数的一些规则

  • javaType、 jdbcType、 mode(存储过程)、 numericScale、resultMap、 typeHandler、 jdbcTypeName
  • jdbcType通常需要在某种特定的条件下被设置:在我们数据为null的时候,有些数据库可能不能识别mybatis对null的默认处理。比如Oracle(报错JdbcType OTHER:无效的类型),因为mybatis对所有的null都映射的是原生Jdbc的OTHER类型,oracle不能正确处理
  • 由于全局配置中:jdbcTypeForNull=OTHER;oracle不支持;两种办法
    • #{email,jdbcType=NULL};
    • <setting name="jdbcTypeForNull" value="NULL"/>

自动映射

1. 如何映射?

  • 当自动映射查询结果时,MyBatis 会获取结果中返回的列名并在 Java 类中查找相同名字的属性(忽略大小写)。
  • 对于每一个结果映射,在 ResultSet 出现的列,如果没有设置手动映射,将被自动映射。在自动映射处理完毕后,再处理手动映射。
  • 通过在结果映射上设置autoMapping 属性来为指定的结果映射设置启用/禁用自动映射

2. 三种映射等级:<setting name="autoMappingBehavior" value="PARTIAL"/>

  • NONE - 禁用自动映射。仅对手动映射的属性进行映射。
  • PARTIAL - 对除在内部定义了嵌套结果映射(也就是连接的属性)以外的属性进行映射
  • FULL - 自动映射所有属性。

3. 映射等级默认是partial

  • 当对连接查询的结果使用 FULL 时,连接查询会在同一行中获取多个不同实体的数据,因此可能导致非预期的映射
  • 当查询出的多个对象有同一个字段属性时,比如id,可能造成将一个对象字段的值赋给了另一个对象字段

缓存

1. 缓存

<cache
  eviction="FIFO"
  flushInterval="60000"
  size="512"
  readOnly="true"/>

2. flushInterval(刷新间隔)属性

  • 可以被设置为任意的正整数
  • 设置的值应该是一个以毫秒为单位的合理时间量
  • 默认情况是不设置,也就是没有刷新间隔,缓存仅仅会在调用语句时刷新。

3. size(引用数目)属性

  • 可以被设置为任意正整数,要注意欲缓存对象的大小和运行环境中可用的内存资源
  • 默认值是 1024。

4. readOnly(只读)属性

  • 可以被设置为 true 或 false。
  • 只读的缓存会给所有调用者返回缓存对象的相同实例。 因此这些对象不能被修改。这就提供了可观的性能提升。
  • 可读写的缓存会(通过序列化)返回缓存对象的拷贝。 速度上会慢一些,但是更安全,因此默认值是 false。

5. eviction(清除策略)属性

  • LRU – 最近最少使用:移除最长时间不被使用的对象。
  • FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
  • SOFT – 软引用:基于垃圾回收器状态和软引用规则移除对象。
  • WEAK – 弱引用:更积极地基于垃圾收集器状态和弱引用规则移除对象。
  • 默认的清除策略是 LRU。

6. 引用其他命名空间的缓存配置

<cache-ref namespace="com.someone.application.data.SomeMapper"/>

7. 自定义缓存

  • <cache type="com.domain.something.MyCustomCache"/>
  • type 属性指定的类必须实现 org.apache.ibatis.cache.Cache 接口
  • MyBatis 已经支持在所有属性设置完毕之后,调用一个初始化方法。实现 org.apache.ibatis.builder.InitializingObject 接口

8. 一级缓存

  • 即本地缓存,作用域默认为sqlSession,当sqlSession flush或者close之后,该session中所有cache将被清空
  • 一级缓存不能被关闭,但可以调用clearCache()来清空缓存,或者改变缓存的作用域
  • 失效情况:
    • SqlSession不同
    • SqlSession相同,两次查询条件不同
    • SqlSession相同,两次查询之间执行过增删改
    • SqlSession相同,手动清了sqlSession的缓存

9. 二级缓存

  • 全局作用域缓存,基于namespace级别的缓存:一个namespace对应一个二级缓存,需要手动开启配置,在sqlSession关闭或者提交后才会生效
  • 工作机制
    • 一个会话,查询一条数据,这个数据就会被放在当前会话的一级缓存中
    • 如果会话关闭;一级缓存中的数据会被保存到二级缓存中;新的会话查询信息,就可以参照二级缓存中的内容
    • 不同namespace查出的数据会放在自己对应的缓存中(map) 
  • 如何配置?
  1. 全局二级缓存配置:<setting name="cacheEnabled" value="true"/>
  2. mapper.xml中配置使用二级缓存:<cache></cache>
  3. POJO需要实现序列化接口

10. 缓存相关设置

  • cacheEnabled设置二级缓存关闭开启,一级缓存一直可用不受影响
  • 每个select标签都有useCache控制是否使用二级缓存
  • 每个增删改标签的flushCache同时控制一级和二级缓存
  • sqlSession.clearCache()只是清除当前session的一级缓存
  • config中localCacheScope:本地缓存作用域;当前会话的所有数据保存在会话缓存中
    • SESSION:默认值
    • STATEMENT:可以禁用一级缓存
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值