Loading

mybatis-plus

pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.9</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.lu</groupId>
    <artifactId>mybatis_plus</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>mybatis_plus</name>
    <description>mybatis_plus</description>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    &lt;dependency&gt;
        &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
        &lt;artifactId&gt;spring-boot-starter-test&lt;/artifactId&gt;
        &lt;scope&gt;test&lt;/scope&gt;
    &lt;/dependency&gt;

    &lt;dependency&gt;
        &lt;groupId&gt;com.baomidou&lt;/groupId&gt;
        &lt;artifactId&gt;mybatis-plus-boot-starter&lt;/artifactId&gt;
        &lt;version&gt;3.4.0&lt;/version&gt;
    &lt;/dependency&gt;

    &lt;dependency&gt;
        &lt;groupId&gt;org.projectlombok&lt;/groupId&gt;
        &lt;artifactId&gt;lombok&lt;/artifactId&gt;
    &lt;/dependency&gt;

    &lt;dependency&gt;
        &lt;groupId&gt;com.mysql&lt;/groupId&gt;
        &lt;artifactId&gt;mysql-connector-j&lt;/artifactId&gt;
        &lt;version&gt;8.0.31&lt;/version&gt;
        &lt;scope&gt;runtime&lt;/scope&gt;
    &lt;/dependency&gt;

&lt;/dependencies&gt;

&lt;build&gt;
    &lt;plugins&gt;
        &lt;plugin&gt;
            &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
            &lt;artifactId&gt;spring-boot-maven-plugin&lt;/artifactId&gt;
        &lt;/plugin&gt;
    &lt;/plugins&gt;
&lt;/build&gt;

</project>

yml

spring:
  datasource:
    username: root
    password: root
    url: jdbc:mysql://localhost:3306/mybatis-plus?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL = false
    driver-class-name: com.mysql.cj.jdbc.Driver
#    设置开发环境
  profiles:
    active: dev
mybatis-plus:
  configuration:
    map-underscore-to-camel-case: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

global-config:
db-config:
logic-delete-field: flag # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)

MybatisPlusConfig
package com.lu.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer;
import com.baomidou.mybatisplus.core.injector.ISqlInjector;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.aop.interceptor.PerformanceMonitorInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.transaction.annotation.EnableTransactionManagement;


@MapperScan("com.lu.mapper")
@EnableTransactionManagement//配置事务默认开启
@Configuration//配置类
public class MybatisPlusConfig {

    //注册乐观锁
    //新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除)
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
        paginationInnerInterceptor.setDbType(DbType.MYSQL);
        paginationInnerInterceptor.setOverflow(true);
        interceptor.addInnerInterceptor(paginationInnerInterceptor);
        return interceptor;
    }

    @Bean
    public ConfigurationCustomizer configurationCustomizer() {
        return configuration -> configuration.setUseDeprecatedExecutor(false);
    }
    //sql执行效率插件



}

handler

MyMetaObjectHandler
package com.lu.handler;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.Date;

@Slf4j
@Component //一定不要忘记把处理器加到IOC容器中
public class MyMetaObjectHandler implements MetaObjectHandler {

//插入时的填充策略
@Override
public void insertFill(MetaObject metaObject) {
    log.info("start insert fill.... ");
    this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
    // 或者
    this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}

//更新时的填充策略
@Override
public void updateFill(MetaObject metaObject) {
    log.info("start update fill.... ");

    this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}

}

mapper

package com.lu.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.lu.pojo.User;
import org.springframework.stereotype.Repository;

import java.util.List;

//在mapper上继承基础的BaseMapper
@Repository//代表持久层
public interface UserMapper extends BaseMapper<User> {
//所以的crud已经编写完成了
//不需要像以前用于配置一大堆文件

}

pojo

package com.lu.pojo;

import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

import java.time.LocalDateTime;
import java.util.Date;

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class User {

//对应数据库中的主键(uuid、自增id、雪花算法、redis、zookeeper)
@TableId(type= IdType.AUTO)//一旦手动输入id之后,就需要自己配置id了
private Long id;

private String name;
private Integer age;
private String email;


//字段添加填充内容
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;

@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;

@Version//乐观锁
private Integer version;

@TableLogic//逻辑删除
private Integer deleted;

}

 测试类

package com.lu.mybatis_plus;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.lu.mapper.UserMapper;
import com.lu.pojo.User;
import lombok.var;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;
import java.util.*;
import static java.lang.System.out;

