config
分页插件
//分页插件
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
sql执行效率插件
/**
* SQL执行效率插件
*/
@Bean
@Profile({"dev","test"})// 设置 dev test 环境开启
public PerformanceInterceptor performanceInterceptor() {
PerformanceInterceptor performanceInterceptor=new PerformanceInterceptor();
performanceInterceptor.setMaxTime(1000);//ms为单位,设置sql执行的最大时间,如果超过了规定的时间就会抛出异常
performanceInterceptor.setFormat(true);
return new PerformanceInterceptor();
}
乐观锁插件
//注册乐观锁插件
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
Test测试类
//测试乐观锁成功 ,单线程下
@Test
public void testOptimisticLocker(){
//查询用户信息
User user =userMapper.selectById(1L);
//修改用户信息
user.setName("张撒气");
user.setEmail("[email protected]");
//执行更新操作
int s = userMapper.updateById(user);
System.out.println(s);
}
@Test
//测试乐观锁失败 多线程下
public void testOptimisticLocker2(){
//线程1
//查询用户信息
User user =userMapper.selectById(1L);
//修改用户信息
user.setName("sjsad");
user.setEmail("[email protected]");
//执行更新操作,模拟另外一个线程进行了插队操作
User user2 =userMapper.selectById(1L);
//修改用户信息
user2.setName("李斯");
user2.setEmail("[email protected]");
int s = userMapper.updateById(user2);
int a=userMapper.updateById(user);//如果没有乐观锁就会覆盖插对线程的值
System.out.println(s);
}
//测试查询
@Test
public void testselectById(){
User user = userMapper.selectById(1L);
System.out.println(user);
}
//一次查询多个。批量
@Test
public void testselectByBatchId(){
List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));
users.forEach(System.out::println);
}
//条件查询 map
@Test
public void testselectByBatchIds(){
HashMap<String,Object> map=new HashMap<>();
//自定义要查询的.多条件查询
map.put("name","李斯");
map.put("age","20");
List<User> users = userMapper.selectByMap(map);
users.forEach(System.out::println);
}
//测试分页查询
@Test
public void testPage(){
Page<User> page = new Page<>(1,5);//参数以:第一页,参数二:每页5条信息
userMapper.selectPage(page,null);
page.getRecords().forEach(System.out::println);
System.out.println("一共多少条"+page.getTotal());//总共多少条
System.out.println("是否有上一页"+page.hasPrevious());//是否有上一页
System.out.println("是否有下一页"+page.hasNext());//是否有下一页
System.out.println("得到他的大小"+page.getSize());//得到它的大小
System.out.println("得到当前参数"+page.getCurrent());//得到当前参数
System.out.println("获得所有的记录"+page.getRecords());//获得所有的记录
}
//自动处理时间格式,自动填充
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
//插入时自动填充策略
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("createTime",new Date(),metaObject);
this.setFieldValByName("updateTime",new Date(),metaObject);
}
//更新时自动插入策略
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime",new Date(),metaObject);
}
}
pom.xml:
<properties>
<java.version>1.8</java.version>
</properties>
<!--数据库驱动-->
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</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>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
application.yml
server:
port: 8080
#数据库链接配置
spring:
datasource:
username: root
password: 123456
url: jdbc:mysql://localhost:3306/mybatis_plus?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
driver-class-name: com.mysql.cj.jdbc.Driver
# sql执行效率,执行的慢报错
profiles:
active: dev
mybatis-plus:
global-config:
db-config:
logic-delete-field: flag #全局逻辑删除字段值 3.3.0开始支持,详情看下面。
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
#日志
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
MyBatisPlus里的
//wrapper的
@SpringBootTest
public class WrapperTest {
@Autowired
private UserMapper userMapper;
@Test
void contextLoads(){
//查询name不为空的用户i,并且邮箱不为空的用户,年龄大于12
QueryWrapper<User> wrapper=new QueryWrapper<User>();//和map相似
wrapper.isNotNull("name");
wrapper.isNotNull("email");
wrapper.ge("age",12);
userMapper.selectList(wrapper).forEach(System.out::println);
}
@Test
void test2(){
//查询名字
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("name","李斯");//查询一个数据,多个数据使用list、map
User user = userMapper.selectOne(wrapper);
System.out.println(user);
}
@Test
void test3(){
//查询年龄在20-30之间的
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.between("age","20",30);//区间
Integer count = userMapper.selectCount(wrapper);//查询结果数
System.out.println("结果"+count);
}
@Test
void test4(){
//模糊查询
//名字里面不包含e,且邮箱号以t开头 t%
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.notLike("name","e");
wrapper.likeRight("email","t");
List<Map<String, Object>> maps = userMapper.selectMaps(wrapper);
maps.forEach(System.out::println);
}
@Test
void test5(){
//模糊查询
QueryWrapper<User> wrapper = new QueryWrapper<>();
//id在子查询中查询出来,拼接sql
wrapper.inSql("id","select id from user where id<3");
List<Object> objects = userMapper.selectObjs(wrapper);
objects.forEach(System.out::println);
}
@Test
void test6(){
//排序
QueryWrapper<User> wrapper = new QueryWrapper<>();
//通过id进行降序排序orderByDesc("id");
wrapper.orderByAsc("id");//升序排序
List<User> users = userMapper.selectList(wrapper);
users.forEach(System.out::println);
}