在线教育1--mybatis-plus

首先 建工程 导依赖




    <dependencies>

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter</artifactId>

        </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>

        <!--mybatis-plus-->

        <dependency>

            <groupId>com.baomidou</groupId>

            <artifactId>mybatis-plus-boot-starter</artifactId>

            <version>3.0.5</version>

        </dependency>

        <!--mysql-->

        <dependency>

            <groupId>mysql</groupId>

            <artifactId>mysql-connector-java</artifactId>

        </dependency>

        <!--lombok用来简化实体类-->

        <dependency>

            <groupId>org.projectlombok</groupId>

            <artifactId>lombok</artifactId>

        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>RELEASE</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>RELEASE</version>
            <scope>compile</scope>
        </dependency>

    </dependencies>










    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

配置文件
数据库的连接 日志

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=0218


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

实体类

package com.zxjy.mybatisplus.bean;


import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.Version;
import lombok.Data;

import java.util.Date;

@Data
public class User {


    private  Long id;

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


    @TableField(fill = FieldFill.INSERT)
    private Date createTime;//创建时间

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;//修改时间

    @Version
    @TableField(fill = FieldFill.INSERT)
    private  Integer version;


    @TableLogic
    @TableField(fill = FieldFill.INSERT)
    private Integer deleted;

}

测试 查询数据库中 的信息 .selectList(null)

@SpringBootTest
class MybatisPlusApplicationTests {


    @Autowired
    private UserMapper userMapper;

    @Test//查询全部操作
    void contextLoads() {

        List<User> userList = userMapper.selectList(null);
        System.out.println(userList);
    }

添加操作.insert()



    @Test// 添加操作
    public void addUser(){
        User user = new User();//不需要设置id值  mp会自动帮我们生成id值  是一串19位的阿拉伯数字  id值
        user.setAge(16);
        user.setEmail("didi@qq.com");
        user.setName("didi2");

        int insert = userMapper.insert(user);//调用insert方法  对数据进行添加操作

        System.out.println("insert"+insert);

    }

主键策略
1 自动增长策略 AUTO INCREMENT

2 UUID 每次都会生成一个随机的 唯一的值

3 Redis 生成id 可以设置步长

4 mp 自动生成19位的id策略

修改 根据id来修改


    @Test
    public  void updata(){   //改

        User user = new User();
        user.setId(4L);
        user.setAge(10);

        int i = userMapper.updateById(user);
        System.out.println(i);

    }


mybatis自动填充 比如有两个属性 分别是 数据的创建时间 和修改时间 那么 我们可以用自动填充的方式 实现 一对数据库中的这一列进行操作时 就会更新它的时间
做法 第一步 在实体类中添加注解 @TableField

   @TableField(fill = FieldFill.INSERT)
    private Date createTime;//创建时间

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;//修改时间

    @Version
    @TableField(fill = FieldFill.INSERT)
    private  Integer version;


    @TableLogic
    @TableField(fill = FieldFill.INSERT)
    private Integer deleted;

第二步 创建一个类 这个类去实现一个接口 重写它里面的两个方法
insertFill() 方法 ;表示在创建时 调用此方法
updateFill() 方法: 表示在修改时 调用此方法

package com.zxjy.mybatisplus.handler;

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 Myhandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        this.setFieldValByName("createTime",new Date(),metaObject);
        this.setFieldValByName("updateTime",new Date(),metaObject);
        this.setFieldValByName("version",1,metaObject);
        this.setFieldValByName("deleted",0,metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {

        this.setFieldValByName("updateTime",new Date(),metaObject);
    }
}

乐观锁: 解决某些问题
主要解决丢失更新
丢失更新:多个人 同时操作同一个数据 而最后提交的人会把前面修改的数据覆盖掉
这就叫丢失更新

乐观锁 :就是用版本的迭代来控制,比如 A这个人操作数据 操作完后 我们让版本自动的进行迭代
迭代完 如果B 这个人再拿着旧的版本去修改数据 就会操作不成功

应用场景;12306抢票 还剩一张票时 多个人同时看到这个票 对这个票进行操作 但是 只有一个人可以支付成功 这就是乐观锁的具体应用

代码中做法 :
1 在表中 和实体类中 添加一个 version 的字段 表示版本号

  @Version
    @TableField(fill = FieldFill.INSERT)
    private  Integer version;//乐观锁版本号

2 添加乐观锁插件 (在配置类中)

  //乐观锁插件
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor(){
        return new  OptimisticLockerInterceptor();
    }

3 设置给版本号设置自动填充功能

package com.zxjy.mybatisplus.handler;

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 Myhandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        this.setFieldValByName("createTime",new Date(),metaObject);
        this.setFieldValByName("updateTime",new Date(),metaObject);
        this.setFieldValByName("version",1,metaObject);
        this.setFieldValByName("deleted",0,metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {

        this.setFieldValByName("updateTime",new Date(),metaObject);
    }
}

多个id一起查

