一、自增主键值的获取
- MySQL支持自增主键,自增主键值的获取mybatis也是利用statement.getGenratedKeys()获取 *
<insert id="addEmp" parameterType="emp" useGeneratedKeys="true" keyProperty="id">
insert into tab1_employee(last_name,email,gender) values(#{lastName},#{email},#{gender})
</insert>
useGeneratedKeys=”true”:使用自增主键获取主键值策略
keyProperty=”id”:指定对应的主键属性,也就是mybatis获取到主键值以后,将这个值封装给JavaBean的哪个属性,此例中表明将自增主键的值交给id属性
使用以上属性时能获取到自增主键的值
如不使用时
二、参数处理
1.单个参数
对于单个参数时,mybatis不会做特殊处理,使用:#{参数名} 就可以取出其值,而不对单个参数时,大括号中的值无论写什么都不报错。
传入值为对应的属性字段
<select id="getEmpByTd" resultType="emp">
select * from tab1_employee where id = #{id}
</select>
传入的值为任意时获取到的结果一致,说明单个参数时对应的大括号中的值可任意取值
<select id="getEmpByTd" resultType="emp">
select * from tab1_employee where id = #{abcd}
</select>
2.多个参数
<select id="getEmpByIdAndLastName" resultType="emp">
select * from tab1_employee where id = #{id} and last_name=#{lastName}
</select>
有上报错:绑定异常…….由此我们可以得出,mybatis在针对多个参数时会做特殊处理。多个参数会被封装成一个map而此时的 key就是param1,param2…….paramN,或者参数的索引也可以 #{} 就是从map中获取指定的key的值,此时我们将传入的参数改为param1,param2,测试如下:
1.1使用param1,param2……..paramN作为参数传入sql语句中
<select id="getEmpByIdAndLastName" resultType="emp">
select * from tab1_employee where id = #{param1} and last_name=#{param2}
</select>
此时查询的数据达到目的
但是参数为param时,我们的sql语句看起来没有见名知意的意思了而且在参数很多的情况下很费事,所以我们还是想使用数据库对应的实体类的字段作为参数传入sql语句中,这样让他人也很容易看懂,因此还有如下一种方法。
1.2命名参数:明确指定封装参数时map的key
使用 @Param 明确指定传入sql语句的参数,此时的key就是param注解指定的值而value还是我们传入的参数值
public Employee getEmpByIdAndLastName(@Param("id") Integer id,@Param("lastName") String lastName);
<select id="getEmpByIdAndLastName" resultType="emp">
select * from tab1_employee where id = #{id} and last_name=#{lastName}
</select>
此时做查询测试:
如果说是多个参数正好是我们业务逻辑的数据模型,我们直接将参数封装为对象,传入sql语句中
1.3将多个参数以pojo的方式传入
#{属性名}:取出传入的pojo的属性值
如果多个参数组合不是数据模型中的数据,没有对应的pojo,为了方便我们可以传入map
1.4将多个参数以map的形式传入
public Employee getEmpByMap(Map<String, Object> map);
<select id="getEmpByMap" resultType="emp">
select * from tab1_employee where id = #{id} and last_name=#{lastName}
</select>
查询得到预期效果
1.5编写一个TO来作为参数
如果多个参数不是业务模型中的数据,但是经常使用,推荐来编写一个TO(Transfer Object)数据传输对象。
=========================================================
思考以下场景中参数如何取值
- 1.单个参数有@Param注解
public Employee getEmp(@Param("id") Integer id,String LastName); //取值:id=====》#{id/param1} lastName======》#{param2}
- 2.第二个参数以对象的方式传入
public Employee getEmp(Integer id,@Param("e")Employee employee); //取值:id===>#{param1} lastName===>#{param2.lastName/e.lastName}
- 3.特别注意,如果是Collection(List,Set)类型或者数组也会做特殊处理,也是把传入的list或者数组封装在map中
public Employee getEmpById(List<Integer> ids); //取值:取出第一个id值, #{list[0]}
- 2.第二个参数以对象的方式传入