zoukankan      html  css  js  c++  java
  • 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("tom@nchu.com", "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"/>
  • 相关阅读:
    hibernate 建表一对一 就是一对多,多的一方外键唯一unique
    解除映射错误
    hibernate建表多对多建表
    一对多关系 操作小总结
    hibernate建表 一对多 多的一方控制一的一方
    hibernate的组成部分
    Spring cloud微服务安全实战-3-10API安全机制之授权
    Spring cloud微服务安全实战-3-9API安全机制之审计日志
    Spring cloud微服务安全实战-3-8API安全机制之Https
    Spring cloud微服务安全实战-3-7API安全机制之数据加密
  • 原文地址:https://www.cnblogs.com/realshijing/p/8057547.html
Copyright © 2011-2022 走看看