通用Mapper
在使用spring-boot mybatis操作数据库的时候,使用通用Mapper可以极大的方便开发人员。可以随意的按照自己的需要选择通用方法,还可以很方便的开发自己的通用方法。通用Mapper提供了默认的操作数据库增删改查的功能,如果你的操作很复杂,还可以自己构建动态sql,实现自己的通用Mapper功能等
下面介绍通用Mapper的操作过程
项目依赖 pom.xml
<!-- Spring Boot Mybatis 依赖 -->
<!--mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
<!--mapper-->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>1.1.4</version>
</dependency>
<!--pagehelper-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.1</version>
</dependency>
配置 application.properties
#mybatis
mybatis.type-aliases-package=com.example.mapper.domain
mybatis.mapper-locations=classpath:mapper/*.xml
#mappers 多个接口时逗号隔开
mapper.mappers=com.example.mapper.util.MyMapper
mapper.not-empty=false
mapper.identity=MYSQL
#pagehelper
pagehelper.helperDialect=mysql
pagehelper.reasonable=true
pagehelper.supportMethodsArguments=true
pagehelper.params=count=countSql
配置 Spring DevTools
在使用 DevTools 时,通用Mapper经常会出现 class x.x.A cannot be cast to x.x.A。
同一个类如果使用了不同的类加载器,就会产生这样的错误,所以解决方案就是让通用Mapper和实体类使用相同的类加载器即可。
DevTools 默认会对 IDE 中引入的所有项目使用 restart 类加载器,对于引入的 jar 包使用 base 类加载器,因此只要保证通用Mapper的jar包使用 restart 类加载器即可。
在 src/main/resources 中创建 META-INF 目录,在此目录下添加 spring-devtools.properties 配置,内容如下:
restart.include.mapper=/mapper-[\\w-\\.]+jar
restart.include.pagehelper=/pagehelper-[\\w-\\.]+jar
通用Mapper接口
在项目中新建util/MyMapper.java 继承Mapper<T>作为通用Mapper的接口
package com.example.mapper.util;
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;
public interface MyMapper<T> extends Mapper<T>,MySqlMapper<T> {
//TODO
//FIXME 特别注意,该接口不能被扫描到,否则会出错
}
使用Mapper
在项目中新建mapper目录,下面的每个文件作为一张表,只要继承上面的MyMapper接口就可以使用基本的增删改查操作了。
下面举例user表,建立一个mapper/UserMapper.java
package com.example.mapper.mapper;
import com.example.mapper.domain.User;
import com.example.mapper.util.MyMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
@Mapper
public interface UserMapper extends MyMapper<User> {}
一旦继承了MyMapper<T>,继承的Mapper就拥有了以下通用的方法:
//根据实体类不为null的字段进行查询,条件全部使用=号and条件
List<T> select(T record);
//根据实体类不为null的字段查询总数,条件全部使用=号and条件
int selectCount(T record);
//根据主键进行查询,必须保证结果唯一
//单个字段做主键时,可以直接写主键的值
//联合主键时,key可以是实体类,也可以是Map
T selectByPrimaryKey(Object key);
//插入一条数据
//支持Oracle序列,UUID,类似Mysql的INDENTITY自动增长(自动回写)
//优先使用传入的参数值,参数值空时,才会使用序列、UUID,自动增长
int insert(T record);
//插入一条数据,只插入不为null的字段,不会影响有默认值的字段
//支持Oracle序列,UUID,类似Mysql的INDENTITY自动增长(自动回写)
//优先使用传入的参数值,参数值空时,才会使用序列、UUID,自动增长
int insertSelective(T record);
//根据实体类中字段不为null的条件进行删除,条件全部使用=号and条件
int delete(T key);
//通过主键进行删除,这里最多只会删除一条数据
//单个字段做主键时,可以直接写主键的值
//联合主键时,key可以是实体类,也可以是Map
int deleteByPrimaryKey(Object key);
//根据主键进行更新,这里最多只会更新一条数据
//参数为实体类
int updateByPrimaryKey(T record);
//根据主键进行更新
//只会更新不是null的数据
int updateByPrimaryKeySelective(T record);