ICode9

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

尚医通学习

2021-11-08 22:06:43  阅读:263  来源: 互联网

标签:尚医通 学习 user org println import com public


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

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

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

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

ICode9版权所有