在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呢?

主要考虑到两个方面。

  1. 通过<T>可以方便的获取泛型的类型,在通用的方法中就不需要传递实体类型。

  2. 通过继承的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

提交ISSUE

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

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

  1. Spring4中使用通用Mapper

    1.  在Spring4中使用通用Mapper Spring4增加了对泛型注入的支持,这个特性对通用Mapper来说,非常的有用,可以说有了这个特性,可以直接在Service中写Mapper<U ...

  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. 如何把Eclipse工程import Exprot到Android Studio

    http://jingyan.baidu.com/article/b87fe19e9e209f5218356808.html

  2. Android -- 自定义View小Demo,关于Path类的使用(一)

    1,在我们知道自定义view中onDraw()方法是用于绘制图形的,而Path类则是其中的一个重要的类,如下图效果: 代码也没有什么难度,直接贴出来吧 @Override protected void ...

  3. angular form 验证 ngMessage

    <!DOCTYPE HTML> <html ng-app="deliciousApp"> <head> <meta charset=&qu ...

  4. oracle的用户

    1:创建用户 create user zhaoyb identified by zhaoyb default tablespace HUAPUSALEDB create user 用户名 identi ...

  5. PAT乙级 1018. 锤子剪刀布 (20)

    1018. 锤子剪刀布 (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 大家应该都会玩“锤子剪刀布”的游 ...

  6. 【ubuntu】首选项和应用程序命令(preference & application)

     gnome-control-center  系统设置  gnome-control-center region  键盘布局  gnome-control-center screen  屏幕  gno ...

  7. SQL server 创建 修改表格 及表格基本增删改查 及 高级查询 及 (数学、字符串、日期时间)函数[转]

    SQL server 创建 修改表格 及表格基本增删改查 及 高级查询 及 (数学.字符串.日期时间)函数   --创建表格 create table aa ( UserName varchar(50 ...

  8. java使用ffmpeg和mencoder做视频格式转换

    首发:个人博客,持续更新和纠错 主要使用技术:1)FFmpeg,用于主流格式之间的转换,例如AVI,MP4,FLV等.2)MEncoder,用于奇葩格式转主流格式,例如RMVB转AVI.这样我们可以把 ...

  9. UIViewController卸载过程(ios6.0以后)

    在ios6.0以后,废除了viewWillUnload方法和viewDidUnload方法. 在ios6以后,当收到didReceiveMemoryWarning消息调用之后,程序会自动调用didRe ...

  10. python 提取图片转为16 24BPP 的方法

    python 中处理图片用的是 pil ,在 linux  和 win 上都可以使用. centOS 5.x 上安装的方法是 yum install python-imaging 24BPP: imp ...