mybatis属性配置

mybatis用到的属性整理

命名空间

在大型项目中,可能存在大量的SQL语句,这时候为每个SQL语句起一个唯一的标识(ID)就变得并不容易了。为了解决这个问题,在MyBatis中,可以为每个映射文件起一个唯一的命名空间,这样定义在这个映射文件中的每个SQL语句就成了定义在这个命名空间中的一个ID。只要我们能够保证每个命名空间中这个ID是唯一的,即使在不同映射文件中的语句ID相同,也不会再产生冲突了。

防SQL注入

#{}是预编译处理、是占位符, ${}是字符串替换、是拼接符。Mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 来赋值;Mybatis 在处理${}时, 就是把${}替换成变量的值,调用 Statement 来赋值;#{} 的变量替换是在DBMS 中、变量替换后,#{} 对应的变量自动加上单引号 ${} 的变量替换是在 DBMS 外、变量替换后,${} 对应的变量不会加上单引号 使用#{}可以有效的防止 SQL 注入, 提高系统安全性。

一级缓存和二级缓存

一级指Session缓存。二级指mapper映射文件。

一级缓存的作用域是SQlSession, Mybatis默认开启一级缓存。 在同一个SqlSession中,执行相同的SQL查询时;第一次会去查询数据库,并写在缓存中,第二次会直接从缓存中取。 当执行SQL时候两次查询中间发生了增删改的操作,则SQLSession的缓存会被清空。 每次查询会先去缓存中找,如果找不到,再去数据库查询,然后把结果写到缓存中。 Mybatis的内部缓存使用一个HashMap,key为hashcode+statementId+sql语句。Value为查询出来的结果集映射成的java对象。 SqlSession执行insert、update、delete等操作commit后会清空该SQLSession缓存。

Mybatis默认是没有开启二级缓存的。 第一次调用mapper下的SQL去查询用户的信息,查询到的信息会存放在该mapper对应的二级缓存区域。 第二次调用namespace下的mapper映射文件中,相同的sql去查询用户信息,会去对应的二级缓存内取结果。

Mapper文件中包含的元素有:

cache – 配置给定命名空间的缓存。

cache-ref – 从其他命名空间引用缓存配置。

resultMap – 映射复杂的结果对象。

sql – 可以重用的 SQL 块,也可以被其他语句引用

传入多个参数

1、使用Map或者实体类传递参数

2、使用@Param注解

1
public List<String> test(@Param("name")String name, @Param("note")String note);

映射器中的XML修改为无需定义参数类型

1
2
3
4
<select id="test" resultType="String">
select id, name, note from t
where name like '%' || #{name} || '%' and note like '%' || #{note} || '%'
</select>

调用存储过程

1
2
Statementtype=callable
{call produce()}