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(String name, String note); |
映射器中的XML修改为无需定义参数类型
1 | <select id="test" resultType="String"> |
调用存储过程
1 | Statementtype=callable |