一、注解的作用
@TableName("数据库名字") 1.字符串类型,不是必填,用来指定数据表名称 @TableId(主键) 1.当实体类没有@TableId默认id为主键 2.当实体类有@TableId,字段为主键 3.CRUD操作时主键不允许被修改,其余字段均被拼接,(warpper>@TableId>默认id) @TableField("非主键名称") 1.字段注解,该注解用于标识非主键的字段。将数据库列与 JavaBean 中的属性进行映射 @TableLogic 注解用于实现数据库数据逻辑删除。注意,该注解只对自动注入的 sql 起效,如:private int a=0 @EnumValue @Version 实现乐观锁,该注解用于字段上面。(需要配置) @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
二、条件构造器
查删增:
QueryWrapper queryWrapper = new QueryWrapper();
改:
UpdateWrapper updateWrapper = new UpdateWrapper();
在 IService 中提供了一个 query 方法,该方法返回 QueryChainWrapper 对象。我们可以使用该对象实现链式查询,避免每次都创建 QueryWrapper 对象。query 方法定义如下:
List<Zzg> list = zzgService.query()
.eq("name","aa")
.eq("age",2)
.list();
或
zzgService.query().eq("name","aa").eq("age",2).list()
1.allEq条件:
注释:对应的 SQL 语句,是否忽略 value 等于 null 的条件
// 示例1:
Map<String,Object> params = new HashMap<>();
params.put("age", null);
params.put("sex", "男");
allEq(params )
// 对应的 SQL 语句
sex = '男' and age is null
// 示例2:
Map<String,Object> params = new HashMap<>();
params.put("age", null);
params.put("sex", "男");
allEq(params , false)
// 对应的 SQL 语句,忽略了 value 等于 null 的条件
sex = '男'
2.eq(等于),ne(不等于)
3.gt(大于>),ge(大于等于>=),lt(小于<),le(小于等于<=)
4.between和notBetween(在什么之间用and连接)
wrapper.between("age", 18, 30);
5.like(模糊查询) notlike(模糊查询) likeLeft(左模糊查询 “%like”) likeRight(右模糊查询 “like%”)
6.isNull isNotNull
7.in notIn(或者)
8.inSql notInSql (子查询)
wrapper.inSql("user_id", "select user_id from user where user_id<10");
9.orderByAsc orderByDesc (排序)
10.exists notExists(拼接EXISTS sql语句)
-
existsSql:exists SQL 语句
-
condition:用于指定当前这个条件是否有效;如果为 true,则应用当前条件;如果为 false,则忽略当前条件
注释:sql存在existsSql返回true否则false
exists(String existsSql)
exists(boolean condition, String existsSql)
11.last (追加一个sql语句)
-
last 行数将无视 SQL 的优化规则,直接指定的 SQL 拼接到 SQL 的最后
-
last 函数只能调用一次,如果多次调用,以最后一次调用为准(有sql注入的风险,请谨慎使用)
注释:函数只能调用一次,如果多次调用,以最后一次调用为准(有sql注入的风险,请谨慎使用)
last(String lastSql)
last(boolean condition, String lastSql)
//案例
QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.last("limit 1,10");
//sql
SELECT user_id,name,sex,age,face,salary,borthday
FROM user limit 1,10
12.apply (拼接sql)
-
applySql:要拼接的 SQL 语句,该 SQL 语句中可能会有 {0}、{1}、...、{n} 等字符串,用来替换参数。
-
params:参数列表,用于替换 applySql SQL 语句中的 {0}、{1}、...、{n} 等
-
condition:用于指定当前这个条件是否有效;如果为 true,则应用当前条件;如果为 false,则忽略当前条件。
apply(String applySql, Object... params)
apply(boolean condition, String applySql, Object... params)
//案例
// 拼接:id = 100
apply("id = 100");
// 拼接:date_format(dateColumn,'%Y-%m-%d') = '2018-08-08'")
apply("date_format(dateColumn,'%Y-%m-%d') = '2018-08-08'")
// 拼接:date_format(dateColumn,'%Y-%m-%d') = '2018-08-08'")
apply("date_format(dateColumn,'%Y-%m-%d') = {0}", "2018-08-08")
13.nested(嵌套sql)
-
consumer:构造内嵌SQL条件
-
condition:用于指定当前这个条件是否有效;如果为 true,则应用当前条件;如果为 false,则忽略当前条件。
nested(Consumer<Param> consumer)
nested(boolean condition, Consumer<Param> consumer)
//查询所有姓黄,性别为男,年龄大于 30,薪水大于 9000 的用户信息,如下:
QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.likeRight("name", "黄");
wrapper.nested(new Consumer<QueryWrapper<UserBean>>() {
@Override
public void accept(QueryWrapper<UserBean> userBeanQueryWrapper) {
userBeanQueryWrapper.eq("sex", "男")
.gt("age", 30).gt("salary", 9000);
}
});
//sql语句
SELECT user_id,name,sex,age,face,salary,borthday
FROM user
WHERE (name LIKE ? AND (sex = ? AND age > ? AND salary > ?))
14.groupBy(分组)
groupBy(R... columns)
groupBy(boolean condition, R... columns)
15.or和and(语句拼接)
or()
or(boolean condition)
//or嵌套
or(Consumer<Param> consumer)
or(boolean condition, Consumer<Param> consumer)
//and嵌套
and(Consumer<Param> consumer)
and(boolean condition, Consumer<Param> consumer)
//实例
QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.and(new Consumer<QueryWrapper<UserBean>>() {
@Override
public void accept(QueryWrapper<UserBean> userBeanQueryWrapper) {
userBeanQueryWrapper.eq("sex", "男")
.between("salary", 5000, 6000);
}
});
wrapper.and(new Consumer<QueryWrapper<UserBean>>() {
@Override
public void accept(QueryWrapper<UserBean> userBeanQueryWrapper) {
userBeanQueryWrapper.gt("age", 30)
.likeRight("name", "黄");
}
});
三、Service CRUD 接口
1.Save(添加)
// 插入一条记录(选择字段,策略插入)
boolean save(T entity);
// 插入(批量)
boolean saveBatch(Collection<T> entityList);
// 插入(批量)
注释:int batchSize 将数据分成多个批次,每个批次数量为batchSize
boolean saveBatch(Collection<T> entityList, int batchSize);
2.SaveOrUpdate(修改)
// TableId 注解存在更新记录,否插入一条记录
注释:@TableId 作为修改的条件,无匹配项这插入一条数据
boolean saveOrUpdate(T entity);
// 根据updateWrapper尝试更新,否继续执行saveOrUpdate(T)方法
注释:先根据wrapper条件进行匹配当不满足条件时执行saveOrUpdate(T)方法
(考虑是否有@TableId否是根据id)
boolean saveOrUpdate(T entity, Wrapper<T> updateWrapper);
// 批量修改插入
注释:无匹配则插入
boolean saveOrUpdateBatch(Collection<T> entityList);
// 批量修改插入
boolean saveOrUpdateBatch(Collection<T> entityList, int batchSize);
3.Update(修改)
// 根据 UpdateWrapper 条件,更新记录 需要设置sqlset
boolean update(Wrapper<T> updateWrapper);
// 根据 whereWrapper 条件,更新记录
boolean update(T updateEntity, Wrapper<T> whereWrapper);
// 根据 ID 选择修改
boolean updateById(T entity);
// 根据ID 批量更新
boolean updateBatchById(Collection<T> entityList);
// 根据ID 批量更新
boolean updateBatchById(Collection<T> entityList, int batchSize);
4.Romove(删除)
注解:跟据字段名和字段值进行删除
// 根据 entity 条件,删除记录
boolean remove(Wrapper<T> queryWrapper);
// 根据 ID 删除
boolean removeById(Serializable id);
// 根据 columnMap 条件,删除记录
boolean removeByMap(Map<String, Object> columnMap);
// 删除(根据ID 批量删除)
boolean removeByIds(Collection<? extends Serializable> idList);
5. Get(查询)
// 根据 ID 查询
T getById(Serializable id);
// 根据 Wrapper,查询一条记录。结果集,如果是多个会抛出异常,随机取一条加上限制条件 wrapper.last("LIMIT 1")
T getOne(Wrapper<T> queryWrapper);
// 根据 Wrapper,查询一条记录
注释:throwEx:有多个 result 是否抛出异常
T getOne(Wrapper<T> queryWrapper, boolean throwEx);
// 根据 Wrapper,查询一条记录
Map<String, Object> getMap(Wrapper<T> queryWrapper);
// 根据 Wrapper,查询一条记录
<V> V getObj(Wrapper<T> queryWrapper, Function<? super Object, V> mapper);
6.List(查询)
// 查询所有
List<T> list();
// 查询列表
List<T> list(Wrapper<T> queryWrapper);
// 查询(根据ID 批量查询)
Collection<T> listByIds(Collection<? extends Serializable> idList);
// 查询(根据 columnMap 条件)
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);
// 根据 Wrapper 条件,查询全部记录
List<Object> listObjs(Wrapper<T> queryWrapper);
// 根据 Wrapper 条件,查询全部记录
<V> List<V> listObjs(Wrapper<T> queryWrapper, Function<? super Object, V> mapper);
7.Page分页查询
配置分页插件:
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyBatisPlusConfig {
/**
* 分页插件配置
*
* @return
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 向MyBatis-Plus的过滤器链中添加分页拦截器,需要设置数据库类型(主要用于分页方言)
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
注释:3为页数,5为每页的最大数据
Page<UserBean> page = new Page(3, 5);
// 无条件分页查询
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();
// 根据 Wrapper 条件,查询总记录数
int count(Wrapper<T> queryWrapper);
四、Mapper CRUD接口
1.Insert(添加)
// 插入一条记录
int insert(T entity);
2.Delete(删除)
// 根据 entity 条件,删除记录
int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper);
// 删除(根据ID 批量删除)
int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
// 根据 ID 删除
int deleteById(Serializable id);
// 根据 columnMap 条件,删除记录
int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
3. Update(更新)
// 根据 whereWrapper 条件,更新记录
int update(@Param(Constants.ENTITY) T updateEntity, @Param(Constants.WRAPPER) Wrapper<T> whereWrapper);
// 根据 ID 修改
int updateById(@Param(Constants.ENTITY) T entity);
4.Select(查询)
// 根据 ID 查询
T selectById(Serializable id);
// 根据 entity 条件,查询一条记录
T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 查询(根据ID 批量查询)
List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
// 根据 entity 条件,查询全部记录
List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 查询(根据 columnMap 条件)
List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
// 根据 Wrapper 条件,查询全部记录
List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 根据 Wrapper 条件,查询全部记录。注意: 只返回第一个字段的值
List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 根据 entity 条件,查询全部记录(并翻页)
IPage<T> selectPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 根据 Wrapper 条件,查询全部记录(并翻页)
IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 根据 Wrapper 条件,查询总记录数
Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
五、无聊的小知识
1.Jdbc驱动:高版本兼容低版本,com.mysql.cj.jdbc.Driver(高) com.mysql.jdbc.Driver(低)
2.当warpper为null时查询全部
3.配置日志:默认的控制台输出
mybatis-plus:
mapper-locations: classpath:mapper/*.xml #配置映射文件
type-aliases-package: com.example.test.entity #配置实体类
#配置日志 打印sql语句
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl