Mybatis 通用 Mapper Mapper

MIT
Java 查看源码»
跨平台
2014-11-22
Liuzh_533

一、通用 Mapper 的用途 ?

我个人最早用 MyBatis 时,先是完全手写,然后用上了 MyBatis 代码生成器(简称为 MBG),在使用 MBG 过程中,发现一个很麻烦的问题,如果数据库字段变化很频繁,就需要反复重新生成代码,并且由于 MBG 覆盖生成代码和追加方式生成 XML,导致每次重新生成都需要大量的比对修改。除了这个问题外,还有一个问题,仅仅基础的增删改查等方法,就已经产生了大量的 XML 内容,还没有添加一个自己手写的方法,代码可能就已经几百行了,内容多,看着比较碍事。

因为很多人都在使用 MBG,MBG 中定义了很多常用的单表方法,为了解决前面提到的问题,也为了兼容 MBG 的方法避免项目重构太多,在 MBG 的基础上结合了部分 JPA 注解产生了通用 Mapper。通用 Mapper 可以很简单的让你获取基础的单表方法,也很方便扩展通用方法。使用通用 Mapper 可以极大的提高你的工作效率。

通过下面的快速入门,会让你尽快的了解基本的用法。

通用 Mapper 诞生于 2014 年 11 月:https://blog.csdn.net/isea533/article/details/41457529

上面文章的设计思路和现在完全不同。

如果想要了解当前的实现原理,可以看下面这篇。

MyBatis 通用 Mapper 实现原理 :https://blog.csdn.net/isea533/article/details/78493852

二、快速入门

为了让你更快速的了解通用 Mapper 的优势,这里会更简洁的让你了解整个过程。

首先在 Maven 项目的 pom.xml 中添加通用 Mapper 依赖:

<dependency>
    <groupId>tk.mybatis</groupId>
    <artifactId>mapper</artifactId>
    <version>最新版本</version></dependency>

最新版本可以看这里: https://mvnrepository.com/artifact/tk.mybatis/mapper

接下来,开始具体的使用。

1. 配置实体类

通过 MBG 配合 专用代码生成器 可以直接生成实体类等基础代码,为了避免信息量过大,这里当作手工编写和配置。

有如下类:

public class Country implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @KeySql(useGeneratedKeys = true)
    private Long id;
    private String countryname;
    private String countrycode;

    //setter 和 getter 方法
}

在上面类中,我们给主键添加了 @Id,标记该字段为数据库主键。还有一个通用 Mapper 的特殊注解 @KeySql,配置的 useGeneratedKeys=true 和 MyBatis 中的 useGeneratedKeys 含义相同,意思是说使用 JDBC 的方式获取数据库自增的主键值。

该类对应数据表为 country,因为类名和数据库名对应(当前数据库忽略大小写),因此不需要在类上添加 @Table(name="country")

经过上面简单的配置后,相当于就有了 MyBatis 中的 关系映射了,特别注意,这个映射关系只对通用 Mapper 有效,自己手写方法时,需要自己处理映射关系

这部分的详细内容参考文档:对象关系映射

2. 创建 Mapper 接口

根据上述实体类,创建对应的 CountryMapper 接口如下:

import tk.mybatis.mapper.common.Mapper;

public interface CountryMapper extends Mapper<Country> {

}

这里继承了 tk.mybatis.mapper.common.Mapper 接口,在接口上指定了泛型类型 Country。当你继承了 Mapper 接口后,此时就已经有了针对 Country 的大量方法,方法如下: 在这里插入图片描述

这些方法中和 MBG 生成的大部分方法都一致,还有一部分 MBG 之外的常用方法。

3. 配置通用 Mapper

为了让上述方法可以直接使用,还需要配置通用 Mapper,让项目在启动的时候,把上述方法都自动生成好,这样在运行时就可以使用上面所有的方法。

