在Spring4中使用通用Mapper
在Spring4中使用通用Mapper
http://my.oschina.net/flags/blog/355281#OSC_h2_2
目录[-]
在Spring4中使用通用Mapper
Spring4增加了对泛型注入的支持,这个特性对通用Mapper来说,非常的有用,可以说有了这个特性,可以直接在Service中写Mapper<UserInfo> mapper
,可以通过BaseService<T>
来实现通用的Service
。
这篇文档主要讲解通用Mapper在Spring4中的**最佳用法**。
一、在Spring4中配置通用Mapper
和其他里面配置的区别就是在Spring4中可以配置通用Mapper这个类,我们可以把通用Mapper中提供的Mapper<T>
配置到Spring中,如果你有自己实现的通用Mapper,也可以这么配置:
- <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
- <property name="basePackage" value="com.isea533.mybatis.mapper,com.isea533.mybatis.mapperhelper"/>
- </bean>
这里在配置basePackage
的时候,将通用Mapper<T>
所在的包com.isea533.mybatis.mapperhelper
也配置上了。这样就能在Spring4中直接注入Mapper<T>
。
另外就是通用Mapper自身的配置:
- <bean class="com.isea533.mybatis.mapperhelper.MapperHelper"
- depends-on="sqlSession" init-method="initMapper" scope="singleton" lazy-init="false">
- <property name="mappers">
- <array>
- <value>com.isea533.mybatis.mapperhelper.Mapper</value>
- </array>
- </property>
- <property name="sqlSessions" ref="sqlSession"/>
- </bean>
这里的配置和Spring3没什么区别,另外需要保证有sqlSession
,可以按如下配置:
- <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" scope="prototype">
- <constructor-arg index="0" ref="sqlSessionFactory"/>
- </bean>
其他的配置按照通常的方法进行配置即可,没有特殊的地方,如果有人不明白完整的配置什么样,可以看下面的例子:
二、继承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
。
三、在Service中使用
在Service中的使用方式有很多种。
第一种、直接注入上面定义的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);
- }
- }
这种方式太常见,太普通,这里不多解释。
第二种、泛型注入
这种方式用的就很少了,但是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。
第三种、通用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的时候,是多么的方便。
关于继承Mapper<T>
我一开始为什么要设计为必须继承Mapper<T>
实现自己的Mapper
呢?
主要考虑到两个方面。
通过
<T>
可以方便的获取泛型的类型,在通用的方法中就不需要传递实体类型。通过继承的
Mapper
,例如Country2Mapper
,有独立的Mapper
就意味着有独立的命名空间,可以缓存结果,并且不需要拦截器就能实现。
现在有了Spring4后,又有了一个很重要的原因。
支持泛型注入,可以实现自己的通用Service,在通用Mapper基础上再次简化操作,加快开发效率。
最后
如果之前说通用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
上面这个地址只是生成后的项目文档地址,并不是我们直接用来翻译的项目。
在Spring4中使用通用Mapper的更多相关文章
- Spring4中使用通用Mapper
1. 在Spring4中使用通用Mapper Spring4增加了对泛型注入的支持,这个特性对通用Mapper来说,非常的有用,可以说有了这个特性,可以直接在Service中写Mapper<U ...
- SSM:Mybatis中引入通用mapper
如果你是SSM项目引入通用mapper记得要引入hibernate中的一个hibernate-jpa-2.1-api-1.0.0.Final.jar包(注意必须要Mybatis整合Spring噢,其实 ...
- 如何使用通用Mapper
集成方法请看上面的文档,集成后,可以继续阅读本页文档. 1. 继承通用的Mapper<T>,必须指定泛型<T> 例如下面的例子: public interface UserIn ...
- 通用 mapper的简单使用
通用 MAPPER的简单使用 官方 https://mapperhelper.github.io/docs/2.use/ 依赖 <dependency> <groupId>t ...
- 通用mapper版+SpringBoot+MyBatis框架+mysql数据库的整合
转:https://blog.csdn.net/qq_35153200/article/details/79538440 开发环境: 开发工具:Intellij IDEA 2017.2.3 JDK : ...
- MyBatis 为什么需要通用 Mapper ?
一.通用 Mapper 的用途 ? 我个人最早用 MyBatis 时,先是完全手写,然后用上了 MyBatis 代码生成器(简称为 MBG),在使用 MBG 过程中,发现一个很麻烦的问题,如果数据库字 ...
- 浅谈Mybatis通用Mapper使用方法_java - JAVA
文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 对单表进行增删改查是项目中不可避免的需求,Mybatis的通用Mapper插件使这些操作变得简单 添加maven依赖 在 ...
- 通用Mapper与分页插件的集成
SpringBoot 是为了简化 Spring 应用的创建.运行.调试.部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖 ...
- springboot中通用mapper结合mybatis generator的使用
通用mapper就是指的是 tk.mybatis 包下的.这个是通用mapper就是说自动生成的dao层需要继承这个框架提供的mapper类.而我们之前用的org.mybatis这个最开始是普通的 ...
随机推荐
- HDU 4816 Bathysphere(数学)(2013 Asia Regional Changchun)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4816 Problem Description The Bathysphere is a spheric ...
- swt byte[] 与 Image的转换
1. 从byte[]得到Image private static Image createImage(byte[] imageBytes) { Image image = null; try { By ...
- C makefile
Makefile编写 hello.out:max.o main.c gcc max.o main.c -o hello.out max.o:max.c gcc -c max.c -o max.o
- paper 43 :ENDNOTE下载及使用方法简介
转载来源:http://blog.sciencenet.cn/blog-484734-367968.html 软件下载来源: EndNote v9.0 Final 正式版:http://www.ttd ...
- paper 42 :图像的小波变换
关于小波变换我只是有一个很朴素了理解.不过小波变换可以和傅里叶变换结合起来理解. 傅里叶变换是用一系列不同频率的正余弦函数去分解原函数,变换后得到是原函数在正余弦不同频率下的系数. 小波变换使用一系列 ...
- 开源软件free download manager在windows defender中报毒
从官网上下载的fdm lite 3.9.6,从图片中可以看出安装包有数字签名,windows defender报毒,在线杀毒也检出木马,官网的程序更新到了3.9.6版本,在sourceforge上的源 ...
- 什么是BI【转】
产品与服务 - 商务智能 目前,商业智能产品及解决方案大致可分为数据仓库产品.数据抽取产品.OLAP产品.展示产品.和集成以上几种产品的针对某个应用的整体解决方案 商业智能是什么? 简而言之, ...
- webservice 错误::无法加载协定为的终结点配置部分,因为找到了该协定的多个终结点配置。请按名称指示首选的终结点配置部分。
转自网络 错误::无法加载协定为“ServiceReference1.INetbankUpdateService”的终结点配置部分,因为找到了该协定的多个终结点配置.请按名称指示首选的终结点配置部分. ...
- IOC依赖注入简单实例
转自:http://hi.baidu.com/xyz136299110/item/a32be4269e9d0c55c38d59e6 相信大家看过相当多的IOC依赖注入的例子. 但大家在没有明白原理的情 ...
- 3、JavaScript
1. JavaScript简介 1.1. JavaScript由来 Netscape 发明了 JavaScript JavaScript由Netscape 在1995年发明.早期的主要目的是处理 ...