MyBatis映射文件2(不支持自增的数据库解决方案/参数处理[单参、多参、命名参数])

时间:2024-12-26 12:06:02

针对Oracle不支持自增的解决方案

Oracle不支持自增,但是它使用序列来模拟自增,每次插入数据的主键是从序列中拿到的值,那么如何获取这个值呢?

<insert id="addEmp" databaseId="oracle">
<selectKey keyProperty="id" order="BEFORE" resultType="Integer">
select EMPLOYEE_SEQ.nextval from dual
</selectKey>
insert into tb_employee(EMPLOYEE_ID,last_name,email,gender)
values(#{id},#{lastName},#{email},#{gender})
</insert>

还有另外一种After版本

<insert id="addEmp" databaseId="oracle">
<selectKey keyProperty="id" order="AFTER" resultType="Integer">
select EMPLOYEE_SEQ.currval from dual
</selectKey>
insert into tb_employee(EMPLOYEE_ID,last_name,email,gender)
values(EMPLOYEE_SEQ.nextval,#{lastName},#{email},#{gender})
</insert>

参数处理

通过上面的几个例子,参数处理的直观感受就是拿#{}这个结构,在中间填写属性名。当然,Mybatis的参数处理还有很多,这里我们一一介绍一下:

①单个参数

#{参数名}:取出参数。

其实单个参数的传入,我们可以不按规定随意填写这个参数名,如下例子:

Employee getEmpById(Integer id);

<select id="getEmpById" resultType="com.figsprite.bean.Employee">
select id,last_name lastName,gender,email from tb_employee where id = #{ helloworld}
</select>

②多个参数

我们来做个尝试,先在接口中编写新的方法

    Employee getEmpByIdAndLastName(Integer id,String lastName);
  1. <select id="getEmpByIdAndLastName" resultType="com.figsprite.bean.Employee">  
  2.     select id,last_name lastName,gender,email from tb_employee where id = #{id} and last_name = #{lastName}  
  3. </select>  
  1. @Test  
  2.     public void test6()throws IOException{  
  3.         SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();  
  4.         SqlSession openSession = sqlSessionFactory.openSession();  
  5.         try{  
  6.             EmployeeMapper employeeMapper = openSession.getMapper(EmployeeMapper.class);  
  7.             Employee e = employeeMapper.getEmpByIdAndLastName(4,"Hello");  
  8.             System.out.println(e);  
  9.         }finally {  
  10.             openSession.close();  
  11.         }  
  12.     }  

此时,运行这个测试发现报错,

  1. ### Error querying database.  Cause: org.apache.ibatis.binding.BindingException: Parameter 'id' not found. Available parameters are [0, 1, param1, param2]  
  2. ### Cause: org.apache.ibatis.binding.BindingException: Parameter 'id' not found. Available parameters are [0, 1, param1, param2] 

采用的方法是Employee getEmpByIdAndLastName(Integer id,String lastName);

取值是:#{id},#{lastName},当我们传入多个参数Mybatis会将这些参数封装成map,#{}就是从map中获取指定key的值,这个和Java中的map概念类似,也是键值对,

Key:param1、param2……

Value:参数值

因此,我们更改#{}中的值

  1. <select id="getEmpByIdAndLastName" resultType="com.figsprite.bean.Employee">  
  2.     select id,last_name lastName,gender,email from tb_employee where id = #{param1} and last_name = #{param2}  
  3. </select>  

发现没有问题了,但是这种方式当然会让我们书写十分困难,当参数类型十分多的时候,这简直是场灾难,因此多个参数传入时,我们推荐使用命名参数。

③命名参数

我们只要在接口中的方法做一些小小的更改即可

Employee getEmpByIdAndLastName(@Param("id") Integer id,@Param("lastName") String lastName);

  1. <select id="getEmpByIdAndLastName" resultType="com.figsprite.bean.Employee">  
  2.     select id,last_name lastName,gender,email from tb_employee where id = #{id} and last_name = #{lastName}  
  3. </select>