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

    针对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>  
  • 相关阅读:
    关于php中trim、ltrim和rtrim
    文件读取
    字典
    列表
    数据类型作业
    常用的数据类型
    字符串
    编码
    MVC 入门
    JavaScript 类型浅解
  • 原文地址:https://www.cnblogs.com/figsprite/p/10733970.html
Copyright © 2011-2022 走看看