MyBatis 中 #{}和${}的区别是什么
- #{}是预编译处理, ${}是字符串替换;
- Mybatis 在处理#{}时, 会将 sql 中的#{}替换为?号, 调用 PreparedStatement 的 set 方法来赋值;
- Mybatis 在处理${}时, 就是把${}替换成变量的值;
- 使用#{}可以有效的防止 SQL 注入, 提高系统安全性 。
Mybatis 中一级缓存与二级缓存
(1) MyBatis 的缓存分为一级缓存和 二级缓存 。
一级缓存是 SqlSession 级别的缓存, 默认开启 。
二级缓存是 NameSpace 级别(Mapper)的缓存, 多个 SqlSession 可以共享, 使用时需 要进行配置开启 。
(2) 缓存的查找顺序: 二级缓存 => 一级缓存 => 数据库
MyBatis 如何获取自动生成的(主)键值
在<insert>标签中使用 useGeneratedKeys 和 keyProperty 两个属性来获取自动生成的 主键值 。
示例:
<insert id=”insertname”usegeneratedkeys=”true”keyproperty=”id”>
insert into names (name) values (#{name})
</insert>
简述 Mybatis 的动态 SQL, 列出常用的 6 个标签及作用
动态 SQL 是 MyBatis 的强大特性之一 基于功能强大的 OGNL 表达式 。
动态 SQL 主要是来解决查询条件不确定的情况, 在程序运行期间, 根据提交的条件动态的完成查询
常用的标签:
- <if> : 进行条件的判断
- <where>: 在<if>判断后的 SQL 语句前面添加 WHERE 关键字, 并处理 SQL 语句开 始位置的 AND 或者 OR 的问题
- <trim>: 可以在 SQL 语句前后进行添加指定字符 或者去掉指定字符.
- <set>: 主要用于修改操作时出现的逗号问题
- <choose> <when> <otherwise>: 类似于 java 中的 switch 语句.在所有的条件中选 择其一
- <foreach>: 迭代操作
Mybatis 如何完成 MySQL 的批量操作
MyBatis 完成 MySQL 的批量操作主要是通过<foreach>标签来拼装相应的 SQL 语句 例如:
<insert** id="insertBatch" >
insert into tbl_employee(last_name,email,gender,d_id) values <foreach** collection="emps" item="curr_emp" separator=","**>
(#{curr_emp.lastName},#{curr_emp.email},#{curr_emp.gender},#{curr_emp.dept.id} )
</foreach>
</insert>