【MyBatis学习笔记】8:增删查改配置,结果集自动/自定义映射,主键回填/生成策略

映射器配置的组成

元素名称描述
select查询,返回查询到的结果集
insert插入,返回实际插入的行数
update更新,返回实际更新的行数
delete删除,返回实际删除的行数
sql定义一部分sql,可在别处引用

select元素

属性
属性名称描述默认值(如有)
id映射器接口中的方法名称
parameterType传入的参数类型,可以是基本类型/map/类名/别名
resultType结果集的类型,自动绑定JavaBean,不和resultMap同时使用
resultMap前面定义的resultMap的id引用,可自定义映射规则
flushCache是否在调用SQL后清空之前查询的本地缓存和二级缓存false
useCache是否要求将此次查询结果缓存(二级缓存)true
timeout超时的秒数,超时后会抛出异常在JDBC驱动里
fetchSize获取结果的总行数在JDBC驱动里
statementType使用哪个Statement工作,如STATEMENT(Statement)PREPARED(PreparedStatement)
resultSetTypeFORWARD_ONLY(游标向前访问),SCROLL_SENSITIVE(双向滚动,及时更新结果集),SCROLL_INSENSITIVE(双向滚动,不更新结果集)在JDBC驱动里
databaseId前面学的数据库厂商标识
resultOrdered是否包含了嵌套结果集或者分组false
resultSets多结果集时,列出执行SQL后每个结果集的名称,逗号分隔
自动映射

自动映射使用上面的resultType属性配置一下结果集类型即可。需要确保MyBatis配置文件中,settings配置下的autoMappingBehavior子配置不是NONE(默认就不是),就可以实现自动映射。

自动映射一般指的是数据库的列名和POJO对象的属性名一致,这时结果集的列就会直接映射到结果对象的属性上,对于不一致的地方也可以使用列名 AS 属性名来调整。

以上都是之前尝试过的,另外还可以在settings配置mapUnderscoreToCamelCasetrue,这样就能直接从下划线分割的数据库列名映射到驼峰式的POJO属性名。

自定义映射

自定义映射需要在映射配置文件中使用resultMap元素定义一个结果集,就像第五篇中那样使用就可以手动配置property(属性)到column(列)的映射关系。记得在select元素中使用resultMap属性去引用前面配置的resultMapid,并且去掉resultType属性。

insert元素

属性
属性名称描述默认值(如有)
id映射器接口中的方法名称
parameterType传入的参数类型,可以是基本类型/map/类名/别名
flushCache是否在调用SQL后清空之前查询的本地缓存和二级缓存false
timeout超时的秒数,超时后会抛出异常在JDBC驱动里
statementType使用哪个Statement工作,如STATEMENT(Statement)PREPARED(PreparedStatement)
keyProperty主键的列名(联合主键用逗号隔开),不能和keyColumn同用
keyColumn主键的列下标(联合主键用逗号隔开),不能和keyProperty同用
useGeneratedKeys主键回填或自定义规则,要使用这个属性就必须有keyProperty或keyColumnfalse
databaseId前面学的数据库厂商标识
关于主键回填

主键回填指的是当将useGeneratedKeys属性设置为true时,如果在DBMS里设置了自动生成主键,MyBatis在插入后会使用JDBC的getGeneratedKeys()方法来获取DBMS为插入的这行所生成的主键,并根据keyProperty或者keyColumn属性来回填到POJO对象的相应属性上。

主键回填使得在插入后能够获得这个主键,便于接下来的操作。

比如在图书上架时,刚向数据库里插入一本书,想要知道这本书的id是多少,主键回填会让持久化对象在插入后在主键属性上获得DBMS所生成的主键的值。

第六篇的基础上做些改动来测试:

    <!--开启主键回填,指明主键的那一列是名为id的列-->
    <insert id="addBook" parameterType="book" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO book (name, type_id, type_name)
        VALUES (#{name}, #{typeId,typeHandler=org.apache.ibatis.type.EnumOrdinalTypeHandler},
                #{typeName,typeHandler=org.apache.ibatis.type.EnumTypeHandler})
    </insert>

主函数中插入完输出一下这个POJO对象的id:

            Book book1=new Book();
            book1.setName("测试主键回填");
            book1.setTypeId(BookType.COMPUTER);
            book1.setTypeName(BookType.COMPUTER);
            bookMapper.addBook(book1);
            System.out.println("成功插入,DBMS为它生成的主键是"+book1.getId());

输出:
这里写图片描述

关于自定义生成主键规则

自定义主键生成规则是指当将useGeneratedKeys属性设置为true时,如果在DBMS里没有设置自动生成主键,可以为insert元素添加一个名为selectKey的子元素,将其order属性设为BEFORE后,就可以在真正执行插入前执行一次查询,并将结果填写到要插入的主键上。

这样就能够通过编写这个查询语句,来自定义主键的生成规则(如:从1开始每次取最大值加2)。在插入时,需要将主键一起插入,因为这时DBMS并没有自动生成主键,而是手动生成的。

还是在第六篇的例子上继续做修改:

    <!--开启自定义生成主键,指明主键的那一列是名为id的列-->
    <insert id="addBook" parameterType="book" useGeneratedKeys="true" keyProperty="id">
        <!--查询结果给id属性,查询结果是int类型,查询发生在真正执行插入之前-->
        <selectKey keyProperty="id" resultType="int" order="BEFORE">
            SELECT IF(MAX(id) is NULL,1,MAX(id)+2) FROM book
        </selectKey>
        INSERT INTO book (id,name, type_id, type_name)
        VALUES (#{id},#{name}, #{typeId,typeHandler=org.apache.ibatis.type.EnumOrdinalTypeHandler},
        #{typeName,typeHandler=org.apache.ibatis.type.EnumTypeHandler})
    </insert>

主函数中插入完输出一下这个POJO对象的id:

            Book book1=new Book();
            book1.setName("测试自定义主键生成策略");
            book1.setTypeId(BookType.COMPUTER);
            book1.setTypeName(BookType.COMPUTER);
            bookMapper.addBook(book1);
            System.out.println("成功插入,自定义策略生成的主键是"+book1.getId());

输出:
这里写图片描述
数据库中:
这里写图片描述

update元素和delete元素

属性就是前面insert元素与select元素里没有加粗的那些属性,那些属性是通用的,使用方式也一样。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值