码迷,mamicode.com
首页 > 其他好文 > 详细

mybatis(一)如何使用mybatis

时间:2020-03-30 21:47:17      阅读:93      评论:0      收藏:0      [点我收藏+]

标签:安全性   方法   namespace   动态代理   long   状态   aos   percent   获取   

优点:
1、mybatis使sql语句完全从代码中抽离到xml中,可以通过标签来动态拼接sql。
2、消除jdbc大部分冗余代码、api简单易懂、很好的与spring等中间件集成
缺点:
1、复杂的sql不如在java中灵活、调试也不如在java中的断点简单。
2、数据库支持不如hibernate

#{}和${}的区别是什么?
#{} 预编译
${}就是简单的占位符

resultMap和resultType
resultMap:resultMap中都是先转换成大写,然后进行映射

mapUnderscoreToCamelCase属性会自动将代码中的驼峰命名转换成数据库的_

	<settings>
		<setting name="mapUnderscoreToCamelCase" value="true" />
	</settings>

insert如何返回数据库生成的主键?
userGeneratedKeys设置为true,默认是false
keyProperty:返回的自增主键映射到哪个列

<insert id="insertSelective"  useGeneratedKeys="true" keyProperty="couponBatchId" parameterType="com.letv.shop.api.entry.CouponBatch" >
    insert into coupon_batch
    <trim prefix="(" suffix=")" suffixOverrides="," >
      <if test="couponBatchId != null" >
        coupon_batch_id,
      </if>
      <if test="couponBatchCode != null" >
        coupon_batch_code,
      </if>
      <if test
.
.
.
.
略

技术图片
另外注意:上图中,返回后获取id的时候,并不是result,而是直接映射到插入的实体上面了。
以上是数据库自增主键的获取id方法,如果主键不是自增的怎么获取?答案是通过selectKey,具体细节略。

从controller -- service -- dao -- xml,这个过程中dao -- xml是如何实现的?
答案是通过jdk动态代理,对dao方法进行拦截,由mybatis生成代理类,在代理类中实现了对数据库的操作。

sql语句还可以通过注解的方式声明在dao方法上面,缺点是sql发生变动需要重新编译,不建议使用。

@SelectProvider(type = PerfAchieveProjectDAOSqlProvider.class, method = "getPercentageListDetail")
    List<PerfAchieveProject> getPercentageListDetail(@Param("storeId") Long storeId, 
    		@Param("beginTime") String beginTime, 
    		@Param("endTime") String endTime,);

注解中有个特有的属性PerfAchieveProjectDAOSqlProvider,当sql较长的时候,可以抽离出来到这个类中,这里直接引用即可。

bind标签:屏蔽不同数据库差异

通过databaseId支持不同数据库连接。

缓存

mabatis支持一级缓存和二级缓存,一级缓存是session级别缓存,默认开启。

二级缓存
二级缓存是跨session级别的,默认也是开启。
二级缓存是实体级别的,哪个实体需要开启,就在哪个实体的xml中添加cache属性(也可以基于注解配置在dao上面)。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.letv.shop.api.dao.CouponMapper" >

	<cache/>

</mapper>

技术图片
上图为我们可以修改的二级缓存的属性。

eviction(回收策略):
支持四种:
1、LUR:默认为这个值,移除最长时间没被使用的对象
2、FIFO:按照对象进入缓存的顺序移除,先进先出
3、SOFT:移除基于垃圾回收器状态和软引用的对象
4、WEAK:移除基于垃圾回收器状态和弱引用的对象

flushInterval(刷新间隔)
单位毫秒、默认没有值即默认不会周期刷新,只有在执行更新语句时刷新

readOnlye
默认false,当有多个线程在缓存中读取同一个对象的时候,mybatis会对对象进行序列化复制一份给到线程,这样线程随便改,不会影响到其他线程,这样安全性低,实体类必须实现Serializable可序列化。
true 则和false相反逻辑

mybatis默认使用内存级别的map来作为二级缓存。
mybatis也支持使用其他框架来作为二级缓存。

ehcache做为二级缓存
1、添加依赖包
技术图片
2、配置ehcache
技术图片
3、
技术图片

redis做为二级缓存
1、添加依赖
技术图片
2、项目要配置好redis
3、
技术图片

关联表脏数据
二级缓存都是namespace级别的,所以不同实体对象的缓存是互相独立的。
当一条sql关联查询表A和B的时候,查询结果(包含A和B)缓存在A的独立空间内。然后单独更新B的值,A的独立空间内的B的最新属性没有同步更新,则出现脏数据。
解决方案:遇到A和B这种关联性较强的表时,将他们的缓存指定到同一个namespace上。
技术图片

二级缓存适合查询多的应用、适合单表操作为主的应用。

mybatis(一)如何使用mybatis

标签:安全性   方法   namespace   动态代理   long   状态   aos   percent   获取   

原文地址:https://www.cnblogs.com/yanhui007/p/12601012.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!