MyBatis-映射文件

增删改见上篇博客

一、自增主键值的获取

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会做特殊处理
有上报错:绑定异常…由此我们可以得出,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传入参数
但是参数为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>

此时做查询测试:
使用Param注解指定参数的key
如果说是多个参数正好是我们业务逻辑的数据模型,我们直接将参数封装为对象,传入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>

查询得到预期效果
以map作为参数

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]}

总结: 当参数多时会封装为map,为了不混乱,我们可以使用@Param来指定封装时使用的key,#{key}就可以取出map中的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值