MyBatis 为什么需要通用 Mapper ?

Enjoyjava · · 1237 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

MyBatis 为什么需要通用 Mapper ? 在早期项目文档中有过类似主题的内容,但是最近我自己看文档的时候发现一个问题,文档虽然很详细,但是并不适合初次接触的人。为了方便第一次听说,第一次尝试的开发人员了解通用 Mapper,补充此文档。 一、通用 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 中的 <resultMap> 关系映射了, 特别注意,这个映射关系只对通用 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 的用法手写,和正常用法没有任何区别。

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1237 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传