Java Mybatis 框架 VII 之 Mybatis 扩展

Java Mybatis 框架 VII 之 Mybatis 扩展

Mybatis 扩展

1.关于#{}和${}格式的占位符

● 在Mybatis中,配置SQL语句时,参数可以使用#{}或${}格式的占位符
● 例如存在需求:分页查询表中的所有数据。
● 需要执行的SQL语句大致是:

select * from ams_admin order by id limit ?, ?

● 则此功能的抽象方法应该是:

List<Admin> listPage(@Param("offset") Integer offset,
@Param("size") Integer size);

● 配置SQL语句:

<select id="listPage" resultMap="BaseResultMap">
select
<include refid="BaseQueryFields" />
from ams_admin
order by id
limit #{offset}, #{size}
</select>

● 执行测试:

@Test
public void testListPage() {
Integer offset = 0;
Integer size = 3;
List<Admin> adminList = adminMapper.listPage(offset, size);
System.out.println("查询到的记录数:" + adminList.size());
for (Admin admin : adminList) {
System.out.println(admin);
}
}

● 以上代码可以正常通过测试,并且观察结果也都是符合预期的,即使把
SQL语句中的#{}换成${}格式,也是完全没有问题的!

● 例如还存在需求:根据用户名查询此用户的详情
● 在“根据用户名查询用户详情”时,如果将username=#{username}换
成username=${username}会出现错误!

● 其实,使用#{}格式的占位符时,Mybatis在处理时会使用预编译的做法,
所以,在编写SQL语句时不必关心数据类型的问题(例如字符串值不需要
添加单引号),也不存在SQL注入的风险!这种占位符只能用于表示某个
值,而不能表示SQL语句片段!

● 当使用${}格式的占位符时,Mybatis在处理时会先将参数值代入到SQL语
句中,然后再执行编译相关过程,所以需要关心某些值的数据类型问题
(例如涉及字符串值时,需要在编写SQL语句时添加一对单引号框住字符
串),并且,存在SQL注入的风险!其优点是可以表示SQL语句中的任何
片段!

● 在一般情况下,应该尽可能的使用#{}格式的占位符,并不推荐使用 格式的占位符,即使它可以实现“泛用”的效果!●在一些特殊的情况下,如果一定要使用 {}格 式的占位符,即使它可以实现“泛用”的效果! ● 在一些特殊的情况下,如果一定要使用 格式的占位符,即使它可以实现泛用的效果!在一些特殊的情况下,如果一定要使用{}格式的占位符,必须考虑SQL注
入的风险,应该使用正则表达式或其它做法避免出现SQL注入问题!

2.Mybatis的缓存机制

缓存:通常是一个临时存储的数据,在未来的某个时间点可能会被删除

● 通常,存储缓存数据的位置是读写效率较高的,相比其它“非缓存”的数
据有更高的处理效率

● 由于缓存的数据通常并不是必须的,则需要额外消耗一定的存储空间,同
时由于从缓存获取数据的效率更高,所以是一种牺牲空间、换取时间的做

● 另外,你必须知道,从数据库读取数据的效率是非常低下的

● Mybatis有2种缓存机制,分别称之一级缓存和二级缓存

● 一级缓存是基于SqlSession的缓存,也称之为“会话缓存”
,仅当是同一个会话、同一个Mapper、同一个抽象方法(同一个SQL语句)、同样的参数值时有效,一级缓存在集成框架的应用中默认是开启的,且整个过程不由人为控制(如果是自行得到SqlSession后的操作,可自行清理一级缓存)

● 二级缓存默认是全局开启的,它是基于namespace的,所以也称之为
“namespace缓存”,需要在配置SQL语句的XML中添加节点,以表示当前XML中的所有查询都允许开通二级缓存,并且,在节点上配置useCache=“true”,则对应的节点的查询结果将被二级缓存处理,并且,此查询返回的结果的类型必须是实现了Serializable接口的,如果使用了配置如何封装查询结果,则必须使用节点来封装主键的映射,满足以上条件后,二级缓存将可用,只要是当前namespace中查询出来的结果,都会根据所执行的SQL语句及参数进行结果的缓存

● 无论是一级缓存还是二级缓存,只要数据发生了写操作(增、删、改),
缓存数据都将被自动清理

● 由于Mybatis的缓存清理机制过于死板,所以,一般在开发实践中并不怎
么使用!更多的是使用其它的缓存工具并自行制定缓存策略

我是将军;我一直都在,。!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值