mybatis映射文件,获取自增主键的值,多个参数,命名参数的形式,参数处理#与$的区别

    技术2022-07-10  153

    <!--获取自增主键的值: mysql支持自增主键,自增主键的获取,mybatis也是利用statement.getGenreatedKeys() userGenerateKeys="true";使用自增主键获取主键值策略 keyProperty:指定对应的主键属性,也就是mybatis获取到主键值以后,将这个值封装给javaBean的哪个属性 --> <insert id="addEmp" useGeneratedKeys="true" keyProperty="id"> insert into tbl_employe values(#{id},#{lastName},#{gender},#{email})</insert>

    多个参数的形式

    多个参数会被封装成一个map,用key的索引param1,param2来替代

    <select id="getEmploybyprams" resultType="com.atguigu.mybatis.hello.Employe"> select id,last_name,gender,email from tbl_employe where id=#{param1} and last_name=#{param2} </select>

    命名参数:明确指定封装参数的map的key

    public Employe getEmploybyprams(@Param("id")Integer id,@Param("lastName")String lastName);

    pojo

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

    map:

    如果多个参数不是业务模型中的数据,没有对应的pojo,为了方便我们也可以传入map #key取出map中对应的值

    @Test public void test3() throws Exception{ SqlSession opSession=SqlSessionFactoryji(); try { EmployeMapper employeMapper=opSession.getMapper(EmployeMapper.class); Map<String,Object> map=new HashMap<String, Object>(); map.put("id", 1); map.put("lastName", "tom"); Employe employe=employeMapper.getEmploybyprams(map); System.out.println("wwwwwwwwwwww"); System.out.println(employe); } finally { opSession.close(); } } public Employe getEmploybyprams(Map<String, Object> map);

    TO:

    如果多个参数不是业务逻辑中的数据但是经常要用,推荐来编写一个TO(transfer Object)数据传输对象

    Page { int index; int size; }

    思考=====================================

    1.public Employe getEmp(@Param(“id”) Integer id,String lastName);
    取值:id==>#{param1} lastName===>#{param2}
    2.public Employe getEmp(Integer id,Employe emp);
    取值 :id==>#{param1} lastName===>{emp.lastName}

    ##特别注意:如果是Colllection(List、Set)类型或是数组。也会特殊处理,也是把传入的list或者数组封装在map中。key:Collection(collection),如果是List还可以使用这个key(list)数组(array)
    3.public Employe getEmpByid(List ids);
    取值:取出第一个id值:#{list[0]}

    ================================================================= DEBUG 07-01 19:34:34,807 ==> Preparing: select id,last_name,gender,email from tbl_employe where id=1 and last_name=? (BaseJdbcLogger.java:145) DEBUG 07-01 19:34:34,841 > Parameters: tom(String) (BaseJdbcLogger.java:145) DEBUG 07-01 19:34:34,868 < Total: 1 (BaseJdbcLogger.java:145)

    #{}:是以预编译的形式,将参数设置到sql语句中,PreparedStatement:防止sql注入

    ${}:取出的值直接拼装在sql语句中,会有安全问题;大多数情况下,我们选参数的值都应该去使用#{},

    原生jdbc不支持占位符的地方我们就可以使用${}进行取值

    比如分表,按照年份分表拆分:

    select * from ${year}_salary where xxx; select * from tbl_employe order by ${f_name} ${order} #{}:更丰富的用法; 规则参数的一些规则 javaType、jdbcType、mode(存储过程)、numericScale、 resultMap、typeHandler、jdbcTypeName、expression(未来准备支持的功能) jdbcType通常需要在某种特定的条件下被设置, 在我们数据为null的时候,有些数据可能不识别mybatis对null默认设置,比如Oracle(报错); JdbcType OTHER:因为mybatis对所有的null都映射的是原生jdbc的OTHER类型,oracle不能正确处理; 由于全局配置中:jdbcTypeForNull=OTHER;oracle不支持 1.#{email,jdbcType=OTHER}; 2.jdbcTypeForNull=OTHER在全局配置文件中配置<setting name="jdbcTypeForNull" value="NULL"></setting>
    Processed: 0.009, SQL: 9