【Mybatis-Plus】Mybatis-Plus快速入门

Mybatis-Plus

前期准备

Mybatis-Plus简述

Mybatis-Plus是基于Mybatis的数据库操作组件,其实现的功能完全是Mybatis的功能拓展,不改变Mybatis的使用方式,可以兼容Mybatis的操作方式。

创建一个数据库、一个表进行基础操作:

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')

创建一个Spring项目,项目通过Spring Initlizer创建,不导入任何依赖包,在POM.xml文件中进行依赖导入。

依赖导入

分别导入mybatis-plus、数据库驱动、lombok依赖

<!--        Mybatis-plus依赖-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.3.1</version>
        </dependency>
<!--        mysql驱动-->
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

<!--        lombok简化开发-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

配置数据库信息

在自动生成的resource文件夹下的application.properties配置文件中配置数据库信息:

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=123456

创建对应于数据库表的实体类:entity/User

//@Data注解用于简易生成get和set方法
@Data
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

创建Mybatis用于操作User表的的映射接口:mapper/Usermapper

//使接口继承BaseMapper<>并指明实体类,可以直接使用其中定义的方法,注意这样必须在主类中添加MapperScan注解
//也可以添加到配置类中
@Repository
public interface UserMapper extends BaseMapper<User> {
}

在主类上添加MapperScan注解

@SpringBootApplication
@MapperScan("com.qinghe.demomptest.mapper")
public class DemomptestApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemomptestApplication.class, args);
    }
}

测试调用获取全部数据的方法:

@SpringBootTest
class DemomptestApplicationTests {
    @Autowired
    private UserMapper userMapper;
    @Test
    public void findAll() {
        //注意selectList()中传入的是条件,nulll代表没有条件
        List<User> users = userMapper.selectList(null);
        System.out.println(users);
    }
}

获取结果:

[User(id=1, name=Jone, age=18, email=test1@baomidou.com), User(id=2, name=Jack, age=20, email=test2@baomidou.com), User(id=3, name=Tom, age=28, email=test3@baomidou.com), User(id=4, name=Sandy, age=21, email=test4@baomidou.com), User(id=5, name=Billie, age=24, email=test5@baomidou.com)]

添加sql输出日志

在application.properties中添加如下配置信息:

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

这之后在执行sql后会在控制台输出sql的执行结果以及生成的sql语句,方便于排错与高效开发。+

Mybatis-Plus实现基础操作与其基本原理

添加操作的实现

@Test
public void testAdd() {
    User user = new User();
    user.setName("Maria");
    user.setAge(30);
    user.setEmail("Maria@qq.com");
    int insert = userMapper.insert(user);
    System.out.println(insert);
}

插入结果为:

1661768561988714498 Maria 30 Maria@qq.com

我们没有设置id的值,但是Mybatis-Plus帮我们进行了设置,这就是Mybatis-Plus的主键生成策略,我们可以使用注解来选用不同的主键生成策略:

在主键的属性上面添加注解:

//生成一个19位的唯一随机数作为主键值(雪花策略)
@TableId(type = IdType.ASSIGN_ID)

//生层一个随机数的值作为主键值
@TableId(type = IdType.ASSIGN_UUID)

//设置主键值自增
@TableId(type = IdType.AUTO)

//需要手动设置主键值
@TableId(type = IdType.INPUT)

//不使用任何策略
@TableId(type = IdType.NONE)

雪花策略:

使用1位符号、41位时间戳、10位工作进程(5数据+5机器id)、12位随机序列号

保证绝对不会出现重复以及高效率,一般都使用ASSIGN_ID策略,也就是默认的这个策略。

修改操作的实现

通过调用userMapper.updateById()来进行属性值的修改,使用.updateById的方式进行修改,可以通过传入user对象的方式来进行修改方法底层会自动根据user对象的id与其属性值进行修改

    @Test
    public void testUpdate() {
        User user = new User();
        user.setId(1661768561988714498L);
        user.setName("Maria666");

        //使用.updateById的方式进行修改,可以通过传入user对象的方式来进行修改
        //方法底层会自动根据user对象的id与其属性值进行修改
        int count = userMapper.updateById(user);
        System.out.println(count);
    }

Mybatis-Plus实现自动填充

在测试数据库表中添加两个属性create_time和update_time,其数据类型为datetime,在实体类中也添加对应属性(注意在实体类中使用驼峰试命名、在数据库中使用下划线进行命名)这两个属性分别是在插入时设置内容以及在插入和数据修改时设置内容。

要实现插入和修改时自动填充内容的功能,我们在要进行设置的属性中添加注解@TableField(fill = FieldFill.xxx)

例如下面这样:

    //设置其在什么时候设置内容(insert代表插入即第一次时设置内容)
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    //INSERT_UPDATE代表在插入以及修改的时候设置内容
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;

这个注解要配合handler中的方法使用,创建一个handler类并实现MetaObjectHandler接口(mybatis-plus中的接口):

//使用Spring的自动配置
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    //insertFill方法会在插入时执行。
    @Override
    public void insertFill(MetaObject metaObject) {
        //这个方法中,第一个参数是要设置的属性名、第二个参数是设置的内容,第三个是固定要传入的对象,也是这个方法的形参
        this.setFieldValByName("createTime", new Date(), metaObject);
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }
}

