MyBatis-Plus简单案例

  • Post author:
  • Post category:其他

1.简介

MyBatis官网

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

2.MyBatis简单案例

添加依赖

spring-boot-starter、spring-boot-starter-test

添加:mybatis-plus-boot-starter、MySQL、lombok、在项目中使用Lombok可以减少很多重复代码的书写。比如get/set/toString等方法的编写

这里要使用lombok得安装lombok插件。


    <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用来简化实体类-->
        <!--简化get/set方法-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

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

3.application.paoperties配置

这是MySQL8以上及SpringBoot2.1以上版本的配置

#mysql数据库连接
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=123

MySQL5及Spring Boot2.1的配置

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus
spring.datasource.username=root
spring.datasource.password=123

4.主程序和实体类

  • 主程序类中加入注解MapperScan(mapper路径),若不加入该注解会报错

    /*扫描mapper接口*/
    @MapperScan("mapper")
    
  • 实体类属性为数据表中的属性,加入注解@Data,会自动创建get/set/toString方法

5.mapper接口

package mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import entity.User;
import org.springframework.stereotype.Repository;

@Repository
public interface UserMapper extends BaseMapper<User> {


}

mapper接口继承BaseMapper
Mybatis-Plus完成了BaseMapper接口提供的方法的SQL语句的生成操作。

6.测试

可在test包下编写测试主程序:

package com.atguigu.mpdemo1010;

import entity.User;
import mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

@SpringBootTest
class Mpdemo1010ApplicationTests {

    @Autowired
    private UserMapper userMapper;
    //查询
    @Test
    void find() {
        List<User> users = userMapper.selectList(null);
        System.out.println(users);
    }

}

运行find()方法,控制台输出User表中的数据。

7.配置日志

配置了日志之后可以看到数据库具体做的操作。配置到application.properties中。

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

可看到mp创建了SqlSession,执行语句:SELECT id,name,age,email FROM user ;

8.主键策略

MyBatis-Plus默认的主键策略是:ID_WORKER 全局唯一ID

分布式系统唯一ID生成方案汇总 – nick hao – 博客园 (cnblogs.com)

9.add和updateById

@Test
    public void addUser() {
        User user = new User();
        user.setAge(18);
        user.setName("bob");
        user.setEmail("look@.com");

        int insert = userMapper.insert(user);
        System.out.println(insert);
    }

    @Test
    public void updateUser() {
         User user = new User();
         user.setId(3L);
         user.setAge(100);
        int num = userMapper.updateById(user);
        System.out.println(num);
    }

10.mp的自动填充

不需要set到对象里面,使用mp方式实现数据添加。

官网操作示例

步骤:

1.往user表添加两个字段create_time和update_time

2.实体类中也加入添加的字段

3.实体类添加注解

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

4.创建实现类,实现接口MetaObjectHandler

package handler;

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

import java.util.Date;

/*表示这个类交给SpringBoot管理*/
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    //使用mp进行insert操作,这个方法就会执行
    @Override
    public void insertFill(MetaObject metaObject) {
        this.setFieldValByName("creatTime",new Date(),metaObject);
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }

    //使用mp进行update操作,这个方法就会执行
    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }
}

注意MyMetaObjectHandler类需要添加注解@Component(@Component实例化到spring容器中)

11.乐观锁

解决丢失更新问题

例:两个用户同时修改某一信息,后提交数据进行 了覆盖。

  • 解决方案:

    • 悲观锁:只允许一个用户操作

    • 乐观锁:

      • 取出记录时,获取当前version
      • 更新时,带上这个version
      • 执行更新时, set version = newVersion where version = oldVersion
      • 如果version不对,就更新失败
      • 官方配置:官方配置地址

12.复杂的条件查询

采用QueryWrapper

步骤:

  • 创建QueryWrapper对象

  • 调用方法实现各种条件查询

        @Test
        public void testSelectQuery() {
            //创建QueryWrapper对象
            QueryWrapper<User> wrapper = new QueryWrapper<>();
            
            //通过QueryWrapper设置条件
            //ge,gt,le,lt (大于等于、大于、小于等于、小于)
            wrapper.ge("age",30);//查询age>=30的记录
            //List<User> users = userMapper.selectList(wrapper);
            //System.out.println(users);
    
            //eq,ne (等于、不等于)
            wrapper.eq("name","bob");
           // List<User> users = userMapper.selectList(wrapper);
            //System.out.println(users);
    
            //between
            wrapper.between("age",20,30);//年龄在20到30
    
            //like模糊查询
            wrapper.like("name","沈");
    
            //last
            wrapper.last("limit 1");//只查一条数据
    
            List<User> users = userMapper.selectList(wrapper);
            System.out.println(users);
        }
    

版权声明:本文为w485503原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。