Mybatis 总结及常见面试题
mybatis获取主键值
- id自增的数据库 :
useGeneratedKeys="true"
keyProperty=“id”
<insert id="addEmp" useGenerateKeys="true" keyProperty="id" databaseId="mysql">
insert into tb_employee()
</insert>
- 不支持id自增的数据库:
selectKey 标签
<insert id="addEmp" databaseId="oracle">
<!--
order: 两个值,before(之前)和after(之后),表示在什么之前或之后执行
resultType:返回值的数据类型
before运行顺序:
先运行selectKey查询id的sql,查出id值封装给JavaBean的id属性
在运行插入的sql,就可以取出id属性对应的值
after运行顺序:(了解),存在问题
先运行插入的sql(从序列中取出新值作为id)
再运行selectKey查询id的sql
-->
<selectKey keyProperty="id" order="BEFORE" resultType="Integer">
select emp_seq.nextval from dual
<!-- AFTER
select emp_seq.currval from dual
-->
</selectKey>
insert into employees(emp_id, last_name, email)
values (#{id}, #{lastName}, #{email})
<!-- AFTER
insert into employees(emp_id, last_name, email)
values (emp_seq.nextval, #{lastName}, #{email})
-->
</insert>
传参数
单个参数:不会做任何处理
#{参数} ,取出参数值
多个参数:会做特殊处理
多个参数会被封装成一个map
key:param1 … paramN,或者参数的索引
value: 传入的参数值
#{}是从map中获取指定的key的值
命名参数:明确指定封装参数时map的key @Param(“id”)
多个参数会被封装成一个map
key:使用@Param注解指定的值
value:参数值
#{指定的key} 取出对应的参数
POJO:
如果多个参数正好是业务逻辑的数据模型,可以直接使用pojo
#{属性名} 取出传入的pojo的属性值
Map :
如果多个参数不是业务模型中的数据,没有对应的pojo,不经常使用,为了方便,也可以传入map
#{key} 取出map中对应的值
TO:
如果多个参数不是业务模型中的数据,但经常要使用,可以编写一个TO(Transfer, Object) 数据传输对象
注意:
如果是Collection(List、Set)类型或者是数组,也会特殊处理;也会把传入的list或者数组封装在map中。
key:Collection(collection),如果是list还可以使用这个key(list)
取值:#{list[0]}
#{} 与 ${} 的区别
#{}:是以预编译的形式,将参数设置到sql语句中,PreparedStatement,防止sql注入
${}:取出的值直接拼接在sql语句中,会有安全问题
大多数情况是使用#{}
原生jdbc不支持占位符的地方就可以使用${}进行取值,比如分表、排序等,按照年份分表拆分
select * from ${
year}_salary where ....
select * from tb_employee order by ${name} ${
order}
resultType resultMap
association 一对一
<resultMap type="com.zhush.blog.entities.Employee" id="MyDifEmp">
<id column