1. 1.  Spring4中使用通用Mapper

Spring4增加了对泛型注入的支持,这个特性对通用Mapper来说,非常的有用,可以说有了这个特性,可以直接在Service中写Mapper<UserInfo> mapper,可以通过BaseService<T>来实现通用的Service。

这篇文档主要讲解通用Mapper在Spring4中的**最佳用法**。

  1. 2.   一、在Spring4中配置通用Mapper

和Spring3中的配置一样,配置方法请看这里有关Spring配置的信息。

如果有人不明白完整的配置什么样,可以看下面的例子:

  1. 3.   二、继承Mapper<T>实现自己的实体接口类

这里以Country2Mapper为例:

public interface Country2Mapper extends Mapper<Country2> {

//省略其他自己增加的方法

}

如果你点进去上面的Country2Mapper查看,会发现里面还有一些Example的方法,这些是代码生成器生成的,生成的方法不包含通用的CRUD,只有Example的方法,还有一个对应的Country2Mapper.xml

这个例子主要说明,除了通用Mapper的方法外,你可以添加自己的方法,和原来的没有区别。

这里的实体Country2代码如下:

@Table(name="country")

public class Country2 {

@Id

private Integer id;

private String countryname;

private String countrycode;

//省略getter和setter方法

}

这里配置对应的表名为country。只有一个主键id。

  1. 4.   三、在Service中使用

在Service中的使用方式有很多种。

  1. 5.     第一种、直接注入上面定义的Country2Mapper

@Service

public class DemoService {

@Autowired

private Country2Mapper mapper;

public List<Country2> selectPage(int pageNum,int pageSize){

PageHelper.startPage(pageNum, pageSize);

//Spring4支持泛型注入

return mapper.select(null);

}

}

这种方式太常见,太普通,这里不多解释。

  1. 6.     第二种、泛型注入

这种方式用的就很少了,但是Spring4支持泛型注入,因此在第一种的基础上,我们可以写出如下的代码:

@Service

public class DemoService {

@Autowired

private Mapper<Country2> mapper;

public List<Country2> selectPage(int pageNum,int pageSize){

//这里用到了分页插件PageHelper

PageHelper.startPage(pageNum, pageSize);

//Spring4支持泛型注入

return mapper.select(null);

}

}

对于不了解泛型注入的,可能会不习惯Mapper<Country2> mapper这种写法,实际上这么写的优势并不明显。还不如第一种明确。

但是通过第二种,我们可以引出第三种,也可能会是很常用的通用Service。

  1. 7.     第三种、通用Service

一般操作数据库都在Service中进行,不可避免的就要写出大量重复的CRUD方法,如果能有一个通用的Service,肯定也会减少很多工作量。

这里通过简单扩展来讲,更复杂的封装,各位可以根据自己的情况动手实践。

如下简单例子:

@Service

public abstract class BaseService<T> {

@Autowired

protected Mapper<T> mapper;

public int save(T entity){

return mapper.insert(entity);

}

public int delete(T entity){

return mapper.deleteByPrimaryKey(entity);

}

/**

* 单表分页查询

*

* @param pageNum

* @param pageSize

* @return

*/

public List<T> selectPage(int pageNum,int pageSize){

PageHelper.startPage(pageNum, pageSize);

//Spring4支持泛型注入

return mapper.select(null);

}

}

创建如上所示的抽象类BaseService<T>,这里封装三个方法仅作为简单的例子。需要更复杂逻辑的可以自行摸索。

然后修改刚才的DemoService例子:

@Service

public class DemoService extends BaseService<Country2>{

}

由于BaseService<T>封装了单表的分页插件,因此目前的DemoService中没有任何代码。

假如我们要增加一个包含校验的保存方法。添加如下代码:

@Service

public class DemoService extends BaseService<Country2>{

public int save(Country2 country2) {

if (country2 == null) {

throw new NullPointerException("保存的对象不能为空!");

}

if (country2.getCountrycode() == null || country2.getCountrycode().equals("")) {

throw new RuntimeException("国家代码不能为空!");

}

if (country2.getCountryname() == null || country2.getCountryname().equals("")) {

throw new RuntimeException("国家名称不能为空!");

}

return super.save(country2);

}

}

上面只是个例子,是否抛出异常各位不用计较。

从这个例子应该也能看到,当使用Spring4和通用Mapper的时候,是多么的方便。

  1. 8.   关于继承Mapper<T>

我一开始为什么要设计为必须继承Mapper<T>实现自己的Mapper呢?

主要考虑到两个方面。

  1. 通过<T>可以方便的获取泛型的类型,在通用的方法中就不需要传递实体类型。
  2. 通过继承的Mapper,例如Country2Mapper,有独立的Mapper就意味着有独立的命名空间,可以缓存结果,并且不需要拦截器就能实现。

现在有了Spring4后,又有了一个很重要的原因。

  • 支持泛型注入,可以实现自己的通用Service,在通用Mapper基础上再次简化操作,加快开发效率。
  1. 9.   最后

如果之前说通用Mapper不如Mybatis-Generator自动生成好,我也只能说看个人喜好,不需要通用Mapper的可以不用,通用Mapper只是为了满足一部分的人需要。

现在来看,**如果还有人说通用Mapper不如Mybatis-Generator自动生成好**,我会建议他看看这篇文档

实际上,不需要说那个更好,适合自己的才好。

