转载自http://nihao-shijie.lofter.com/post/1cd58fc5_ceadf90
Mybatis-Plus 是 Mybatis 最得力的助手,只做增强不做改变,为简化开发、提高效率而生。
先介绍一下Mybatis-Plus
优点
纯正血统:完全继承原生 Mybatis 的所有特性
最少依赖:仅仅依赖Mybatis以及Mybatis-Spring
性能损耗小:启动即会自动注入基本CURD ,性能无损耗,直接面向对象操作
自动热加载:Mapper对应的xml可以热加载,大大减少重启Web服务器时间,提升开发效率
自动生成代码:包含自动生成代码类以及Maven插件,通过少量配置,即可快速生成Mybatis对应的xml、mapper、entity、service、serviceimpl层代码,减少开发时间
自定义操作:支持自定义Sql注入,实现个性化操作
自定义转义规则:支持数据库关键词(例如:order、key等)自动转义,支持自定义关键词
多种主键策略:支持多达4种主键策略,可自由配置,若无将会自动填充,更有充满黑科技的分布式全局唯一ID生成器
无缝分页插件:基于Mybatis物理分页,无需关心具体操作,等同于编写基本selectList查询
性能分析:自带Sql性能分析插件,开发测试时,能有效解决慢查询
全局拦截:提供全表delete、update操作智能分析阻断
避免Sql注入:内置Sql注入内容剥离器,预防Sql注入攻击
MP自带了代码生成器,包含代码生成类和Maven插件,你可以灵活的调整生成代码的方式。
进行开发你需要做什么呢?你仅仅需要配置好数据库和代码生成路径,然后生成代码就可以开撸Controller层代码了,MP已经把 Entity层、Mapper层、Service层的代码以及Mapper对应的XML文件生成好了!
我们来看看生成后的代码是什么样子:
示例中,我们假设有一张表叫foo,里面包含id和name两个字段,通过MP来生成代码
Foo.java
/**
*
* Foo表
*
*/
@TableName("foo")
public class Foo implements Serializable {
@TableField(exist = false)
protected static final long serialVersionUID = 1L;
/** ID */
@TableId
protected Long id;
/** 名称 */
protected String name;
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}
FooMapper.java
/**
*
* Foo 表数据库控制层接口
*
*/
public interface FooMapper extends AutoMapper<Foo> {
}
FooMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xxx.mapper.FooMapper">
<!-- 通用查询结果列-->
<sql id="Base_Column_List">
id, name
</sql>
</mapper>
FooService.java
/**
*
* Foo 表数据服务层接口
*
*/
public interface IFooService extends ISuperService<Foo> {
}
FooServiceImpl.java
/**
*
* Foo 表数据服务层接口实现类
*
*/
@Service
public class FooServiceImpl extends SuperServiceImpl<FooMapper, Foo> implements IFooService {
}
纳尼?!!怎么可以这么简洁?!!xml怎么什么东西都没有?!!
对,你没有看错,这就是MP生成代码,非常的简洁而且还生成了对应的注释(备注:实体类字段的注释需要在数据库设计的时候就填写好备注),要是你喜欢,甚至可以配置为无xml(如果不进行扩展,只需要基本CRUD的话)。
AutoMapper<T>方法说明
你可以看到MP采用了继承的方式来提取CRUD方法,那么我们到底有哪些方法呢?
insert相关
boolean insert(T entity); //插入
boolean insertSelective(T entity); //选择性插入,null字段不插入
boolean insertBatch(List<T> entityList); //批量插入
delete相关
boolean deleteById(I id); //通过ID删除
boolean deleteByMap(Map<String, Object> columnMap); // 通过自定义MAP删除
boolean deleteSelective(T entity); //通过entity实体选择性删除,null字段不作为条件
boolean deleteBatchIds(List<I> idList); //批量删除
update相关
boolean updateById(T entity); //通过ID更新
boolean updateSelectiveById(T entity); //通过ID选择性更新,null字段不更新
boolean update(T entity, T whereEntity); //通过whereEntity实体构造where条件进行更新
boolean updateSelective(T entity, T whereEntity); //通过whereEntity实体构造where条件进行选择性更新
boolean updateBatchById(List<T> entityList); //批量更新
select相关
T selectById(I id); //通过ID查询
List<T> selectBatchIds(List<I> idList); //通过ID集合批量查询
List<T> selectByMap(Map<String, Object> columnMap); //通过自定义MAP查询
T selectOne(T entity); //通过实体entity查询
int selectCount(T entity); //统计查询
List<T> selectList(EntityWrapper<T> entityWrapper); //List查询,entityWrapper为查询条件构造器
Page<T> selectPage(Page<T> page, EntityWrapper<T> entityWrapper); //分页查询,page为分页实体,entityWrapper为查询条件构造器
只要生成了代码,就已经带有上述的所有方法,单表的CRUD已经完全能够满足了。
你也许会问,那多表或者复杂业务怎么办?之前说了,MP是一个增强辅助工具,不会改变Mybatis,如果有多表业务和复杂业务,就可以像正常Mybatis一样使用,没有任何冲突。