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中的值。

Author: Lelege
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source Lelege !
评论
 Previous
MyBatis-动态SQL MyBatis-动态SQL
一、简介&环境搭建1.1简介MyBatis最强大的特性之一就是它的动态SQL功能。 如果您有使用JDBC或任何类似框架的经验,您就会理解有条件地将SQL字符串连接在一起是多么痛苦,请确保不要忘记空格或忽略列列表末尾的逗号。处理动态S
2020-08-02
Next 
MyBatis-HelloWorld MyBatis-HelloWorld
一、下载MyBatisMyBatis将所有的项目托管到了github上,因此我们在github上搜索下载MyBatis下载 二、创建对应的数据库表和JavaBean类创建数据表: CREATE TABLE tab1_employee(
2020-08-02
  TOC