    @Test
    void seleidarr(){
        userMapper.selectBatchIds(Arrays.asList(1401525839794180098L,1394683531236909057L));
        //多个id 一起查
    }

用Map 的方式 多条件查询(一般不用 有其他方式替代)

    @Test 
    void mapselle(){
        Map map=new HashMap();
        map.put("name","张安");
        map.put("age",11);
        userMapper.selectByMap(map); 
        //这个 方法的意思就是  等于这个sql语句   select * from user where name='张安' and age=11;   
    }

分页查询 (重点)
做法
1 引入分页插件

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

2 实现分页操作


    @Test
    void pagesele(){
    //  创建page 对象   参数表示  参数1;当前页   参数2;每页记录数
        Page<User> page=new Page<>(1,3);
			//把分页所有数据封装到page对中
         userMapper.selectPage(page, null);	

        System.out.println(page.getCurrent());//当前页
        System.out.println(page.getRecords());//每页数据list集合
        System.out.println(page.getSize());//每页显示记录数
        System.out.println(page.getTotal());//总记录数
        System.out.println(page.getPages());//总页数

        System.out.println(page.hasNext());//是否有下页
        System.out.println(page.hasPrevious());//是否有上页


    }

逻辑删除 ;并发真正的删除 数据还会存在表中 只是isdelete属性改为了1

做法
1 在实体类 和 数据库中添加属性 deleted 加上注解@TableLogic 这个的意思就是 如果删除 就是1 如果删除 就是0 默认是0

    @TableLogic
    @TableField(fill = FieldFill.INSERT)
    private Integer deleted;

2 配置逻辑删除插件

    /**配置逻辑删除插件*/
    @Bean
    public ISqlInjector sqlInjector() {
        //配置逻辑删除插件
        return new LogicSqlInjector();
    }

测试

   @Test
    void delete(){
        //删除  有配置逻辑删除 则执行逻辑删除  没有配置  则执行物理删除
        userMapper.deleteById(1401529487169392642L);
    }

性能分析插件:
通过这个插件 可以看到sql语句的执行时间,还可以设置超过某个时间的sql语句 让它不执行

    /**
     * SQL 执行性能分析插件
     * 开发环境使用,线上不推荐。 maxTime 指的是 sql 最大执行时长
     * 项目开发中的三种环境
     * dev:开发环境
     * test:测试环境
     * prod:生产环境,表示正在给用户去用了
     */
    @Bean
    @Profile({"dev","test"})// 设置 dev test 环境开启  对dev  test环境生效
    public PerformanceInterceptor performanceInterceptor() {
        PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
        performanceInterceptor.setMaxTime(3000);//ms,超过此处设置的ms则sql不执行
        performanceInterceptor.setFormat(true);
        return performanceInterceptor;
    }

配置项目开发的环境

#设置环境
spring.profiles.active=dev

QueryWrapper用于生成 sql 的 where 条件

高级查询
eq 即 =

  @Test
    void warpper(){
        QueryWrapper queryWrapper=new QueryWrapper();
       queryWrapper.eq("name", "张安");
        userMapper.selectList(queryWrapper).forEach(System.out::println);
    }

执行的sql语句与结果

ne 不等于
ne(“name”, “老王”)—>name <> ‘老王’

gt 大于 >
例: gt(“age”, 18)—>age > 18

大于等于 >=
例: ge(“age”, 18)—>age >= 18

lt 小于 <
例: lt(“age”, 18)—>age < 18

le 小于等于 <=
例: le(“age”, 18)—>age <= 18

#between
BETWEEN 值1 AND 值2
例: between(“age”, 18, 30)—>age between 18 and 30

#notBetween
NOT BETWEEN 值1 AND 值2
例: notBetween(“age”, 18, 30)—>age not between 18 and 30

like ‘%值%’
例: like(“name”, “王”)—>name like ‘%王%’

#notLike ‘%值%’
例: notLike(“name”, “王”)—>name not like ‘%王%’

#likeLeft
例: likeLeft(“name”, “王”)—>name like ‘%王’

#likeRight
例: likeRight(“name”, “王”)—>name like ‘王%’

#isNull
isNull(“name”)—>name is null

#isNotNull
isNotNull(“name”)—>name is not null

#in
in(“age”,{1,2,3})—>age in (1,2,3)

 @Test
    void isnotnull(){
        QueryWrapper queryWrapper=new QueryWrapper();

        //查询年纪不等于12 的
            queryWrapper.ne("age",12);
        //查询年纪大于12的
        queryWrapper.gt("age",12);
        //查询年纪大于或等于12 的
        queryWrapper.ge("age",12);
        //查询年纪小于12 的
        queryWrapper.lt("age",12);
        //查询年纪小于或等于12的
        queryWrapper.le("age",12);
        //范围之间  查询年纪在12  到24 之间的
        queryWrapper.between("age",12,24);
    }

mybatis plus官网

https://mp.baomidou.com/guide/wrapper.html#notin

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值