Bootstrap

MyBatisPlus

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结构
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()查询分页数据
;