美文网首页
MyBatis mapper.xml 整理

MyBatis mapper.xml 整理

作者: 简_easy | 来源:发表于2018-07-06 15:01 被阅读72次

    一 、Mapper XML顶级配置元素

    cache :启用本xml对应的namespace的二级缓存

    cache-ref: 共享指定namespace的二级缓存

    resultMap :(强制配置字段)进行数据库列和返回Java对象的属性之间的映射

    sql :可被其他语句引用的可重用sql语句块(地位相当于Java中的private辅助方法或常量)

    insert/delete/update/select :增删改查映射语句

    二、概念

    namespace :就是Mapper XML对应的Java接口名.

    联合查询: 也就是多表的各种join查询

    关联映射: 也就是嵌套映射, 用在一个POJO中包含其他POJO的情况

    三、select

    以上语句完成的是将符合条件的所有列返回, 以key-value对的形式保存在HashMap类型的对象中.

    select子句需要注意的属性有:

    关于select子句, 有以下几点要特别强调的:

    parameterType通常无须指定, 因为可以根据namespace对应的Java接口方法推断出来

    每个resultMap推荐强制在之前进行resultMap的声明, 这样当修改了数据库或Java Domain Object的时候, 这里能够快速报错, 方便问题定位.

    select子句务必指明所有需要的列, 避免额外的数据传输. 即使是需要全部列也不要用’*’, 因为会增加数据库的解析成本(唯一允许用’*’的地方是count(*)).

    四、insert/delete/update

    简单 举例:

    部分属性与select子句是通用的, 需要额外注意的属性有:

    useGeneratedKeys:(仅对insert/update生效), 告知MyBatis使用JDBC的getGeneratedKeys方法来取出数据库内部生成的自增型主键, 适用于MySQL, SQL Server等, 默认为false

    以下是几个例子:

    五、 sql

    一个例子:

    下面是一个嵌套sql方法的例子:

    六、resultMap–结果映射

    我们约定强制对所有的select子句都需要显式设定resultMap属性, 因为显式对结果映射进行声明, 有利于后期修改数据库(例如修改列名或增加字段等场景)能够迅速定位异常出现的原因, 对于后期维护节约的成本远远低于声明一个resultMap的成本.

    一个符合上述描述标准的简单例子:

    七、枚举类型映射

    遵循以下法则即可:

    数据库中字段直接存枚举的类型名为char或者varchar即可, 例如ERROR;

    Domain Object中相应字段类型直接用枚举类型;

    这样select的时候会自动匹配的.

    八、高级结果映射

    当我们的结果映射包含嵌套实体映射的时候, 我们需要启用resultMap的子元素辅助进行嵌套实体映射.

    下面我们来介绍resultMap的子元素

    id & result

    这两个都是用来映射一个简单结果列, 如果是数据库中的id, 那么最好还是使用id, 因为能提高性能(主要是缓存性能和联合查询join的性能).

    这两个元素有以下值得关注的属性:

    支持的jdbcType:

    九、constructor

    constructor元素的使用场景是当一个POJO的一些属性是private final的或者是private且不提供公有getter的时候, 这时候只能够通过类的构造方法进行注入, constructor元素可以关联到指定type的POJO的相同参数构造方法上, 进行构造注入.

    下面是一个例子(since mybatis 3.4.3, 之前的版本参数顺序必须与构造方法参数顺序严格对应):

    A、assosiation–解决has one类型的关联查询

    assosiation是用来做关联映射的, 如果POJO中有嵌套的POJO定义, 使用这个元素获取嵌套的结果. 注意: assosiation本身也可以作为一种resultMap.

    关联映射可以使用MyBatis提供的延迟加载(Lazy Loading)特性, 也就是说, 如果外层POJO被查询后, 嵌套的POJO如果没有被使用, 那么与之关联的select子句不会被执行, 直到被使用的一刻才会执行.

    注意: 延迟加载是为了解决著名的”N+1查询问题”而设定的, 所谓N+1查询问题, 就是说1个外层实体, 可能内嵌N个实体, 外层的一个查询实际会引发”N+1”次查询, 这对于大数据集来说效率是不可接受的, 所以不要执行对大数据集批量返回后紧接着在代码里遍历所有嵌套字段的操作, 这会使延迟加载的特性失效! 此种情况请考虑设计库表添加冗余字段.

    例3: (推荐)一个复杂点的例子, 使用association关联一个resultMap的id进行联合查询结果列映射, 这样单独抽出来的resultMap, 可以重用.

    B、collection–解决has many类型的关联查询

    基本用法与association一致.

    参考链接:https://blog.csdn.net/congyihao/article/details/69822643

    参考官方文档:

    MyBatis官方文档–Mapper XML文件中文版

    MyBatis官方文档–Mapper XML文件英文版

    相关文章

      网友评论

          本文标题:MyBatis mapper.xml 整理

          本文链接:https://www.haomeiwen.com/subject/thovuftx.html