mybatis-plus
plus提供了许多对数据库的操作api,本文以mysql为例简单说明 对数据库操作的框架有 spring提供的jpa,tk-mapper,mybatis-plus最为欢迎,其中我是用最多的用的最顺手的为plus, 主要说一些使用心得和简单的操作语法
不开喜欢上来知直接粘贴一大堆代码,没什么用,直接说核心 ,后面在开法中使用心得会慢慢补上来,因为crud过于简单就没有写什么代码,后面如果遇到复杂的需求 会慢慢补上来
先啰嗦几句
在java8中有很多新特性,其中能提高开发性能的就是lambda表达式和stream流,一般lambda表达式在开发中可能不经常看到,如果有兴趣看源码的话,不难发现很多源码是有lambda的身影的,其中Stream中很多方法的形参就是lambda接口,两者结合能对数据结构做出非常灵活的操作,Stream本身就是流式编程的思想, 在开发中如果对于集合操作,使用Stream+lambda能写出绝对简洁 可读性非常高 性能不错的代码,而在plus中我们对条件的构造,一般都会使用条件构造,而在plus中也有支持lambda的条件构造器,这是我最喜欢的,因为可读性非常强,代码阅读性好,简单的展示段代码体验一下
// 我想得到没有删除的账号,开通时间在一定范围内,并且账号含有 admin 字符的账号集合
LambdaQueryWrapper<User> lambdaQuery = Wrappers.lambdaQuery();
lambdaQuery.like(User::getAccount,"admin")
.eq(User::getDeleteFlag,0)
.between(User::getCreatetime,"2020-01-01","2020-02-02");
List<User> users = userMapper.selectList(lambdaQuery);
//得到用户集合后我通过用户状态分组,然后的到用户名字的集合
Map<Integer, List<String>> collect = users.stream()
.collect(Collectors.groupingBy(
User::getState,
Collectors.mapping(User::getName, Collectors.toList()
))
);
很简单需求,如果手写sql不写代码也能实现,结合plus的条件构造,java8的新特性写出来的代码同上,简洁性 可读性非常高,这就是我对plus吸引我的地方,完成了简单的条件构造 也支持链式编程
在搭建工程
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.1.tmp</version>
</dependency>
yaml
server:
port: 9004 # 服务访问端口号
spring:
application:
name: tensquare-article #服务名称
datasource: # 数据库连接四大属性
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://192.168.200.128:3306/tensquare_article?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
username: root
password: root
logging:
level:
root: debug
mybatis-plus:
mapper-locations: classpath:/mapper/*Mapper.xml
启动类
@SpringBootApplication
@MapperScan("你mapper存放的包名全路径")
public class ArticleApplication {
public static void main(String[] args) {
SpringApplication.run(ArticleApplication.class, args);
}
/**
* 分布式自增id -plus提供
* @return
*/
@Bean
public Sequence sequence(){
return new Sequence();
}
// plus 分页插件
@Configuration
public class MyBatisPlusConfig {
@Bean
public PaginationInterceptor paginationInterceptor(){
return new PaginationInterceptor();
}
}
}
@Data
@TableName("sys_user") //数据库表名
public class User implements Serializable {
//数据库id是自增的 所以这里自增,insert数据不需要执行id 当然你也可以配置其他属性
@TableId(type = IdType.AUTO)
private Integer id;
private String username;
private String password;
@TableField("status") //执行数据库中字段名 一致的话可以不加此注解
private Integer status;
@TableField(exist = false)//不是数据库表中字段 就要打上 falsh标记
private List<Role> roles;
}
plus中id配置枚举类
public enum IdType {
/**
* 数据库ID自增
*/
AUTO(0),
/**
* 该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)
*/
NONE(1),
/**
* 用户输入ID
* <p>该类型可以通过自己注册自动填充插件进行填充</p>
*/
INPUT(2),
/* 以下3种类型、只有当插入对象ID 为空,才自动填充。 */
/**
* 分配ID (主键类型为number或string),
* 默认实现类 {@link com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator}(雪花算法)
*
* @since 3.3.0
*/
ASSIGN_ID(3),
/**
* 分配UUID (主键类型为 string)
* 默认实现类 {@link com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator}(UUID.replace("-",""))
*/
ASSIGN_UUID(4),
/**
* @deprecated 3.3.0 please use {@link #ASSIGN_ID}
*/
@Deprecated
ID_WORKER(3),
/**
* @deprecated 3.3.0 please use {@link #ASSIGN_ID}
*/
@Deprecated
ID_WORKER_STR(3),
/**
* @deprecated 3.3.0 please use {@link #ASSIGN_UUID}
*/
@Deprecated
UUID(4);
private final int key;
IdType(int key) {
this.key = key;
}
}
//mapper
public interface UserMapper extends BaseMapper<User> {
}
public interface UserService extends IService<User> {
}
@Service
@Transactional(rollbackFor = Exception.class)
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {}
这样的话我们就可以再实现类中用到框架给我们提供的方法,很多方法源码会有中文注释,这样的话 入门就轻松很多,只要你继承了他的类,就可以使用所有方法,日常的数据库操作 直接秒杀
先看框架为我们提供的方法
顶级 Service
public interface IService {}
mapper接口方法
public interface BaseMapper extends Mapper {}
可以看到mapper中和service中有很多相似的方法,但是也有不同的.他们没什么区别,至少从使用中感觉不到区别,注意看每个方法, 很多方法的参数都是 Wrapper 实际是就是条件构造器. 掌握了这个玩意,plus基本就能得心应手
条件构造器结构类图
LambdaQueryWrapper
QueryWrapper
在开发中我使用最多的就是这个两个构造器, 一个是LambdaUpdateWrapper 另一个 QueryWrapper
有了这两个对象,就可以构造条件 开发中不推荐直接 new 而是使用plus提供的工具类去得到他们,使用起来真的很简单,能满足多数需求
使用起来真的很简单,很灵活,能满足多数需求,在使用过成中过于简单,我主要记录一些平时我工作中常用的,有些不常用的我也不懂,请大家多多指教,官网里对于构造器的用法也有很多说明,这里不做赘述,如有时间后期会更新一些追源码的过程来分享,首次写博客,写的不好万望海涵!!!