ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

mybatis_plus通用枚举_配置多数据源_乐观锁

2022-09-09 00:31:06  阅读:227  来源: 互联网

标签:数据源 baomidou xzit private plus mybatis import com public


A、创建数据库db1

创建用户表

字段

中文

类型

长度

主键

自增

备注

Id

 

Bigint

19

Y

F

使用雪花算法主键

Name

用户名

Varchar

 

 

 

 

Password

密码

Varchar

 

 

 

 

Status

状态

 

 

 

 

0激活

1未激活

Create_time

注册时间

 

 

 

 

 

update_time

更新信息时间

 

 

 

 

 

使用Service完成用户表的功能测试

一、新增用户

1、ID使用雪花算法生成的主键

2、状态使用枚举类型

3、注册时间和更新信息时间使用自动填充

二、查询全部用户,密码不做回显

三、

使用ActiveRecord方式,完成用户表的修改功能测试

 

B、创建数据库db2

创建用户帐户表

字段

中文

类型

长度

主键

自增

备注

Id

 

Bigint

19

Y

F

使用雪花算法主键

Name

用户名

Varchar

 

 

 

 

Balance

余额

int

 

 

 

 

version

版本

 

 

 

 

 

 

配置动态数据源

在db2库中,完成对用户帐户表信息的修改,要求使用乐观锁插件配置

 

在pom.xml里导入多数据源依赖,

同时插入配置避免项目出错影响正常编译执行

There are test failures

参考链接https://blog.csdn.net/u011134399/article/details/79103093

<?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>
    <groupId>com.xzit</groupId>
    <artifactId>day5_job</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>day5_job</name>
    <description>day5_job</description>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
    </properties>

    <dependencies>
        <!--spring web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--mybatis plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>
        <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!--junit-->
        <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>
        <!--多数据源-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.7.RELEASE</version>
                <configuration>
                    <mainClass>com.xzit.Day5JobApplication</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <!--项目有错误时时仍正常编译运行,避免出现There are test failures报错-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <testFailureIgnore>true</testFailureIgnore>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

 

先创建一个枚举类

package com.xzit.enums;

import com.baomidou.mybatisplus.annotation.IEnum;

public enum StatusEnum implements IEnum<Integer> {
    UNACTIVE(0,"未激活"),
    ACTIVE(1,"激活");

    StatusEnum(Integer statusValue,String statusDesc){
        this.statusValue = statusValue;
        this.statusDesc = statusDesc;
    }

    private final Integer statusValue;
    private final String statusDesc;

    public String toString(){
        return this.statusDesc;
    }

    @Override
    public Integer getValue() {
        return this.statusValue;
    }
}

 

在application.yml里加上枚举类的全局配置,顺便把动态数据源也配置了,搞两个数据库连接上去,db1和db2

spring:
  datasource:
#    driver-class-name: com.mysql.cj.jdbc.Driver
#    url: jdbc:mysql://localhost:3306/mybatis?serverTimezone=GMT%2B8
#    username: root
#    password: zengyu1234
    dynamic:
      primary: db1 #设置默认的数据源或者数据源组,默认值即为master
      strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
      datasource:
        db1:
          url: jdbc:mysql://localhost:3306/db1?serverTimezone=GMT%2B8
          username: root
          password: zengyu1234
        db2:
          url: jdbc:mysql://localhost:3306/db2?serverTimezone=GMT%2B8
          username: root
          password: zengyu1234


mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    #配置数据库逻辑删除的字段
    # logic-delete-value: 1 # 逻辑已删除值(默认为 1)
    # logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
    db-config:
      logic-delete-field: deleted
      #配置主键id全局生成方式,遵循就近原则,比如方法中定义为雪花算法,则以方法为准
      id-type: auto
  type-enums-package: com.xzit.enums

 

创建User实体类,使用注解声明id使用雪花算法生产,状态使用枚举类型,注册时间和更新时间自动填充,并且声明密码查询不返回结果

package com.xzit.entity;

import com.baomidou.mybatisplus.annotation.*;
import com.xzit.enums.StatusEnum;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

import java.math.BigInteger;
import java.time.LocalDateTime;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
@TableName("user")
public class User {
    //1、ID使用雪花算法生成的主键
    @TableId(type = IdType.ASSIGN_ID)
    private Long id;
    private String name;
    //声明该密码字段查询不返回值
    //二、查询全部用户,密码不做回显
    @TableField(select = false)
    private String password;
    //创建并使用枚举类型
    private StatusEnum status;
    //3、注册时间和更新信息时间使用自动填充
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime create_time;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime update_time;
}

 

