mybatis如何使用mybatis
Posted yanhui007
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis如何使用mybatis相关的知识,希望对你有一定的参考价值。
优点:
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的主要内容,如果未能解决你的问题,请参考以下文章