创建数据库
DROP TABLE IF EXISTS user;
CREATE TABLE user
(
id BIGINT(20) NOT NULL COMMENT '主键ID',
name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
age INT(11) NULL DEFAULT NULL COMMENT '年龄',
email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (id)
);
创建表
DELETE FROM user;
INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');
导入相关依赖
<!-- 数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
数据库相关连接配置
#数据库连接配置
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
创建相应的pojo类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
// @TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String email;
}
编写mapper接口 并继承BaseMapper
@Repository//代表是持久层
public interface UserMapper extends BaseMapper<User> {
void selectList();
//所有的crud已经编写完成
}
编写一个mybatisplus 配置类
@EnableTransactionManagement
//扫描mapper
@MapperScan("com.zhou.mapper")
@Configuration//代表这是一个配置类
public class MYbatisPlusConfig {
//注册乐观锁插件
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor(){
return new OptimisticLockerInterceptor();
}
//分页插件
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
//逻辑删除组件
@Bean
public ISqlInjector sqlInjector(){
return new LogicSqlInjector();
}
//配置性能配置
@Bean
@Profile({"dev","test"})
public PerformanceInterceptor performanceInterceptor(){
PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
//设置sql的最大时间 如果超过了 不执行 毫秒
performanceInterceptor.setMaxTime(100);
//是否开启格式化
performanceInterceptor.setFormat(true);
return performanceInterceptor;
}
}
配个日志 查看sql语句等信息
```xml
#配置日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
直接用测试类测试
```java
@Autowired
private UserMapper userMapper;
@Test
public void add(){
User user = new User();
user.setId(5l);
user.setName("zhouwuyi");
user.setAge(13);
user.setEmail("111111");
userMapper.insert(user);
}
自动填充,比如创建时间与修改时间可以从数据库层面进行设置,也可以从代码层面实现
在实体类增加属性并配上注解
@TableField(fill = FieldFill.INSERT)
private Date create_time;
//插入更新填充
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date update_time;
编写处理器来处理这个注解
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
@Slf4j
@Component
//要注入
public class MyMetaObjectHander implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
//插入时的填充
log.info("start insert fill......");
this.setFieldValByName("create_time",new Date(),metaObject);
this.setFieldValByName("update_time",new Date(),metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
//更新时填充
log.info("start update fill......");
this.setFieldValByName("update_time",new Date(),metaObject);
}
}
乐观锁配置
1.增加version字段 version属性并注解
@Version
private Integer version;
2,在配置类中注册乐观锁插件
//注册乐观锁插件
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor(){
return new OptimisticLockerInterceptor();
}
分页查询
配置类注册分页插件
//分页插件
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
测试类
@Test
public void test6(){
//第一页 每页5个
//参数1 当前页 参数2 页面大小
Page<User> page = new Page<>(2,3);
userMapper.selectPage(page, null);
for (User record : page.getRecords()) {
System.out.println(record);
}
System.out.println(page.getTotal());
}
逻辑删除
相当于每个记录多了一个逻辑删除字段 当删除的时候我们只是把逻辑删除字段给变化了 而每次查询等操作都要带着逻辑查询字段
没删除就是0 删除了就是1
在实体类中增加属性
@TableLogic
private Integer deleted;
配置删除组件
//逻辑删除组件
@Bean
public ISqlInjector sqlInjector(){
return new LogicSqlInjector();
}
#配置逻辑删除
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0
#控制逻辑删除的字段
mybatis-plus.global-config.db-config.logic-delete-field=deleted;
性能分析插件
@Bean
@Profile({"dev","test"})
public PerformanceInterceptor performanceInterceptor(){
PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
//设置sql的最大时间 如果超过了 不执行 毫秒
performanceInterceptor.setMaxTime(100);
//是否开启格式化
performanceInterceptor.setFormat(true);
return performanceInterceptor;
}
重点 条件构造器
顾名思义 里面放的就是你要查询的条件
直接给几个例子去熟悉
@SpringBootTest
public class WapperTest {
@Autowired
public UserMapper userMapper;
@Test
public void test1(){
//查询name不为空且邮箱不为空的参数,年龄大于等于12
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper
.isNotNull("name")
.isNotNull("email")
//大于等于
.ge("age",12);
List<User> users = userMapper.selectList(wrapper);
for (User user : users) {
System.out.println(user);
}
}
@Test
public void test2(){
//查询name不为空且邮箱不为空的参数,年龄大于等于12
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper
.eq("name","Jack");
//查询一个
User user = userMapper.selectOne(wrapper);
System.out.println(user);
}
@Test
public void test3(){
//between and
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper
.between("age",20,30);
//查询结果数
Integer integer = userMapper.selectCount(wrapper);
System.out.println(integer);
}
@Test
public void test4(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
//模糊查询
//左和右就是百分号在哪儿 e%右查询
wrapper.notLike("name","a")
//邮箱号以t开头
.likeRight("email","t");
List<Map<String, Object>> maps = userMapper.selectMaps(wrapper);
for (Map<String, Object> map : maps) {
System.out.println(map);
}
}
@Test
public void test5(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
//内嵌查询
//id在子查询中查出来
wrapper.inSql("id","select id from user where id<4");
List<Object> objects = userMapper.selectObjs(wrapper);
for (Object object : objects) {
System.out.println(object);
}
}
@Test
public void test6(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
//通过id进行排序
wrapper
.orderByDesc("id");
List<Object> objects = userMapper.selectObjs(wrapper);
for (Object object : objects) {
System.out.println(object);
}
}
}