根据不同的开发环境,需要不同的配置方式,完整的内容可以 集成通用 Mapper,我们这里以最常见的 Spring 和 MyBatis 集成为例。

在集成 Spring 的环境中使用 MyBatis 接口方式时,需要配置 MapperScannerConfigurer,在这种情况下使用通用 Mapper,只需要修改配置如下:

<bean class="tk.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="扫描包名"/>
    <!-- 其他配置 -->
</bean>

注意官方的包名和这里 tk 包名的区别:

  • tk.mybatis.spring.mapper.MapperScannerConfigurer

  • org.mybatis.spring.mapper.MapperScannerConfigurer

只有第一部分从 org 换成了 tk

此时通用 Mapper 最简单的配置就完成了,完整的配置可以看这里 和 Spring 集成

4. 简单使用

下面是一个简单的测试用例,实际使用中,可以直接注入 CountryMapper

public class SpringXmlTest {

    private ClassPathXmlApplicationContext context;

    @Test
    public void testCountryMapper() {
        context = new ClassPathXmlApplicationContext("tk/mybatis/mapper/xml/spring.xml");
        CountryMapper countryMapper = context.getBean(CountryMapper.class);
		//获取全部信息
        List<Country> countries = countryMapper.selectAll();
        Assert.assertNotNull(countries);
        Assert.assertEquals(183, countries.size());
    }

}

该测试完整地址:Spring 集成测试用例

通用 Mapper 只是提供了基础的大量方法,遇到没有的方法时,你可以正常按照 MyBatis 的用法手写,和正常用法没有任何区别。

5. 了解更多

上面的简单的介绍已经可以应用到真正的项目中了,但是有很多细节这里都没有涉及,如果你准备加入通用 Mapper,你可以先按上述内容引入项目,然后通过更详细的文档去了解更多的细节,有很多你可能想要但是 MBG 不存在的方法,在这里都有,而且如果你想实现自己的通用方法,可以很轻松的进行扩展。

完整文档:https://github.com/abel533/Mapper/wiki

遇到问题提 issues: https://github.com/abel533/Mapper/issues

更多完整项目示例:https://mybatis.tk/samples.html

果子篮开发架构: http://guozilan.tk

MyBatis 交流:点击加入 MyBatis QQ 群

作者信息

作者博客:http://blog.csdn.net/isea533

作者邮箱: abel533@gmail.com

推荐使用 Mybatis 分页插件:PageHelper 分页插件

官方网站:www.mybatis.tk

的码云指数为
超过 的项目
加载中

评论(17)

ineilZhang
ineilZhang
网瘾少年徐志摩
网瘾少年徐志摩
前面几个乌烟瘴气的,你们有好好看文档吗?非要人家手把手教你才会用?
liangfj
liangfj
我觉得很不错
陈阳_
陈阳_
使用Condition 模糊查询 会存在sql注入的风险
烟花苏柳
在用着,没问题啊
我就是林大冲
我就是林大冲
哈哈哈,在这学习中
zack_zy
zack_zy
已经先后在三个项目中使用了,很好用
polly
polly
生生把mybatis改成hibernate的criteria,不知道为什么不直接用h呢
农夫YH
农夫YH
使用中的问题: 加了springmvc 加了aop后 拿方法名字 selectbyKey ,获取参数报空指针 提示没有这个方法 求解释
study-wong
study-wong
可以啊

通用 Mapper 4.1.2 发布,Starter 重大更新

4.1.2 - 2018-12-16 强烈推荐升级,尤其是 mapper-spring-boot-starter 需要升级到 2.1.2 版本 bug修复 解决 insertList 无法处理 DynamicTableName 问题,现在所有批量插入都支持动态表名了...

2018/12/17 09:17

Mapper 4.1.1 发布,Mybatis 通用 Mapper

Mapper 4.1.1 修复正常场景下逻辑删除注解会出现的严重 Bug 去掉了4.0.3版本增加的更新时的 set id = id 功能,避免不必要的更新,需要自己在业务层避免更新空对象时的 SQL 语法错误。 Colu...

