Lombok简单使用
创建实体类
- @NoArgsConstructor:添加无参构造
- @AllArgsConstructor:所有参数的有参构造
- @Setter:所有setter
- @Getter:所有getter
- @EqualsAndHashCode:重写equals和hashcode方法
- 以上所有注解可以通过@Data注解替代(没有所有参数的有参构造)
MyBatis-Plus
创建Mapper
- 继承BaseMapper泛型即实体类类型
- 在启动类上添加Mapper接口所在的包@MapperScan(“mapper包路径”)
- BaseMapper中包含了对单表的增删改查方法
- @Repository:将类或接口标识为持久层组件,避免使用Mapper接口动态实例的时候报红
添加日志功能
- mybatis-plus.configuration.log-impl:
org.apache.ibatis.logging.stdout.StdOutImpl - 配置完后就会输出执行的Sql语句
- 表名和实体类名对应,列名和属性对应
BaseMapper
增
- insert(实体类对象):id自动使用雪花算法生成,数据库中要采用bigInt,属性用long类型
删
- 根据Id删除:deleteById()
- 根据Map集合删除:集合中放的是删除的条件
//根据mao集合中所设置的条件删除
Map<String,Object> map = new HashMap<>();
map.put("name","张三");
map.put("age",19);
mapper.deleteByMap(map);
//DELETE user WHERE name = ? AND age = ?
- 批量删除: deleteBatchIds(Collection idList)
//通过多个id实现批量删除
List<Long> list = Arrays.asList(1L,2L,3L);
mapper.deleteBatchIds(list);
//DELETE FROM user WHERE id IN (?,?,?)
改
- updateById(实体类对象)
//UPDATE user SET xx = ? WHERE id = ?
User user = new User();
user.setId(1L);
user.setXXx(xx)
mapper.updateById(user);
查
- selectById():根据id查询
- selectBatchIds():传入存储了许多id的集合对象,根据多个id查询多个信息
- selectByMap():根据map集合条件查询
- selectList(条件构造器):通过条件构造器查询一个list集合,若没有条件,则可以设置null为参数
自定义功能
- resources下创建mapper文件夹,创建mybatis-mapper.xml文件
- 在mapper接口中自定义方法
- 将语句写入映射文件中
Service CRUD接口
- 通用Service CRUD封装Service接口,进一步封装CRUD,采用get查询单行,remove删除,list查询集合,page分页,前缀命名方式区分Mapper层避免混淆
- 反省T为任意实体对象
- 建议如果存在自定义通用Service方法的可能,创建自己的IBaseService继承Mybatis-Plus提供的基类
- 对象Wrapper为条件构造器
简单使用
- IService有现成的实现类ServiceImpl,但是功能不能满足需求,所以我们自己继承接口然后实现需要的功能
- 创建接口IUserService继承IService 泛型是实现类对象
- 创建IUserService接口的实现类UserServiceImpl,继承ServiceImpl。
- 【实现IUserService之后,由于IUserService继承了IService,UserServiceImpl实现类还需要实现IService的所有方法,但是由于IService有自己的实现类ServiceImppl,所以我们不需要自己亲自实现,继承ServiceImpl即可,ServiceImpl有两个泛型,一个是实体类的Mapper,一个是实体类】
- @Service:将service类标识为组件
- 批量添加:userService.saveBatch(Collection)【实际上是使用mapper中的insert方法循环添加的】
- saveOrUpdate():更新或添加,有id就更新,无id添加。
@TableName
数据库中的表名和实体类的名不一致的时候,会报错表不存在,因为语句操作的表名是由泛型决定的。
- 解决:在实体类上面加上注解@TableName(“表名”)
- 设置实体类所对应的表名
- 配置文件中可以设置MyBatis-Plus的全局配置表前缀
- mybatis-plus:global-config:db-config:table-prefix: 表名前缀
可以设置实体类所对应的表的统一前缀
TableId
mybatis-plus默认把id作为主键,但是CRUD会遇到不是以id为主键的时候。
- 解决:在想要作为主键的属性前加上@TableId注解,将属性所对应的字段指定为主键
- @Table注解有两个属性:
- value:属性名与表的主键列名不同的时候,可以通过value属性设置对应的列名。value属性用于指定主键的字段
- type:当前主键生成的策略,默认策略为雪花算法。AUTO为数据库ID自增,ASSIGN_ID为雪花算法
- 全局配置设置主键生成策略
mybatis-plus:global-config:db-config:id-type:auto自增
@TableField
除主键外其他的字段名和属性名不一致。
- 字段名有下划线,属性用的小驼峰:mybatis-plus默认将字段名的下划线转为小驼峰
- 其他情况,属性名和字段名不一致:@TableField()指定属性所对应的字段名,value值为字段名
逻辑删除 @TableLogic
- 在表中添加字段,实体类中设置对应属性名并且加上@TableLogic注解。之后再删除就会进行逻辑删除操作。将删除操作变成修改操作,将标志是否删除的字段修改为1,代表已删除(默认值为0)
- 查询就会自动查询未逻辑删除的数据
条件构造器
用来封装条件。
Wrapper:条件构造器抽象累,是顶端父类
AbstractWrapper:用于查询条件封装,生成sql的where条件
- QueryWrapper:查询条件封装
- UpdateWrapper:Update条件封装
- AbstractLambdaWrapper:使用Lambda语法
- LambdaQueryWrapper:用于Lambda语法使用的查询Wrapper
- LambdaUpdaWrapper:Lam更新封装Wrapper
QueryWrapper
主要用于查询和删除功能中
组装查询条件
- selectList(Wrapper queryWrapper)
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like("user_name","Tome").between("age",20,31).isNotNull("e_mail");
//like模糊查询,col字段名,val查找值
//isNotNull(col)字段名不为空的
List<User> list = mapper.selectList(queryWrapper);
- lt:less than 小于
- le:less than or equal to 小于等于
- eq:equal to 等于
- ne:not equal to 不等于
- ge:greater than or equal to 大于等于
- gt:greater than 大于
组装排序条件
//查询用户信息,按照年龄的降序排序,若年龄相同,则按照id升序排序
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper .orderByDesc("age").orderByAsc("uid");
List<User> list = mapper.selectList(queryWrapper);
组装删除条件
//邮箱地址为null的数据
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.isNull("e_mail");
List<User> list = mapper.delete(queryWrapper);
实现修改功能
//将(年龄大于20并且用户名钟包含有a)或邮箱为null的用户信息修改
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.gt("age",20).like("user_name","a").or().isNull("e_mail");
User user = new User();
user.setName("xxx")……
int res = userMapper.update(user,queryWrapper);
条件的优先级
//Lambda钟的条件优先执行
//将用户名钟包含a并且(年龄大于20或邮箱为null)的用户修改
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like("user_name","a").and(i -> i.gt("age",20).or().isNull("e_mail"));
User user = new User();
user.setName("xxx")……
int res = userMapper.update(user,queryWrapper);
组装select语句
//查询用户的用户名,年龄,邮箱信息
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.select("user_name","age","e_mail")
List<Map<String,Object>> maps= mapper.selectMaps(queryWrapper)
实现子查询
//查询id小于等于100的用户信息
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.inSql("uid","select uid from t_user where uid <= 100");
List<User> list = mapper.selectList(queryWrapper);
UpdateWrapper
可以更新数据也可以修改字段名
实现修改功能
//将用户名钟包含a并且(年龄大于20或邮箱为null)的用户修改
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
updateWrapper.like("User_name","a").and( i -> {
i.gt("age",20).or().isNull("e_mail")
});
updateWrapper.set("user_name","小黑");
int res = mapper.update(null,updateWrapper);
使用condition组装条件
String userName = "a";
Integer ageBegin = null;
Integer ageEnd = 30;
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like(StringUtils.isNotBlank(username),"user_name",username).ge(ageBegin != null,"age",ageBegin ).le(ageEnd != null,"age",ageEnd );
List<User> list = mapper.selectList(queryWrapper);
LambdaQueryWrapper
防止字段名写错
String userName = "a";
Integer ageBegin = null;
Integer ageEnd = 30;
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.like(StringUtils.isNotBlank(username),User::getName,username).ge(ageBegin != null,User::getAge,ageBegin ).le(ageEnd != null,User::getAge,ageEnd );
List<User> list = mapper.selectList(queryWrapper);
LambdaUpdateWrapper
//将用户名钟包含a并且(年龄大于20或邮箱为null)的用户修改
LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.like(User::getName,"a").and( i -> {
i.gt(User::getName,20).or().isNull(User::getEmail)
});
updateWrapper.set(User::getName,"小黑");
int res = mapper.update(null,updateWrapper);
插件
分页插件
- 配置类
- 最好将扫描mapper接口的注解放在配置类上
public class MybatisPlusConfig{
@Bean
public MybattisPlusInterceptor mybattisPlusInterceptor () {
MybattisPlusInterceptor interceptor = new MybattisPlusInterceptor ();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MySQL));
return interceptor;
}
}
- mapper.selectPage()查询分页数据