在Spring4中使用通用Mapper

在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

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

时间: 2024-10-12 02:54:21

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

如何使用通用Mapper

集成方法请看上面的文档,集成后,可以继续阅读本页文档. 1. 继承通用的Mapper<T>,必须指定泛型<T> 例如下面的例子: public interface UserInfoMapper extends Mapper<UserInfo> { //其他必须手写的接口... } 一旦继承了Mapper<T>,继承的Mapper就拥有了Mapper<T>所有的通用方法. 2. 泛型(实体类)<T>的类型必须符合要求 实体类按照如下规则

通用 mapper的简单使用

通用 MAPPER的简单使用 官方  https://mapperhelper.github.io/docs/2.use/ 依赖 <dependency> <groupId>tk.mybatis</groupId> <artifactId>mapper</artifactId> <!-- 建议使用最新版本,最新版本请从项目首页查找 --> <version>x.x.x</version> </depend

MyBatis 为什么需要通用 Mapper ?

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

MyBatis通用Mapper和PageHelper

如果项目中使用到了MyBatis框架,那么使用通用Mapper和PageHelper分页插件将极大的简化我们的操作.通用Mapper可以简化对单表的CRUD操作,PageHelper分页插件可以帮我们自动拼接分页SQL,并且可以使用MyBatis Geneator来自动生成实体类,Mapper接口和Mapper xml代码,非常的方便.插件地址及作者链接https://gitee.com/free. 引入依赖 这里使用Spring Boot来构建,可参考Spring-Boot中使用Mybatis

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

文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 对单表进行增删改查是项目中不可避免的需求,Mybatis的通用Mapper插件使这些操作变得简单 添加maven依赖 在对应工程的pom.xml文件中添加 <dependency> <groupId>javax.persistence</groupId> <artifactId>persistence-api</artifactId> <version>1

Spring Boot MyBatis 通用Mapper插件集成

看本文之前,请确保你已经在SpringBoot中集成MyBatis,并能正常使用.如果没有,那么请先移步 http://blog.csdn.net/catoop/article/details/50553714 做了解后,再按本文步骤操作. 使用MyBatis在我们通过xml集中配置SQL,并通过创建接口Mapper文件来完成持久化DAO层(mybatis内部使用的是动态代理,所以我们不需要自己编写实现类). 然而在实际开发中,单表操作非常多,如果你也想像JPA.JDBC那样做一个所谓的Base

MyBatis通用Mapper开发

MyBatis通用Mapper开发 通常情况下,MyBatis 的增删改查操作需要自己在相应xml中写相关语句,但是运用相关工具,其实可以很方便的自动生成单表的所有增删改查(通用的多表联合查询还是需要自己写).也可以根据具体环境,设计相关模板,自动生成符合要求的controller和service. 使用教程:http://git.oschina.net/free/Mapper#mybatis通用mapper3具体实践:后台权限通用框架

Mybatis通用Mapper

转:http://blog.csdn.net/isea533/article/details/41457529 极其方便的使用Mybatis单表的增删改查 项目地址:http://git.oschina.net/free/Mapper 优点? 不客气的说,使用这个通用Mapper甚至能改变你对Mybatis单表基础操作不方便的想法,使用它你能简单的使用单表的增删改查,包含动态的增删改查. 程序使用拦截器实现具体的执行Sql,完全使用原生的Mybatis进行操作. 你还在因为数据库表变动重新生成x

springboot 整合通用mapper , 热加载 遇到ClassCastException

bug描述 在项目中使用springboot,mybatis , 为了提高开发效率,整合了通用mapper,和 热记载. <!-- 热加载 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> <