创建一个config包和config类,引入自动填充功能的配置,不做这个的话自动填充功能无法使用,注意create_time这个名字要和实体类里的字段名匹配

package com.xzit.config;

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;

@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        //在插入时完成自动填充功能
        this.strictInsertFill(metaObject, "create_time", () -> LocalDateTime.now(), LocalDateTime.class); // 起始版本 3.3.3(推荐)
        this.strictInsertFill(metaObject, "update_time", () -> LocalDateTime.now(), LocalDateTime.class); // 起始版本 3.3.3(推荐)
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        this.strictUpdateFill(metaObject, "update_time", () -> LocalDateTime.now(), LocalDateTime.class); // 起始版本 3.3.3(推荐)
    }
}

 

新建一个mapper接口继承baseMapper

package com.xzit.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xzit.entity.User;

public interface UserMapper extends BaseMapper<User> {
}

新建一个service接口类继承IService

package com.xzit.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.xzit.entity.User;

public interface UserService extends IService<User> {
}

创建一个service接口的实现类,用@DS注解,声明他用的是db1这个数据源,连接到db1这个数据库去查数据,同时要继承ServiceImpl这个方法,泛型加入mapper类和实体类,这样就实现了所有基本的方法,省去了一堆实现UserService必须要写的CRUD方法代码。create增,delete删,update改,read查

package com.xzit.service;

import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xzit.entity.User;
import com.xzit.mapper.UserMapper;
import org.springframework.stereotype.Service;

@Service
@DS("db1")
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}

 

编写测试类,实现功能

新增用户,

查询全部用户,密码不做回显

package com.xzit;

import com.xzit.entity.User;
import com.xzit.enums.StatusEnum;
import com.xzit.mapper.UserMapper;
import com.xzit.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;
import java.util.List;

@SpringBootTest
public class Day7JobTest {
    @Resource
    private UserService service;

    /**
     * 新增数据
     */
    @Test
    public void testSave(){
        User user = new User();
        user.setName("伊万").setPassword("1234").setStatus(StatusEnum.ACTIVE);
        boolean b = service.save(user);
        System.out.println(b);

    }

    /**
     * 查询全部数据
     */
    @Test
    public void testSelect(){
        List<User> list = service.list();
        list.forEach(System.out::println);
    }
}

执行结果

 

 

实体类继承Model即可实现ActiveRecord进行CRUD操作

package com.xzit.entity;

import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import com.xzit.enums.StatusEnum;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

import java.math.BigInteger;
import java.time.LocalDateTime;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
@TableName("user")
public class User extends Model<User> {
    //1、ID使用雪花算法生成的主键
    @TableId(type = IdType.ASSIGN_ID)
    private Long id;
    private String name;
    //声明该密码字段查询不返回值
    //二、查询全部用户,密码不做回显
    @TableField(select = false)
    private String password;
    //创建并使用枚举类型
    private StatusEnum status;
    //3、注册时间和更新信息时间使用自动填充
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime create_time;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime update_time;
}

 

编写测试类测试:

package com.xzit;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.xzit.entity.User;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class Day7JobTestActiveRecord {
    @Test
    public void update(){
        User user = new User();
        user.setName("安东").setPassword("abcd");
        UpdateWrapper wrapper=new UpdateWrapper();
        wrapper.eq("name","伊万");
        user.update(wrapper);
    }
}

执行效果:

 

 

配置一个MybatisPlus的config文件,加入乐观锁插件

package com.xzit.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;

@Configuration
public class MybatisPlusConfig {
    /**
     * MybatisPlus拦截器
     * @return
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        //加入分页插件
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2));
        //加入乐观锁插件
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return interceptor;
    }
}

创建对应数据库表的实体类,在version字段上加上注解

package com.xzit.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.Version;
import lombok.Data;

@Data
public class useraccount {
    @TableId(type = IdType.AUTO)
    private Integer id;
    private String name;
    private Integer balance;
    @Version
    private Integer version;
}

创建测试类,添加断点进行测试

package com.xzit;

import com.xzit.entity.Useraccount;
import com.xzit.mapper.UseraccountMapper;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;

@SpringBootTest
public class Day7JobTestLock {
    @Resource
    private UseraccountMapper mapper;

    /**
     * 测试中,使用断点调试,在useraccount.setBalance()时,在数据库中手动修改了version,本次操作失败
     */
    @Test
    public void testUpdate(){
        Useraccount useraccount = mapper.selectById(1);
        useraccount.setBalance(useraccount.getBalance()+500);//在此处添加断点
        mapper.updateById(useraccount);
    }
}

 

标签:数据源,baomidou,xzit,private,plus,mybatis,import,com,public
来源: https://www.cnblogs.com/zengyu1234/p/16667517.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有