另外看完这篇文档后,不需要再说**通用Mapper不如Mybatis-Generator自动生成好**,因为我和一些朋友正在翻译**Mybatis-Generator**,最后还会提供**Mybatis-Generator和通用Mapper的集成插件**,可以用**Mybatis-Generator**直接生成实体类、继承通用Mapper的实体Mapper以及XML文件。

Mybatis-Generator中文文档地址http://generator.sturgeon.mopaas.com/

Mybatis-Generator官方英文地址http://mybatis.github.io/generator/index.html

这个文档还没有翻译完,而且译者水平有限,如果发现翻译错误或者不合适的地方,可以在下面的地址提ISSUE

提交ISSUE

上面这个地址只是生成后的项目文档地址,并不是我们直接用来翻译的项目。

Spring4中使用通用Mapper的更多相关文章

  1. 在Spring4中使用通用Mapper

    在Spring4中使用通用Mapper http://my.oschina.net/flags/blog/355281#OSC_h2_2 目录[-] 在Spring4中使用通用Mapper 一.在Sp ...

  2. SSM:Mybatis中引入通用mapper

    如果你是SSM项目引入通用mapper记得要引入hibernate中的一个hibernate-jpa-2.1-api-1.0.0.Final.jar包(注意必须要Mybatis整合Spring噢,其实 ...

  3. 如何使用通用Mapper

    集成方法请看上面的文档,集成后,可以继续阅读本页文档. 1. 继承通用的Mapper<T>,必须指定泛型<T> 例如下面的例子: public interface UserIn ...

  4. 通用 mapper的简单使用

    通用 MAPPER的简单使用 官方  https://mapperhelper.github.io/docs/2.use/ 依赖 <dependency> <groupId>t ...

  5. 通用mapper版+SpringBoot+MyBatis框架+mysql数据库的整合

    转:https://blog.csdn.net/qq_35153200/article/details/79538440 开发环境: 开发工具:Intellij IDEA 2017.2.3 JDK : ...

  6. MyBatis 为什么需要通用 Mapper ?

    一.通用 Mapper 的用途 ? 我个人最早用 MyBatis 时,先是完全手写,然后用上了 MyBatis 代码生成器(简称为 MBG),在使用 MBG 过程中,发现一个很麻烦的问题,如果数据库字 ...

  7. 浅谈Mybatis通用Mapper使用方法_java - JAVA

    文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 对单表进行增删改查是项目中不可避免的需求,Mybatis的通用Mapper插件使这些操作变得简单 添加maven依赖 在 ...

  8. 通用Mapper与分页插件的集成

    SpringBoot 是为了简化 Spring 应用的创建.运行.调试.部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖 ...

  9. springboot中通用mapper结合mybatis generator的使用

    通用mapper就是指的是  tk.mybatis  包下的.这个是通用mapper就是说自动生成的dao层需要继承这个框架提供的mapper类.而我们之前用的org.mybatis这个最开始是普通的 ...

随机推荐

  1. docker笔记(2)-----容器连接

    2019-01-12  13:57:36 Dockerfile基本结构: 基础镜像内容:FROM指明base image 维护者信息: 镜像操作指令:RUN指令,每运行一条RUN指令,镜像添加新的一层 ...

  2. 请为CMyString类型编写构造函数、copy构造函数、析构函数和赋值运算符函数。

    如下为类型CMyString的声明,请为该类型编写构造函数.copy构造函数.析构函数和赋值运算符函数. class CMyString { public: CMyString(const char* ...

  3. Web安全测试工具 Burp Suit 使用简介

    参考文档: https://blog.csdn.net/gitchat/article/details/79168613 https://www.cnblogs.com/nieliangcai/p/6 ...

  4. 操纵Review被封店,申诉信

    标签: 测评被封 亚马逊申诉 操纵评价申诉 分类: 亚马逊申诉模板 Hello,We recently contacted you about product review manipulation. ...

  5. mybatis-generator自动生成Mapper.dao.entity

    在pom.xml中添加依赖 <plugin> <groupId>org.mybatis.generator</groupId> <artifactId> ...

  6. ranch 源码分析(完)

    接上 ranch 源码分析(三) 在上一次,根据ranch源码把大概流程理了一遍,下面我们将一些细节解释一下. ranch只是一个服务的框架,它提供了传输层协议代码(ranch_tcp 和ranch_ ...

  7. MySQL常用语法命令及函数

    #创建数据库# create database 数据库名; #查看数据库# show databases; #选择数据库# use 数据库名; #删除数据库# drop database 数据库名; ...

  8. prefixspan是挖掘频繁子序列,子序列不一定是连续的,当心!!!

    序列模式挖掘是从序列数据库中发现频繁子序列作为模式. 子序列与频繁序列 了解了序列数据的概念,我们再来看看上面是子序列.子序列和我们数学上的子集的概念很类似,也就是说,如果某个序列A所有的项集在序列B ...

  9. Cognos无法解密来着内容库的用户名和密码凭证

    1. 问题描述 启动Cognos失败,报错代码为QE-DEF-0368. 2. 问题分析 Frame Work和Cognos Server安装在不同的目录和/或不同的机器上. 3. 解决方案 需要把S ...

  10. VC调用外部程序

    #include <windows.h> int main() { STARTUPINFO mStatusInfo; memset(&mStatusInfo, 0, sizeof( ...