一、引入依赖
这里只引入通用Mapper的依赖,mybatis等的依赖引入可参见我的其他博客:
tk.mybatis
mapper-spring-boot-starter
1.1.4
二、定义通用Mapper
需要注意的是通用Mapper不能在项目启动时扫描到,它与其他的一般mapper是区别开的:
package top.pullulates.system.Mapper;
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;
/**
*
* 通用MAPPER,继承此接口以实现通用的增删改查操作
*
* 但是此接口在项目启动时不可被扫描到,否则会报错
*
*/
public interface TkMapper extends Mapper, MySqlMapper {
/**
*
* 一旦继承了MyMapper,继承的Mapper就拥有了以下通用的方法:
*
* //根据实体类不为null的字段进行查询,条件全部使用=号and条件
* List 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);
*
*
*/
}
三、通用mapper配置信息
在application.yml中添加如下配置:
##通用mapper配置
mapper:
mappers: top.pullulates.system.Mapper.TkMapper
not-empty: false
identity: MYSQL
关于通用mapper,可能还需要了解这些信息:Spring DevTools 介绍
通用Mapper目前只支持单表操作,这点局限性较高,且需要定义类似于jpa那种的实体类。
四、实体类定义
实体类需要指定表名、主键和关联列名,如为临时字段,可使用Transient注解修饰,这里贴出实体类的部分代码:
@Table(name = "sys_user")
@Entity
public class User {
@Id
private Long id;
@Column
private String userId;
@Column
private Long roleId;
@Transient
private Long acountId;
关于实体类定义的更多信息,大家可自行查询,这里只做最基本的介绍。
五、实例讲解
在这里给大家介绍几个常用的方法以供参考,更多信息,大家可查看源码进行获取。
1. 根据主键查询
selectByPrimaryKey(ids)
这里的ids为Object,不论是查询、修改还是删除,都需要指定主键,否则会发生类型转换的异常。此异常是因为未指定主键,导致该字段值被匹配到每个字段,而绝大多数表字段的属性是不同的。
功能代码如下:
@RequestMapping(value="/")
public String hello() {
User user = userService.selectByPrimaryKey((long) 100000000);
return user.toString();
}
/**
* 根据主键查询用户信息
*
* @param ids
* @return
*/
@Override
public User selectByPrimaryKey(Long ids) {
return userMapper.selectByPrimaryKey(ids);
}
注意,不论是这里还是下面,调用的方法均来自Mapper
运行后,控制台成功打印了用户信息。
2. 新增
新增与修改,我们一般都是使用selective方法,这样实现方法的复用。原因是selective方法中对字段是否为空进行了判断。参考代码如下:
@RequestMapping(value="/")
public String hello() {
//User user = userService.selectByPrimaryKey((long) 100000000);
User user = new User((long)100000001,"100000001",(long)100000001,(long)100000001,"测试002","18000000000","111111","100000000",new Date(),"100000000",new Date());
int count = userService.save(user);
return count>0?"保存数据成功":"保存数据失败";
}
/**
* 保存用户信息
*
* @param user
* @return
*/
@Override
public int save(User user) {
return userMapper.insertSelective(user);
}
运行程序,浏览器打印保存数据成功。
修改和删除与上面两种方法是一样的,这里不做介绍了。
感兴趣的童鞋可以看一下源码,里面有许多我们常用的方法比如批量操作等。