@SpringBootTest
class MybatisPlusApplicationTests {

@Resource
private UserMapper userMapper;

//查询
@Test
void contextLoads() {
    List&lt;User&gt; users = userMapper.selectList(null);
    users.forEach(System.out::println);
}
//测试插入
@Test
void Text(){
    User user = new User();
    user.setAge(17);
    user.setName("啊西巴");
    user.setCreateTime(null);
    user.setUpdateTime(null);
    user.setEmail("482475181@qq.com");
    userMapper.insert(user);

}
//更新操作
@Test
void Text1(){
    User user = new User();
    user.setId(12L);
    user.setAge(24);
    user.setName("张三丰");
    user.setEmail("184123207@qq.com");
    userMapper.updateById(user);


}
//乐观锁测试成功
@Test
void Text2(){
    User user = userMapper.selectById(1L);
    user.setName("lujiajian");
    user.setEmail("184123207@qq.com");
    //执行更新操作
    int i = userMapper.updateById(user);
}
//乐观锁测试失败
@Test
void Text3(){
    User user = userMapper.selectById(1L);
    user.setName("lujiajian1");
    user.setEmail("184123207@qq.com");

    //模拟另外一个线程执行插队操作
    User user2 = userMapper.selectById(1L);
    user.setName("lujiajian2");
    user.setEmail("184123207@qq.com");
    //执行更新操作
    userMapper.updateById(user2);
    userMapper.updateById(user);

}
//测试查询
@Test
void Text4(){
    User user = userMapper.selectById(1L);
    System.out.println(user);
}
//批量查询查询
@Test
void Text5(){
    List&lt;User&gt; users = userMapper.selectBatchIds(Arrays.asList(1,2,3));
    users.forEach(System.out::println);
}
//按条件查询
@Test
void Text6(){
    Map&lt;String, Object&gt; map = new HashMap&lt;&gt;();
    map.put("name","鲁家见");
    userMapper.selectByMap(map);
}
//分页插件
@Test
void Text7(){
    //参数一当前页
    //参数二页面大小
    Page&lt;User&gt; page = new Page&lt;&gt;(1,10);
    userMapper.selectPage(page, null);
    page.getRecords().forEach(System.out::println);
}
//测试删除
@Test
void Text8(){
    int i = userMapper.deleteById("1634815454079336474");
}
//测试批量删除
@Test
void Text9(){
    int i = userMapper.deleteBatchIds(Arrays.asList(1, 2, 3));
}
//根据条件删除
@Test
void Text10(){
    Map&lt;String, Object&gt; map = new HashMap&lt;&gt;();
    map.put("name","鲁家见");
    int i = userMapper.deleteByMap(map);
}
//复杂查询
@Test
void Text11(){
    //查询name不为空并且邮箱不为空,年龄大于12的用户
    QueryWrapper&lt;User&gt; Wrapper = new QueryWrapper&lt;&gt;();
    Wrapper

// .inSql("id","select id from user where id=11")
.isNotNull("name")
.isNotNull("email")
.ge("age",20);
List<User> users = userMapper.selectList(Wrapper);
users.forEach(out::println);
}
//查询名字等于付文博的
@Test
void Text12(){
QueryWrapper<User> Wrapper = new QueryWrapper<>();
Wrapper.eq("name","付文博");
List<User> users = userMapper.selectList(Wrapper);
users.forEach(out::println);
}
//查询年龄在20到30之间的用户并且name中带有付字的模糊查询
@Test
void Text13(){
QueryWrapper<User> Wrapper = new QueryWrapper<>();
Wrapper.between("age",20,30)
.likeRight("name","付");
List<User> users = userMapper.selectList(Wrapper);
users.forEach(out::println);
}
//通过id排序进行
@Test
void Text14(){
QueryWrapper<User> Wrapper = new QueryWrapper<>();
Wrapper.orderByAsc("id");
List<User> users = userMapper.selectList(Wrapper);
users.forEach(out::println);
}

}

启动类

package com.lu;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MybatisPlusApplication {

public static void main(String[] args) {
    SpringApplication.run(MybatisPlusApplication.class, args);
}

}

 

常用注解

@TableName

  • 描述:表名注解,标识实体类对应的表

  • 使用位置:实体类

@TableId

  • 描述:主键注解,标识实体类中的主键字段

  • 使用位置:实体类的主键字段

@TableField

  • 描述:普通字段注解
posted @ 2024-08-31 18:46  LL。。。  阅读(18)  评论(0)    收藏  举报  来源