乐观锁

乐观锁适用于希望自己在更新一条记录时,这条记录不会被其他人更新的情况(线程安全)。

乐观锁通过加入版本的方式控制线程,若事务在开启时与结束时检查版本一致,则允许修改并更新版本号,若不一致则不允许修改(说明有其他事务也在对其进行修改)

在数据库表中添加一个属性version,类型为int,同时在实体类中也添加该属性并在其上添加@Versioin注解。

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

之后创建一个配置类(config.MpConfig),在配置类中添加乐观锁插件的代码:

@Configuration
@MapperScan("com.qinghe.demomptest.mapper")
public class MpConfig {
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
        return new OptimisticLockerInterceptor();
    }
}

测试,先查询再修改:

    @Test
    public void testOptimsiticLocker() {
        //根据id查询
        User user = userMapper.selectById(1662022315828776962L);
        //修改,注意不需要手动设置Version的变化,Mybatis-Plus在底层已经帮忙实现了这个功能
        user.setName("LiSA");
        userMapper.updateById(user);
    }

此时version会自动+1

复杂查询功能在Mybatis-Plus的实现

多id批量查询

使用userMapper.selectBatchIds(Collection)进行查询:

    @Test
    public void testSelect1() {
        //这样的List传进去会自动把id为1,2,3,4的数据查询出来
        List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3, 4));
        System.out.println(users);
    }

复杂条件查询,向形参中传入map键值对进行查询(userMapper.selectByMap()):

    @Test
    public void testSelect2() {
        Map<String, Object> columnMap = new HashMap<>();
        columnMap.put("name", "Jack");
        columnMap.put("age", 20);
        List<User> users = userMapper.selectByMap(columnMap);
        System.out.println(users);
    }

但以上两种方式都不常用,常用的是条件构造器方式进行查询。

分页查询

在配置类中引入分页查询的依赖

    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }

方法测试:

    @Test
    public void testSelectPage() {
        //分页的使用,创建一个Page对象,其中要传入两个数,第一个数是当前页,第二个数是每一页的页面大小
        Page<User> page = new Page(1, 3);
        //调用selectPage方法进行分页查询,再通过调用userPage来获取页面的相关信息
        Page<User> userPage = userMapper.selectPage(page, null);
        //获取总页数
        long pages = userPage.getPages();
        //获取当前页码
        long current = userPage.getCurrent();
        //获取当前页的数据集合
        List<User> records = userPage.getRecords();
        //获取总记录数
        long total = userPage.getTotal();
        //当前页是否有下一页
        boolean next = userPage.hasNext();
        //当前页是否有上一页
        boolean previous = userPage.hasPrevious();
    }

删除操作

使用.deleteById实现删除操作

    @Test
    public void testDeleteById() {
        int result = userMapper.deleteById(1L);
        System.out.println(result);
    }

使用.deleteBatchIds()实现批量删除

int result = userMapper.deleteBatchIds(Arrays.asList(1, 2,3));

简单条件删除,使用.deleteByMap(Map),相当于给删除添加Where语句,与修改那里一样,就是变成delete

  • 逻辑删除

    物理删除是指将记录从数据库中真正删除,逻辑删除是指给字段上一个标志位,标志位为0代表正常,标志位为1代表其在逻辑上被删除了

在数据表中添加deleted字段,类型为int

Mybatis-Plus中默认1为逻辑上删除了,0为逻辑上没有删除,可以通过配置进行修改:

mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0

在实体类中添加注解:

    //逻辑是否删除的注解
    @TableLogic
    @TableField(fill = FieldFill.INSERT)
    private Integer deleted;

添加了注解之后、所有的删除语句就会变成Update并将deleted标签更改为1的语句,从而实现逻辑删除。

而配置了逻辑删除情况的Mybatis-Plus在进行查询时会自动添加wehre deleted = 0也就是说逻辑删除的语句不会被查询到,但其在数据库物理中确实存在。

条件构造器

当需要进行一些复杂的数据库操作时,要用到条件构造器(wrapper)。

gt、ge、le、lt、isNul、isNotNull

gt(greater than‘大于)、ge(greater equal 大于等于)、le(less equal 小于等于)、lt(less than 小于)

    @Test
    public void testWapper() {
        //创建一个Wrapper条件构造器,注意QueryWrapper是条件构造器的扩展
        QueryWrapper<User> queryWrapper = new QueryWrapper();
        //设置条件构造器的条件,.ge是大于等于(greaterequal)
        queryWrapper.ge("age", 21);
        //调用selectList并传入条件构造器来获取列表
        List<User> users = userMapper.selectList(queryWrapper);
        System.out.println(users);
    }

eq、ne

eq(等于)、ne(not equal 不等于)

queryWrapper.eq("name", "LiSA");

between、notBetween

queryWrapper.between("age", 24, 40);

模糊查询 like、notLike、likeLeft、likeRight

like代表只要有这个字符就查出来(%张%)

notLike代表没有这个字符

likeLeft代表以模糊的字符为结尾(%张)、likeRight代表以模糊的字符为开头(张%)

queryWrapper.likeLeft("name", "A");

OrderBy、orderByDesc、orderByAsc

orderByAsc 升序排列、orderByDesc 降序排列

queryWrapper.orderByAsc("id");
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值