一、Service CRUD 接口
通用 Service CRUD 封装IService接口,采用 get 查询单行 remove 删除 list 查询集合 page 分页 。
1、Save
boolean save(T entity
);
boolean saveBatch(Collection
<T> entityList
);
boolean saveBatch(Collection
<T> entityList
, int batchSize
);
2、SaveOrUpdate
boolean saveOrUpdate(T entity
);
boolean saveOrUpdate(T entity
, Wrapper
<T> updateWrapper
);
boolean saveOrUpdateBatch(Collection
<T> entityList
);
boolean saveOrUpdateBatch(Collection
<T> entityList
, int batchSize
);
3、Remove
boolean remove(Wrapper
<T> queryWrapper
);
boolean removeById(Serializable id
);
boolean removeByMap(Map
<String, Object> columnMap
);
boolean removeByIds(Collection
<? extends Serializable> idList
);
4、Update
boolean update(Wrapper
<T> updateWrapper
);
boolean update(T entity
, Wrapper
<T> updateWrapper
);
boolean updateById(T entity
);
boolean updateBatchById(Collection
<T> entityList
);
boolean updateBatchById(Collection
<T> entityList
, int batchSize
);
5、Get
T
getById(Serializable id
);
T
getOne(Wrapper
<T> queryWrapper
);
T
getOne(Wrapper
<T> queryWrapper
, boolean throwEx
);
Map
<String, Object> getMap(Wrapper
<T> queryWrapper
);
<V> V
getObj(Wrapper
<T> queryWrapper
, Function
<? super Object
, V
> mapper
);
6、List
List
<T> list();
List
<T> list(Wrapper
<T> queryWrapper
);
Collection
<T> listByIds(Collection
<? extends Serializable> idList
);
Collection
<T> listByMap(Map
<String, Object> columnMap
);
List
<Map
<String, Object>> listMaps();
List
<Map
<String, Object>> listMaps(Wrapper
<T> queryWrapper
);
List
<Object> listObjs();
<V> List
<V> listObjs(Function
<? super Object
, V
> mapper
);
List
<Object> listObjs(Wrapper
<T> queryWrapper
);
<V> List
<V> listObjs(Wrapper
<T> queryWrapper
, Function
<? super Object
, V
> mapper
);
7、Page
IPage
<T> page(IPage
<T> page
);
IPage
<T> page(IPage
<T> page
, Wrapper
<T> queryWrapper
);
IPage
<Map
<String, Object>> pageMaps(IPage
<T> page
);
IPage
<Map
<String, Object>> pageMaps(IPage
<T> page
, Wrapper
<T> queryWrapper
);
8、Count
int count();
int count(Wrapper
<T> queryWrapper
);
9、Chain
QueryChainWrapper
<T> query();
LambdaQueryChainWrapper
<T> lambdaQuery();
query().eq("column", value
).one();
lambdaQuery().eq(Entity
::getId
, value
).list();
UpdateChainWrapper
<T> update();
LambdaUpdateChainWrapper
<T> lambdaUpdate();
update().eq("column", value
).remove();
lambdaUpdate().eq(Entity
::getId
, value
).update(entity
);
二、Mapper CRUD 接口
通用 CRUD 封装BaseMapper接口,为 Mybatis-Plus 启动时自动解析实体表关系映射转换为 Mybatis 内部对象注入容器。
1、Insert
int insert(T entity
);
2、Delete
int delete(@Param(Constants
.WRAPPER
) Wrapper
<T> wrapper
);
int deleteBatchIds(@Param(Constants
.COLLECTION
) Collection
<? extends Serializable> idList
);
int deleteById(Serializable id
);
int deleteByMap(@Param(Constants
.COLUMN_MAP
) Map
<String, Object> columnMap
);
3、Update
int update(@Param(Constants
.ENTITY
) T entity
, @Param(Constants
.WRAPPER
) Wrapper
<T> updateWrapper
);
int updateById(@Param(Constants
.ENTITY
) T entity
);
4、Select
T
selectById(Serializable id
);
T
selectOne(@Param(Constants
.WRAPPER
) Wrapper
<T> queryWrapper
);
List
<T> selectBatchIds(@Param(Constants
.COLLECTION
) Collection
<? extends Serializable> idList
);
List
<T> selectList(@Param(Constants
.WRAPPER
) Wrapper
<T> queryWrapper
);
List
<T> selectByMap(@Param(Constants
.COLUMN_MAP
) Map
<String, Object> columnMap
);
List
<Map
<String, Object>> selectMaps(@Param(Constants
.WRAPPER
) Wrapper
<T> queryWrapper
);
List
<Object> selectObjs(@Param(Constants
.WRAPPER
) Wrapper
<T> queryWrapper
);
IPage
<T> selectPage(IPage
<T> page
, @Param(Constants
.WRAPPER
) Wrapper
<T> queryWrapper
);
IPage
<Map
<String, Object>> selectMapsPage(IPage
<T> page
, @Param(Constants
.WRAPPER
) Wrapper
<T> queryWrapper
);
Integer
selectCount(@Param(Constants
.WRAPPER
) Wrapper
<T> queryWrapper
);
三、条件构造器
① 以下出现的第一个入参boolean condition表示该条件是否加入最后生成的sql中 ② 以下代码块内的多个方法均为从上往下补全个别boolean类型的入参,默认为true ③ 以下出现的泛型Param均为Wrapper的子类实例(均具有AbstractWrapper的所有方法) ④ 以下方法在入参中出现的R为泛型,在普通wrapper中是String,在LambdaWrapper中是函数(例如Entity::getId,Entity为实体类,getId为字段id的getMethod方法) ⑤ 以下方法入参中的R column均表示数据库字段,当R具体类型为String时则为数据库字段名 ⑥ 以下举例均为使用普通wrapper,入参为Map和List的均以json形式表现 ⑦ 使用中如果入参的Map或者List为空,则不会加入最后生成的sql中
1、AbstractWrapper
QueryWrapper(LambdaQueryWrapper) 和 UpdateWrapper(LambdaUpdateWrapper) 的父类 用于生成 sql 的 where 条件,entity 属性也用于生成 sql 的 where 条件。 注意:entity 生成的 where 条件与 使用各个 api 生成的 where 条件没有任何关联行为
★ allEq
allEq(Map
<R, V> params
)
allEq(Map
<R, V> params
, boolean null2IsNull
)
allEq(boolean condition
, Map
<R, V> params
, boolean null2IsNull
)
参数说明:
params:key为数据库字段名,value为字段值
null2IsNull:为
true则在map的value为null时调用 isNull 方法,为
false时则忽略value为null的
allEq({id
:1,name
:"老王",age
:null
})--->id
= 1 and name
= '老王' and age is null
allEq({id
:1,name
:"老王",age
:null
}, false)--->id
= 1 and name
= '老王'
allEq(BiPredicate
<R, V> filter
, Map
<R, V> params
)
allEq(BiPredicate
<R, V> filter
, Map
<R, V> params
, boolean null2IsNull
)
allEq(boolean condition
, BiPredicate
<R, V> filter
, Map
<R, V> params
, boolean null2IsNull
)
参数说明:
filter:过滤函数,是否允许字段传入比对条件中
params与null2IsNull同上
allEq((k
,v
) -> k
.indexOf("a") >= 0, {id
:1,name
:"老王",age
:null
})--->name
= '老王' and age is null
allEq((k
,v
) -> k
.indexOf("a") >= 0, {id
:1,name
:"老王",age
:null
}, false)--->name
= '老王'
★ eq(等于 =)
eq(R column
, Object val
)
eq(boolean condition
, R column
, Object val
)
eq("name", "老王")--->name
= '老王'
★ ne(不等于 <>)
ne(R column
, Object val
)
ne(boolean condition
, R column
, Object val
)
ne("name", "老王")--->name
<> '老王'
★ gt(大于 >)
gt(R column
, Object val
)
gt(boolean condition
, R column
, Object val
)
gt("age", 18)--->age
> 18
★ ge(大于等于 >=)
ge(R column
, Object val
)
ge(boolean condition
, R column
, Object val
)
ge("age", 18)--->age
>= 18
★ lt(小于 <)
lt(R column
, Object val
)
lt(boolean condition
, R column
, Object val
)
lt("age", 18)--->age
< 18
★ le(小于等于 <=)
le(R column
, Object val
)
le(boolean condition
, R column
, Object val
)
le("age", 18)--->age
<= 18
★ between
between(R column
, Object val1
, Object val2
)
between(boolean condition
, R column
, Object val1
, Object val2
)
between("age", 18, 30)--->age between
18 and
30
★ notBetween
notBetween(R column
, Object val1
, Object val2
)
notBetween(boolean condition
, R column
, Object val1
, Object val2
)
notBetween("age", 18, 30)--->age not between
18 and
30
★ like
like(R column
, Object val
)
like(boolean condition
, R column
, Object val
)
like("name", "王")--->name like
'%王%'
★ notLike
notLike(R column
, Object val
)
notLike(boolean condition
, R column
, Object val
)
notLike("name", "王")--->name not like
'%王%'
★ likeLeft
likeLeft(R column
, Object val
)
likeLeft(boolean condition
, R column
, Object val
)
likeLeft("name", "王")--->name like
'%王'
★ likeRight
likeRight(R column
, Object val
)
likeRight(boolean condition
, R column
, Object val
)
likeRight("name", "王")--->name like
'王%'
★ isNull
isNull(R column
)
isNull(boolean condition
, R column
)
isNull("name")--->name is null
★ isNotNull
isNotNull(R column
)
isNotNull(boolean condition
, R column
)
isNotNull("name")--->name is not null
★ in
in(R column
, Collection
<?> value
)
in(boolean condition
, R column
, Collection
<?> value
)
in("age",{1,2,3})--->age in
(1,2,3)
in(R column
, Object
... values
)
in(boolean condition
, R column
, Object
... values
)
in("age", 1, 2, 3)--->age in
(1,2,3)
★ notIn
notIn(R column
, Collection
<?> value
)
notIn(boolean condition
, R column
, Collection
<?> value
)
notIn("age",{1,2,3})--->age not in
(1,2,3)
notIn(R column
, Object
... values
)
notIn(boolean condition
, R column
, Object
... values
)
notIn("age", 1, 2, 3)--->age not in
(1,2,3)
★ inSql
inSql(R column
, String inValue
)
inSql(boolean condition
, R column
, String inValue
)
inSql("age", "1,2,3,4,5,6")--->age in
(1,2,3,4,5,6)
inSql("id", "select id from table where id < 3")--->id in
(select id from table where id
< 3)
★ notInSql
notInSql(R column
, String inValue
)
notInSql(boolean condition
, R column
, String inValue
)
notInSql("age", "1,2,3,4,5,6")--->age not in
(1,2,3,4,5,6)
notInSql("id", "select id from table where id < 3")--->id not in
(select id from table where id
< 3)
★ groupBy
groupBy(R
... columns
)
groupBy(boolean condition
, R
... columns
)
groupBy("id", "name")--->group by id
,name
★ orderByAsc
orderByAsc(R
... columns
)
orderByAsc(boolean condition
, R
... columns
)
orderByAsc("id", "name")--->order by id ASC
,name ASC
★ orderByDesc
orderByDesc(R
... columns
)
orderByDesc(boolean condition
, R
... columns
)
orderByDesc("id", "name")--->order by id DESC
,name DESC
★ orderBy
orderBy(boolean condition
, boolean isAsc
, R
... columns
)
orderBy(true, true, "id", "name")--->order by id ASC
,name ASC
★ having
having(String sqlHaving
, Object
... params
)
having(boolean condition
, String sqlHaving
, Object
... params
)
having("sum(age) > 10")--->having
sum(age
) > 10
having("sum(age) > {0}", 11)--->having
sum(age
) > 11
★ func(func 方法,主要方便在出现if…else下调用不同方法能不断链)
func(Consumer
<Children> consumer
)
func(boolean condition
, Consumer
<Children> consumer
)
func(i
-> if(true) {i
.eq("id", 1)} else {i
.ne("id", 1)})
★ or(拼接、嵌套)
or()
or(boolean condition
)
主动调用or表示紧接着下一个方法不是用and连接
(不调用or则默认为使用and连接
)
eq("id",1).or().eq("name","老王")--->id
= 1 or name
= '老王'
or(Consumer
<Param> consumer
)
or(boolean condition
, Consumer
<Param> consumer
)
or(i
-> i
.eq("name", "李白").ne("status", "活着"))--->or
(name
= '李白' and status
<> '活着')
★ and(嵌套)
and(Consumer
<Param> consumer
)
and(boolean condition
, Consumer
<Param> consumer
)
and(i
-> i
.eq("name", "李白").ne("status", "活着"))--->and
(name
= '李白' and status
<> '活着')
★ nested(不带and或or的嵌套 )
nested(Consumer
<Param> consumer
)
nested(boolean condition
, Consumer
<Param> consumer
)
nested(i
-> i
.eq("name", "李白").ne("status", "活着"))--->(name
= '李白' and status
<> '活着')
★ apply(拼接sql)
apply(String applySql
, Object
... params
)
apply(boolean condition
, String applySql
, Object
... params
)
apply("id = 1")--->id
= 1
apply("date_format(dateColumn,'%Y-%m-%d') = '2008-08-08'")--->date_format(dateColumn
,'%Y-%m-%d') = '2008-08-08'"
)
apply("date_format(dateColumn,'%Y-%m-%d') = {0}", "2008-08-08")--->date_format(dateColumn
,'%Y-%m-%d') = '2008-08-08'"
)
★ last(无视优化规则直接拼接到sql 的最后,只能调用一次,多次调用以最后一次为准,有sql注入的风险)
last(String lastSql
)
last(boolean condition
, String lastSql
)
last("limit 1")
★ exists(拼接sql)
exists(String existsSql
)
exists(boolean condition
, String existsSql
)
exists("select id from table where age = 1")--->exists
(select id from table where age
= 1)
★ notExists(拼接sql)
notExists(String notExistsSql
)
notExists(boolean condition
, String notExistsSql
)
notExists("select id from table where age = 1")--->not exists
(select id from table where age
= 1)
2、QueryWrapper
继承AbstractWrapper,自身的内部属性 entity 也用于生成 where 条件及 LambdaQueryWrapper 可以通过 new QueryWrapper().lambda() 方法获取
★ select
select(String
... sqlSelect
)
select(Predicate
<TableFieldInfo> predicate
)
select(Class
<T> entityClass
, Predicate
<TableFieldInfo> predicate
)
以上方法分为两类:
第二类方法为:过滤查询字段
(主键除外
),入参不包含
class 的调用前需要wrapper内的entity属性有值
!
这两类方法重复调用以最后一次为准
select("id", "name", "age")
select(i
-> i
.getProperty().startsWith("test"))
3、UpdateWrapper
★ set(SQL SET 字段)
set(String column
, Object val
)
set(boolean condition
, String column
, Object val
)
set("name", "老李头")
set("name", "")--->数据库字段值变为空字符串
set("name", null
)--->数据库字段值变为null
★ setSql(设置 SET 部分 SQL)
setSql(String sql
)
setSql("name = '老李头'")
★ lambda
获取 LambdaWrapper ① 在QueryWrapper中是获取LambdaQueryWrapper ② 在UpdateWrapper中是获取LambdaUpdateWrapper
4、使用 Wrapper 自定义SQL
在使用了mybatis-plus之后,自定义SQL的同时也想使用Wrapper的便利应该怎么办? 在mybatis-plus版本3.0.7得到了完美解决 版本需要大于或等于3.0.7, 以下两种方案取其一即可。
★ Service.java
mysqlMapper
.getAll(Wrappers
.<MysqlData>lambdaQuery().eq(MysqlData
::getGroup
, 1));
★ 方案一 注解方式 Mapper.java
@Select("select * from mysql_data ${ew.customSqlSegment}")
List
<MysqlData> getAll(@Param(Constants
.WRAPPER
) Wrapper wrapper
);
★ 方案二 XML形式 Mapper.xml
<select id
="getAll" resultType
="MysqlData">
SELECT
* FROM mysql_data $
{ew
.customSqlSegment
}
</select
>