首先 建工程 导依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--lombok用来简化实体类-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
配置文件
数据库的连接 日志
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=0218
#mybatis 日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
实体类
package com.zxjy.mybatisplus.bean;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.Version;
import lombok.Data;
import java.util.Date;
@Data
public class User {
private Long id;
private String name;
private Integer age;
private String email;
@TableField(fill = FieldFill.INSERT)
private Date createTime;//创建时间
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;//修改时间
@Version
@TableField(fill = FieldFill.INSERT)
private Integer version;
@TableLogic
@TableField(fill = FieldFill.INSERT)
private Integer deleted;
}
测试 查询数据库中 的信息 .selectList(null)
@SpringBootTest
class MybatisPlusApplicationTests {
@Autowired
private UserMapper userMapper;
@Test//查询全部操作
void contextLoads() {
List<User> userList = userMapper.selectList(null);
System.out.println(userList);
}
添加操作.insert()
@Test// 添加操作
public void addUser(){
User user = new User();//不需要设置id值 mp会自动帮我们生成id值 是一串19位的阿拉伯数字 id值
user.setAge(16);
user.setEmail("didi@qq.com");
user.setName("didi2");
int insert = userMapper.insert(user);//调用insert方法 对数据进行添加操作
System.out.println("insert"+insert);
}
主键策略
1 自动增长策略 AUTO INCREMENT
2 UUID 每次都会生成一个随机的 唯一的值
3 Redis 生成id 可以设置步长
4 mp 自动生成19位的id策略
修改 根据id来修改
@Test
public void updata(){ //改
User user = new User();
user.setId(4L);
user.setAge(10);
int i = userMapper.updateById(user);
System.out.println(i);
}
mybatis自动填充 比如有两个属性 分别是 数据的创建时间 和修改时间 那么 我们可以用自动填充的方式 实现 一对数据库中的这一列进行操作时 就会更新它的时间
做法 第一步 在实体类中添加注解 @TableField
@TableField(fill = FieldFill.INSERT)
private Date createTime;//创建时间
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;//修改时间
@Version
@TableField(fill = FieldFill.INSERT)
private Integer version;
@TableLogic
@TableField(fill = FieldFill.INSERT)
private Integer deleted;
第二步 创建一个类 这个类去实现一个接口 重写它里面的两个方法
insertFill() 方法 ;表示在创建时 调用此方法
updateFill() 方法: 表示在修改时 调用此方法
package com.zxjy.mybatisplus.handler;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component
public class Myhandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("createTime",new Date(),metaObject);
this.setFieldValByName("updateTime",new Date(),metaObject);
this.setFieldValByName("version",1,metaObject);
this.setFieldValByName("deleted",0,metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime",new Date(),metaObject);
}
}
乐观锁: 解决某些问题
主要解决丢失更新
丢失更新:多个人 同时操作同一个数据 而最后提交的人会把前面修改的数据覆盖掉
这就叫丢失更新
乐观锁 :就是用版本的迭代来控制,比如 A这个人操作数据 操作完后 我们让版本自动的进行迭代
迭代完 如果B 这个人再拿着旧的版本去修改数据 就会操作不成功
应用场景;12306抢票 还剩一张票时 多个人同时看到这个票 对这个票进行操作 但是 只有一个人可以支付成功 这就是乐观锁的具体应用
代码中做法 :
1 在表中 和实体类中 添加一个 version 的字段 表示版本号
@Version
@TableField(fill = FieldFill.INSERT)
private Integer version;//乐观锁版本号
2 添加乐观锁插件 (在配置类中)
//乐观锁插件
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor(){
return new OptimisticLockerInterceptor();
}
3 设置给版本号设置自动填充功能
package com.zxjy.mybatisplus.handler;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component
public class Myhandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("createTime",new Date(),metaObject);
this.setFieldValByName("updateTime",new Date(),metaObject);
this.setFieldValByName("version",1,metaObject);
this.setFieldValByName("deleted",0,metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime",new Date(),metaObject);
}
}
多个id一起查
@Test
void seleidarr(){
userMapper.selectBatchIds(Arrays.asList(1401525839794180098L,1394683531236909057L));
//多个id 一起查
}
用Map 的方式 多条件查询(一般不用 有其他方式替代)
@Test
void mapselle(){
Map map=new HashMap();
map.put("name","张安");
map.put("age",11);
userMapper.selectByMap(map);
//这个 方法的意思就是 等于这个sql语句 select * from user where name='张安' and age=11;
}
分页查询 (重点)
做法
1 引入分页插件
/**
* 分页插件
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
2 实现分页操作
@Test
void pagesele(){
// 创建page 对象 参数表示 参数1;当前页 参数2;每页记录数
Page<User> page=new Page<>(1,3);
//把分页所有数据封装到page对中
userMapper.selectPage(page, null);
System.out.println(page.getCurrent());//当前页
System.out.println(page.getRecords());//每页数据list集合
System.out.println(page.getSize());//每页显示记录数
System.out.println(page.getTotal());//总记录数
System.out.println(page.getPages());//总页数
System.out.println(page.hasNext());//是否有下页
System.out.println(page.hasPrevious());//是否有上页
}
逻辑删除 ;并发真正的删除 数据还会存在表中 只是isdelete属性改为了1
做法
1 在实体类 和 数据库中添加属性 deleted 加上注解@TableLogic 这个的意思就是 如果删除 就是1 如果删除 就是0 默认是0
@TableLogic
@TableField(fill = FieldFill.INSERT)
private Integer deleted;
2 配置逻辑删除插件
/**配置逻辑删除插件*/
@Bean
public ISqlInjector sqlInjector() {
//配置逻辑删除插件
return new LogicSqlInjector();
}
测试
@Test
void delete(){
//删除 有配置逻辑删除 则执行逻辑删除 没有配置 则执行物理删除
userMapper.deleteById(1401529487169392642L);
}
性能分析插件:
通过这个插件 可以看到sql语句的执行时间,还可以设置超过某个时间的sql语句 让它不执行
/**
* SQL 执行性能分析插件
* 开发环境使用,线上不推荐。 maxTime 指的是 sql 最大执行时长
* 项目开发中的三种环境
* dev:开发环境
* test:测试环境
* prod:生产环境,表示正在给用户去用了
*/
@Bean
@Profile({"dev","test"})// 设置 dev test 环境开启 对dev test环境生效
public PerformanceInterceptor performanceInterceptor() {
PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
performanceInterceptor.setMaxTime(3000);//ms,超过此处设置的ms则sql不执行
performanceInterceptor.setFormat(true);
return performanceInterceptor;
}
配置项目开发的环境
#设置环境
spring.profiles.active=dev
QueryWrapper用于生成 sql 的 where 条件
高级查询
eq 即 =
@Test
void warpper(){
QueryWrapper queryWrapper=new QueryWrapper();
queryWrapper.eq("name", "张安");
userMapper.selectList(queryWrapper).forEach(System.out::println);
}
执行的sql语句与结果
ne 不等于
ne(“name”, “老王”)—>name <> ‘老王’
gt 大于 >
例: gt(“age”, 18)—>age > 18
大于等于 >=
例: ge(“age”, 18)—>age >= 18
lt 小于 <
例: lt(“age”, 18)—>age < 18
le 小于等于 <=
例: le(“age”, 18)—>age <= 18
#between
BETWEEN 值1 AND 值2
例: between(“age”, 18, 30)—>age between 18 and 30
#notBetween
NOT BETWEEN 值1 AND 值2
例: notBetween(“age”, 18, 30)—>age not between 18 and 30
like ‘%值%’
例: like(“name”, “王”)—>name like ‘%王%’
#notLike ‘%值%’
例: notLike(“name”, “王”)—>name not like ‘%王%’
#likeLeft
例: likeLeft(“name”, “王”)—>name like ‘%王’
#likeRight
例: likeRight(“name”, “王”)—>name like ‘王%’
#isNull
isNull(“name”)—>name is null
#isNotNull
isNotNull(“name”)—>name is not null
#in
in(“age”,{1,2,3})—>age in (1,2,3)
@Test
void isnotnull(){
QueryWrapper queryWrapper=new QueryWrapper();
//查询年纪不等于12 的
queryWrapper.ne("age",12);
//查询年纪大于12的
queryWrapper.gt("age",12);
//查询年纪大于或等于12 的
queryWrapper.ge("age",12);
//查询年纪小于12 的
queryWrapper.lt("age",12);
//查询年纪小于或等于12的
queryWrapper.le("age",12);
//范围之间 查询年纪在12 到24 之间的
queryWrapper.between("age",12,24);
}
mybatis plus官网
https://mp.baomidou.com/guide/wrapper.html#notin