Mybatis_映射文件配置

Posted Wayfo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis_映射文件配置相关的知识,希望对你有一定的参考价值。

获取自增主键的值

若数据库支持自动生成主键的字段(比如 mysql 和 SQL Server),则可以设置 useGeneratedKeys=”true”,然后再把 keyProperty 设置到目标属性上。

 <insert id="addEmp" useGeneratedKeys="true" keyProperty="id">
      insert into tbl_employee (last_name,email,gender)
        VALUES (#{lastName},#{email},#{gender})
    </insert>

sql语句执行完成后,Mybatis会把插入生成的主键封装到该bean对象中。

       //测试添加
           Employee employee = new Employee("[email protected]", "0", null, "tom");
           mapper.addEmp(employee);
           System.out.print(employee.getId());

参数处理

①.单个参数:mybatis不会做特殊处理,#{参数名/任意名}:取出参数值。

②.多个参数:mybatis会做特殊处理。多个参数会被封装成 一个map

key:param1...paramN,或者参数的索引也可以
value:传入的参数值

#{}就是从map中获取指定的key的值;

操作:

方法:public Employee getEmpByIdAndLastName(Integer id,String lastName);
取值:#{id},#{lastName}

异常:

org.apache.ibatis.binding.BindingException: 
Parameter ‘id‘ not found. 
Available parameters are [1, 0, param1, param2]

正确的取值方式:

 <select id="getEmpByIdAndLastName" resultType="com.nuch.edu.domain.Employee">
        SELECT * FROM tbl_employee
          WHERE id=#{param1} and last_name=#{param2}
    </select>

③.【命名参数】:明确指定封装参数时map的key

import org.apache.ibatis.annotations.Param;
public Employee getEmpByIdAndLastName(@Param("id")Integer id,@Param("lastName")String lastName);

多个参数会被封装成 一个map

key:使用@Param注解指定的值
value:参数值

#{指定的key}取出对应的参数值

<select id="getEmpByIdAndLastName" resultType="com.nuch.edu.domain.Employee">
        SELECT * FROM tbl_employee
          WHERE id=#{id} and last_name=#{lastName}
</select>

④.POJO:如果多个参数正好是我们业务逻辑的数据模型,我们就可以直接传入pojo;#{属性名}:取出传入的pojo的属性值

⑤.Map:如果多个参数不是业务模型中的数据,没有对应的pojo,不经常使用,为了方便,我们也可以传入map;#{key}:取出map中对应的值

 public  Employee getEmpByMap(Map<String,Object> map);
<select id="getEmpByMap" resultType="com.nuch.edu.domain.Employee">
        SELECT * FROM tbl_employee
          WHERE id=#{id} and last_name=#{lastName}
</select>
 Map<String,Object> map = new HashMap<>();
 map.put("id",3);
 map.put("lastName","jerry");
 Employee jerry = mapper.getEmpByMap(map);

⑥.TO:如果多个参数不是业务模型中的数据,但是经常要使用,推荐来编写一个TO(Transfer Object)数据传输对象

Page{
int index;
int size;
}

#{}和${}

 #{key}:获取参数的值,预编译到SQL中。安全。

 ${key}:获取参数的值,拼接到SQL中。有SQL注入问 题。原生jdbc不支持占位符的地方我们就可以使用${}进行取值。

有时我们只是想直接在 SQL 语句中插入一个不改变的字符串

ORDER BY ${columnName}

#{}更丰富的用法:

规定参数的一些规则:

javaType、 jdbcType、 mode(存储过程)、 numericScale、
resultMap、 typeHandler、 jdbcTypeName;

jdbcType通常需要在某种特定的条件下被设置:在我们数据为null的时候,有些数据库可能不能识别mybatis对null的默认处理。比如Oracle(报错);因为mybatis对所有的null都映射的是原生Jdbc的OTHER类型,oracle不能正确处理。
全局配置中默认:jdbcTypeForNull=OTHER;

1、#{email,jdbcType=NULL};
2、jdbcTypeForNull=NULL
<setting name="jdbcTypeForNull" value="NULL"/>

以上是关于Mybatis_映射文件配置的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis_映射文件配置

MyBatis查询mysql数据返回null

20180601_Eclipse自动生成mybatis映射文件

Mybatis配置文件

mybatis_配置文件详解

Mybatis 的基本要素—SQL 映射文件