其他分享
首页 > 其他分享> > 尚医通学习

尚医通学习

作者:互联网

1、MyBatis-Plus实现数据库crud

        1)、MyBatis-Plus是什么?

        MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

        2)、MyBatis-Plus入门案例:

        创建数据库 mybatis_plus:

create database mybatis-plus

        创建表:

CREATE TABLE USER
(
    id BIGINT(20)NOT NULL COMMENT '主键ID',
    NAME VARCHAR(30)NULL DEFAULT NULL COMMENT '姓名',
    age INT(11)NULL DEFAULT NULL COMMENT '年龄',
    email VARCHAR(50)NULL DEFAULT NULL COMMENT '邮箱',
    PRIMARY KEY (id)
);

        插入数据:

INSERT INTO user (id, name, age, email)VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');

        创建springboot工程

        导入相关依赖(统一使用springboot 2.2.1 版本)

        <!--mybatis-plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.3.1</version>
        </dependency>

        <!--mysql依赖-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <!--lombok用来简化实体类-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        创建实体类 User:

public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

        创建Mapper接口继承BaseMapper:

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.wyf.demomptest.entity.User;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserMapper extends BaseMapper<User> {

}

        配置文件:application.properties

# 应用名称
spring.application.name=demomptest
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true
spring.datasource.username=root
spring.datasource.password=13527343138

        主启动类:

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

@SpringBootApplication
@MapperScan("com.wyf.demomptest.mapper")
//由于BaseMapper是动态生成的对象,而动态生成的对象是默认找不到的,所以需要扫描进来
public class DemomptestApplication {

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

}

        测试:

@RunWith(SpringRunner.class)
@SpringBootTest
public class DemomptestApplicationTests {
    @Autowired
    private UserMapper mapper;
    //这里会爆红是因为UserMapper 找不到对象,因为UserMapper 是动态生成的
    //在接口UserMapper上加一个注解@Repository即可

    @Test
    public void findAll(){
        List<User> users = mapper.selectList(null);
        for (User user:users){
            System.out.println(user);
        }
    }

}

        测试结果:

         查看sql输出日志:在配置文件中加

#mybatis日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

        在此测试查看控制台输出

         添加操作:

    @Test
    public void testAdd(){
        User user=new User(null,"lucy",20,"123456@qq.com");
        int insert = mapper.insert(user);
        System.out.println(insert);
    }

        测试结果:

        表中数据:

        发现我们插入数据的时候并没有设置主键id,但是表中自己生成了主键id,这是由于MyBatis-Plus的主键策略。

        MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法)

@TableId(type = IdType.ASSIGN_ID)
private String id;

        雪花算法是由Twitter公布的分布式主键生成算法,它能够保证不同表的主键的不重复性,以及相同表的主键的有序性。

        修改操作:

    @Test
    public void testUpdate(){
        User user=new User(1457681848516091905L,"王大锤",22,"456798@qq.com");
        int i = mapper.updateById(user);
        System.out.println(i);
    }

         测试结果:

         多个id批量查询

    //多个id批量查询
    @Test
    public void testSelect(){
        //selectBatchIds 里面放入集合
        List<User> users = mapper.selectBatchIds(Arrays.asList(1, 2, 3));
        for (User user:users){
            System.out.println(user);
        }
    }

        测试结果:

         简单条件查询

     //简单条件查询
    @Test
    public void testSelect2(){
        Map<String,Object> map=new HashMap<>();
        map.put("name","Jack");
        map.put("age",20);
        List<User> users = mapper.selectByMap(map);
        for (User user:users){
            System.out.println(user);
        }
    }

        测试结果: 

        分页查询:

        配置分页插件

    /**
     * 分页插件
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }

        编写分页代码:创建page对象,传入两个参数(当前页和每页记录数),然后调用MyBatis-Plus的方法实现分页 

    //分页查询
    @Test
    public void testSelectPage(){
        Page<User> page=new Page<>(1,3);
        Page<User> userPage = mapper.selectPage(page, null);
        //返回对象得到分页所有数据

        long pages = userPage.getPages();//总页数
        System.out.println(pages);
        long current = userPage.getCurrent();//当前页
        System.out.println(current);
        List<User> records = userPage.getRecords();//查询数据集合
        System.out.println(records);
        long total = userPage.getTotal();//总记录数
        System.out.println(total);
        boolean hasNext = userPage.hasNext();//是否有后一页
        System.out.println(hasNext);
        boolean hasPrevious = userPage.hasPrevious();//是否有前一页
        System.out.println(hasPrevious);
    }

        测试结果:

3)、MyBatis-Plus自动填充(?)

        准备工作:在表中添加两个datetime类型的新字段:

        在表对应的实体类上添加对应的属性:

    private Date createTime;  //create_time
    private Date updateTime;  //update_time

         在实体类要进行自动填充的属性加上注解,指定是添加的时候有值,还是修改的时候有值

    @TableField(fill = FieldFill.INSERT)
    private Date createTime;  //create_time
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;  //update_time

        创建一个类实现接口,实现接口的两个方法,一个方法添加执行,一个方法修改执行,设置添加什么值。

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 {
    //mp执行添加操作的时候,这个方法就执行了
    @Override
    public void insertFill(MetaObject metaObject) {
        //三个值,第一个是添加时要执行的属性名字,第二个是对应的值,第三个是MetaObject对象
        this.setFieldValByName("crateTime",new Date(),metaObject);
    }
    //mp执行修改操作的时候,这个方法就执行了
    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("updateTime",new Date(),metaObject);

    }
}

        4)、乐观锁(?)

        主要适用场景:

        当要更新一条记录的时候,希望这条记录没有被别人更新,也就是说实现线程安全的数据更新

        乐观锁实现方式:

        取出记录时,获取当前version。更新时,带上这个version,执行更新时, set version = newVersion where version = oldVersion,如果version不对,就更新失败,接下来介绍如何在Mybatis-Plus项目中,使用乐观锁:

        在表中添加字段作为版本号,在表对应实体类添加版本号属性

        配置乐观锁的插件

import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@MapperScan("com.wyf.demomptest.mapper") //这时候可以将主启动类中的MapperScan注解加到这里来
public class MpConfig {
    /**
     * 乐观锁插件
     */
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
        return new OptimisticLockerInterceptor();
    }
}

 

标签:尚医通,学习,user,org,println,import,com,public
来源: https://blog.csdn.net/qq_51058681/article/details/121214023