使用Mybatis的开发者,大多数都会遇到一个问题,就是要写大量的SQL在xml文件中,除了特殊的业务逻辑SQL之外,还有大量结构类似的增删改查SQL。而且,当数据库表结构改动时,对应的所有SQL以及实体类都需要更改。这工作量和效率的影响或许就是区别增删改查程序员和真正程序员的屏障。这时,通用Mapper便应运而生……
这里我们使用tk.Mapper实现,编写BaseMapper和BaseService服务类;tk.Mapper是为了解决单表增删改查,基于Mybatis的一个开源插件,扩展性好,可配合spring框架使用,开发人员不需要编写SQL,不需要在DAO中增加方法,只要写好实体类,就能支持相应的增删改查方法。
org.mybatis
mybatis
3.4.6
org.mybatis
mybatis-spring
1.3.2
tk.mybatis
mapper
4.1.5
com.github.pagehelper
pagehelper
5.1.4
mappers=tk.mybatis.mapper.common.Mapper,tk.mybatis.mapper.additional.insert.InsertListMapper
注意:上面配置的tk.mybatis.mapper.additional.insert.InsertListMapper接口是对批量插入的支持,我们后面会有具体实现。
@Entity
public class BaseEntity implements Serializable {
private static final long serialVersionUID = 1634746445788374292L;
@Id
@KeySql(genId = UUidGenId.class)
private String id;//uuid自动生成策略
…………
这里的id属性我们采用了tk.mapper最新的GenId生成uuid主键,需要实现GenId<>接口;这种方式的生成策略主键可以回写,可以配合上面配置的InsertListMapper接口实现批量插入数据:
public class UUidGenId implements GenId {
@Override
public String genId(String var1, String var2) {
// TODO Auto-generated method stub
return UUID.randomUUID().toString();
}
}
import tk.mybatis.mapper.additional.insert.InsertListMapper;
import tk.mybatis.mapper.common.Mapper;
/**
* @Title:基础mapper
* @Description:提供基础CRUD操作,InsertListMapper是批量插入(有区分Oracle版)
* @Author:Harvey
* @Date:2019年3月24日
*/
public interface BaseMapper extends Mapper , InsertListMapper{
}
@Service
public abstract class BaseService {
@Autowired
private BaseMapper mapper;
/**
* 保存
*
*/
public Integer save(T entity) {
return this.mapper.insert(entity);
}
/**
* 选择性保存:null的属性不会保存,使用数据库默认值
*/
public Integer savec(T entity) {
return this.mapper.insertSelective(entity);
}
/**
* 批量保存
*/
public Integer save(List entityList) {
return mapper.insertList(entityList);
}
/**
* 删除
*
*/
public Integer delete(String id) {
return this.mapper.deleteByPrimaryKey(id);
}
/**
* 批量删除
*/
public Integer delete(List ids) {
Class Tclass = (Class) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
Example example=new Example(Tclass);
Criteria criteria=example.createCriteria();
criteria.andIn("id", ids);
return this.mapper.deleteByExample(example);
}
/**
* 更新
*
*/
public Integer update(T entity) {
return this.mapper.updateByPrimaryKey(entity);
}
/**
* 更新:属性不为null的值
*
*/
public Integer updatec(T entity) {
return this.mapper.updateByPrimaryKeySelective(entity);
}
/**
* 通过id查询
*/
public T findById(String id) {
return this.mapper.selectByPrimaryKey(id);
}
/**
* 查询全部
*
*/
public List findAll() {
return this.mapper.selectAll();
}
/**
* 条件查询
* @param entity
* @return
*/
public List findByExample(Q query) {
………………
Example查询:面向对象的条件查询,功能强大
方法:List
说明:根据Example条件进行查询
重点:这个查询支持通过Example类指定查询列,通过selectProperties方法指定查询列
方法:int selectCountByExample(Object example);
说明:根据Example条件进行查询总数
方法:int updateByExample(@Param("record") T record, @Param("example") Object example);
说明:根据Example条件更新实体record包含的全部属性,null值会被更新
方法:int updateByExampleSelective(@Param("record") T record, @Param("example") Object example);
说明:根据Example条件更新实体record包含的不是null的属性值
方法:int deleteByExample(Object example);
说明:根据Example条件删除数据
……