Mybatis 使用

一、mapper映射的几种方式
1、使用相对于类路径的资源引用
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
</mappers>

2、使用完全限定资源定位符(URL)
<mappers>
<mapper url="file:///var/mappers/AuthorMapper.xml"/>
</mappers>

3、使用映射器接口实现类的完全限定类名
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper"/>
</mappers>

4、将包内的映射器接口实现全部注册为映射器
<mappers>
<package name="org.mybatis.builder"/>
</mappers>

二、获取参数的两种方式
#{}
1、会将SQL语句中的参数转为'?',SQL语句会经过JDBC的PreparedStatement预编译成数据库的相对应的语句。
如:select * from user where id = #{id} ==> select * from user where id = ?
2、能够有效的防止SQL注入

${}
1、会将SQL语句转为字符串拼接的方式,不会进行预编译
如:select * from user where id = ${id} ==> select * from user where id = +id
2、存在SQL注入风险


三、参数传递(SQL语句中的参数个数)
1、单个参数
getUser(Integer id);
java代码中的参数名称与SQL语句中的参数名称可以不一样,如:
select * from user where id = #{dfdfd}

2、对个参数
getUser(Integer id, String username);
会将传进来的参数封装成map,
1个值会对应两个map项,如:id ==> {arg0:id的值},{param1:id的值}
那么username ==> {arg1:username的值},{param2:username的值}
select * from user where id = #{arg0} and username = #{param2} (不推荐这种方式,不利于SQL扩展)

select * from user where id = #{id} and username = #{username} (推荐)


四、常用OGNL表达式
e1 or e2
e1 and e2
e1 == e2, e1 eq e2
e1 != e2, e1 neq e2
e1 lt e2:小于
e1 gt e2:大于
e1 in e2
e1 not in e2
e1 + e2, e1 * e2, e1/e2, e1 - e2, e1%e2
!e,not e:非,求反
e.method(args)调用对象方法
e.property对象属性
e1[e2]按索引取值,list,array,map
@class@method(args)调用类的静态方法
@class@field调用类的静态字段值

五、缓存

参考:https://www.cnblogs.com/wuzhenzhao/p/11103043.html
一级缓存特性
1、默认开启,也可以关闭一级缓存localCacheScope=STATEMENT
2、作用域是SQLSession(默认),一次数据库操作会话
3、缓存默认实现类PerpetualCache,使用map进行存储,其key ==> hashcode + sqlid + sql + hashcode + environment的ID
4、查询完之后将结果集存储到一级缓存中
失效情况
1、 不同的SQLSession会使用不同的一级缓存
2、同一个SQLSession但查询语句不一样
3、同一个SQLSession在执行了增删改等操作后,针对同一条SQL查询的缓存回失效。
4、同一个SQLSession,查询语句一样,手动清除缓存

二级缓存特性
1、默认开启,但是没有实现。
2、作用域:基于全局范围,应用级别
3、缓存默认实现类PerpetualCache,也使用map进行存储,但是二级缓存根据不同的mapper命名空间多包涵了一层map
org.apache.ibatis.session.Configuration#cache
一层 key mapper命名空间 value:erpetualCache.map
二层 key ==> hashcode + sqlid + sql + hashcode + environment的ID value:SQL语句查询结果
4、事务提交后将结果集存储到二级缓存中
5、查询先从二级缓存中获取数据,在从一级缓存中获取
实现
1、全局配置文件中设置<setting name="cacheEnabled" value="true"/>
2、在需要用到二级缓存的映射文件中加上结点<cache></cache>,是基于mapper映射文件来实现的二级缓存,基于mapper映射文件的命名空间来存储
3、在需要使用到二级缓存的javabean中实现序列化接口Serializable
失效
1、同一个mapper文件中(同一个命名空间下)调用了增删改操作,会导致二级缓存失效。如果不想失效,可以将SQL的flushCache设置为false

—转载请注明出处
原文地址:https://www.cnblogs.com/landiss/p/14501303.html