项目day(1) mybatis-plus
一、项目准备
1.1 项目整体架构
1.2 项目配置
-
jdk1.8
-
utf-8
-
maven路径
1.3 pom包
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
1.4 jdbc驱动
1.5 数据库分库分表
1.6 其他补充
- cap
- 雪花算法
1.7 mybatis-plus
1.7.1乐观锁
- MyBatisConfiguration
- 配合@version使用
package com.ybx.sunshine.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@Configuration
@EnableTransactionManagement
public class MyBatisConfiguration {
//乐观锁,配合注解@version使用
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
// 主要是这行代码,加上就可以了
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return interceptor;
}
}
- @version
package com.ybx.sunshine.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@TableName(value = "user")
//@NoArgsConstructor
public class User {
// 默认是雪花算法
// @TableId(type = IdType.ASSIGN_ID)
//这里是自增功能的实现
@TableId(type = IdType.AUTO)
long id;
String name;
int age;
@TableField(fill = FieldFill.INSERT)
Date createTime;
@TableField(fill = FieldFill.UPDATE)
Date UpdateTime;
//乐观锁
@Version
int version;
}
- 乐观锁应用小案例
@Test
public void testOptmistticLock(){
User user1 = userMapper.selectById(1l);
User user2 = userMapper.selectById(1l);
user1.setAge(user1.getAge() + 50);
user2.setAge(user2.getAge() - 30);
int i = userMapper.updateById(user1);
int i1 = userMapper.updateById(user2);
System.out.println(i + " " + i1);
}
1.7.2 自动填充
- @TableField
package com.ybx.sunshine.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@TableName(value = "user")
//@NoArgsConstructor
public class User {
// 默认是雪花算法
// @TableId(type = IdType.ASSIGN_ID)
//这里是自增功能的实现
@TableId(type = IdType.AUTO)
long id;
String name;
int age;
@TableField(fill = FieldFill.INSERT)
Date createTime;
@TableField(fill = FieldFill.UPDATE)
Date UpdateTime;
//乐观锁
@Version
Integer version;
}
package com.ybx.sunshine.MetaObjectHandler;
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 MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
System.out.println("插入新的数据");
this.setFieldValByName("createTime",new Date(), metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
System.out.println("更新了");
this.setFieldValByName("updateTime",new Date(), metaObject);
}
}
1.7.3 条件查询
@Test
public void batchSelect(){
//批量查询
List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));
users.forEach(System.out::print);
HashMap<String,Object> hashMap = new HashMap<>();
hashMap.put("name","tom");
hashMap.put("age",112);
//多条件查询
List<User> users1 = userMapper.selectByMap(hashMap);
users1.forEach(System.out::print);
}
1.7.4 分页
- 添加分页拦截器
package com.ybx.sunshine.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@Configuration
@EnableTransactionManagement
public class MyBatisConfiguration {
//乐观锁,配合注解@version使用
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
// 主要是这行代码,加上就可以了
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
//添加分页拦截器
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return interceptor;
}
}
- 分页测试
@Test
public void pageSelect(){
//每页5条记录,选择第一页
Page<User> userPage = new Page<>(1, 5);
//第二个参数是复杂条件
Page<User> userPage1 = userMapper.selectPage(userPage, null);
List<User> records = userPage1.getRecords();
records.forEach(System.out::print);
System.out.println(userPage.getPages());//总页数
System.out.println(userPage.getSize()); //当前页的记录数
System.out.println(userPage.getTotal());//总记录数
System.out.println(userPage.hasNext());//有没有下一页
System.out.println(userPage.hasPrevious());//有没有前一页
System.out.println(userPage.getCurrent());//当前页码
}
- 分页只查看前两列数据
@Test
public void pageSelect(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.select("name","age");
//每页5条记录,选择第一页
Page<Map<String,Object>> userPage = new Page<>(1, 5);
//第二个参数是复杂条件
Page<Map<String,Object>> userPage1 = userMapper.selectMapsPage(userPage,wrapper);
List<Map<String,Object>> records = userPage1.getRecords();
records.forEach(System.out::print);
System.out.println(userPage.getPages());//总页数
System.out.println(userPage.getSize()); //当前页的记录数
System.out.println(userPage.getTotal());//总记录数
System.out.println(userPage.hasNext());//有没有下一页
System.out.println(userPage.hasPrevious());//有没有前一页
System.out.println(userPage.getCurrent());//当前页码
}
1.7.5 逻辑删除
@TableLogic
Integer deleted;
- 数据库中对应字段
- 逻辑删除,数据被删除deleted变为1
- 逻辑删除yml配置,可配可不配
#mybatis输出日志
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
#主键生成策略
global-config:
db-config:
id-type: auto
#逻辑删除是1,没删是0
logic-delete-value: 1
logic-not-delete-value: 0
1.7.6 条件构造器
- wrapper
- 条件方法