2018/12/11 09:05

通用 Mapper 4.1.0 发布,大量新功能 PR 合并

4.1.0 - 2018-11-25 增加文档 快速入门 - MyBatis 为什么需要通用 Mapper 功能方面 新增 @Order(value = "DESC", priority = 2) 注解,可以配置排序的优先级 by qrqhuangcy #457 增加 Oracle...

2018/11/26 09:03

通用 Mapper 4.0.4 发布,新增差异更新方法

4.0.4 更新日志 增加一个差异更新的方法 updateByDiffer 根据两个参数 old 和 newer 进行差异更新,当对应某个字段值不同时才会更新。 添加 updateByPrimaryKeySelectiveWithForceUpdate (#3...

2018/08/30 13:56

通用 Mapper 4.0.3 发布,完美支持 devtools

通用 Mapper 4.0.3 已发布,该版本从根本上解决了通用 Mapper 对 devtools 的支持。 但是 https://github.com/abel533/mapper-cast-exception 中列举的特殊情况在目前都不支持(mybatis也支持...

2018/06/20 13:08

通用 Mapper 4.0.2 发布,修复严重 Bug

4.0.0 和 4.0.1 存在两个严重的问题,一个是 3.x 版本时针对 devtools 的配置丢了,一个是 extra 中的 InsertListMapper 没有 @RegisterMapper 注解,由于这两个问题的存在,这里建议升级到 ...

2018/04/23 09:21

Mybatis 通用 Mapper 4.0.1 发布,升级组件

通用 Mapper 更新日志。 4.0.1 更新日志 解决 Config 中 ORDER 配置在 Spring Boot 中无法生效的问题 更新 4.1 专用代码生成器 文档,使用全新的内容 mapper-spring-boot-starter 更新到 2....

2018/03/26 09:53

Mybatis 通用 Mapper 4.0.0 发布

通用 Mapper4 是一个可以实现任意 MyBatis 通用方法的框架,项目提供了常规的增删改查操作以及Example相关的单表操作。通用 Mapper 是为了解决 MyBatis 使用中 90% 的基本操作,使用它可以很...

2018/03/19 09:24

Mybatis 通用 Mapper 3.5.3 发布

Mybatis 通用 Mapper 3.5.3 已发布。MyBatis 通用 Mapper 极其方便的使用 MyBatis 单表的增删改查,支持单表操作,不支持通用的多表联合查询。通用 Mapper 可以极大的方便开发人员。可以随意...

2018/03/07 09:04

Mybatis 通用 Mapper 3.5.2 发布

Mybatis 通用 Mapper 3.5.2 已发布。MyBatis 通用 Mapper 极其方便的使用 MyBatis 单表的增删改查,支持单表操作,不支持通用的多表联合查询。通用 Mapper 可以极大的方便开发人员。可以随意...

2018/01/24 11:49

没有更多内容

加载失败,请刷新页面

2
回答
updateByPrimaryKeySelective 过滤不掉 where 中的null值

使用tk.mybatis.mapper的updateByPrimaryKeySelective 进行update操作 只去掉了set的null值 wher...

01/08 11:23
6
回答
mybatis 通用 mapper 使用时抛出 ClassCastException

Caused by: java.lang.RuntimeException: java.lang.RuntimeException: java.lang....

2016/09/06 10:24
1
回答
MyBatis查询数据返回用ResultMap接受,但是列顺序是按字母排序了

SpringBoot+MyBatis,查询出数据后,返回的列数据是按照字母顺序排序的,不是按照ResultMap内的属性顺序输出的

2018/04/13 09:10
71
回答
高手问答第 165 期 —— 资深 Java 工程师带你解读 MyBatis
博文视点 的回答 2017/08/16 13:23
最佳答案
高手问答第 165 期 —— 资深 Java 工程师带你解读 MyBatis @Yalong @钟京丰 @微笑笑笑2017 @草红薯 @佐岸 恭喜以上五位网友或获得《MyBatis从入门到精通》图书一本 请私信 @博文视点 告知快递信息(格式:姓名+电话+地址)!
5
回答
通用mapper 继承InsertListMapper 后 updateByPrimaryKey 失效

mapper配置 : public interface TPreferenceMapper extends Mapper<TPreference>,Ins...

2017/06/21 14:09
9
回答
Mybatis 通用 Mapper select() 查询的时候参数拼接错误
Liuzh_533 的回答 2017/06/13 17:43
最佳答案
早期版本中确实存在 ?AND 这种情况,最近的几个版本应该不存在。 可以看这里: https://github.com/abel533/Mapper/blob/master/src/main/java/tk/mybatis/mapper/mapperhelper/SqlHelper.java
1
回答
Mybatis 通用Mapper ClassCastException

报错信息: Servlet.service() for servlet [dispatcherServlet] in context with path ...

2016/12/28 14:44
1
回答
org.springframework.beans.NotWritablePropertyException: Invalid property 'mapperHelper'

compile 'org.springframework.boot:spring-boot-devtools:1.4.0.RELEASE' gradle ...

2016/09/18 14:19
3
回答
spring4、通用mapper的注入

下面是堆栈信息,通用mapper无法注入。spring版本4.2.3,通用mapper版本3.3.2 org.springframework.beans....

2015/12/12 23:55
2
回答
通用mapper的专用 mbg 在哪里?

通用mapper的专用 mbg 在哪里?

2016/09/05 12:23

没有更多内容

加载失败,请刷新页面

Mybatis之加载Mapper接口和mapper XML

概述 Mybatis加载Mapper接口有两个入口:一个是指定mapper xml,另一个是指定Mapper接口。 mapper xml 通过指定mapper xml的路径,Mybatis使用XMLMapperBuilder类来加载解析mapper xml文件。...

03/30 12:38
65
0
springboot-profiles配置,日志配置,mybatis集成

1.profiles配置 开发,测试,生成环境所使用的配置通过指定profiles来区分,读取对应的配置文件。 1.1 在application.properties中设置profiles: spring.profiles.active=dev 1.2 classpath...

2016/12/26 16:32
1K
0
Mybatis 源码解析(二)--解析器模块XPathParser

My Batis 提供的XPathParser 类封装了前面涉及的XPath 、Doc ument 和EntityResolver XPathParser 中各个字段的含义和功能如下所示 private Document document ; // D ocu me nt 对象 privat...

2018/10/25 19:48
351
0
使用技巧

减少文件的配置,更快捷的开发。

2016/04/28 13:19
24
1
Mybatis整合Spring 【转】

Mybatis整合Spring

2016/10/17 15:49
25
0
Mybatis整合Spring 【转】

根据官方的说法,在ibatis3,也就是Mybatis3问世之前,Spring3的开发工作就已经完成了,所以Spring3中还是没有对Mybatis3的支持。因此由Mybatis社区自己开发了一个Mybatis-Spring用来满足Myb...

2016/10/27 18:09
13
0
Mybatis之执行SQL过程

概述 MyBatis执行Sql的一个过程当中是怎么样的呢,涉及到了那些类呢,让我们不妨来一一过一遍。MyBatis的用法可以采用纯MyBatis、或者使用Spring集成的用法。 纯MyBatis 原生MyBatis对外暴露...

03/31 12:36
27
0
mybatis学习笔记(2)-mybatis概述

本文对mybatis做一个简单介绍,包括框架原理,执行过程,开发方法,输入输出映射以及动态sql,我会在后续的系列文章中一一详细说明

2016/02/27 19:26
467
2
MyBatis通用Mapper3

MyBatis通用Mapper3

2016/02/15 17:52
123
1

没有更多内容

加载失败,请刷新页面

返回顶部
顶部