SpringBoot框架中Mybatis

网友投稿 778 2022-10-27

SpringBoot框架中Mybatis

SpringBoot框架中Mybatis

Mybatis-plus

官网地址:https://baomidou.com/

配置mysql

在配置文件连接mysql

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.datasource.url=jdbc:mysql://localhost:3306/cat_house?serverTimezone=GMT%2B8

spring.datasource.username=username

spring.datasource.password=password

# mybatis日志(控制台能显示SQL语句)

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

Mybatis-plus使用方式

依赖导入

com.baomidou

mybatis-plus-boot-starter

3.0.5

mysql

mysql-connector-java

lombok依赖导入

org.projectlombok

lombok

Mybatis-plus实现简单的CURD操作

准备表格(数据库有相应的表格)

准备实体(实体文件夹中有相应的实体类)

package com.xsha.boot.entity;

import lombok.Data;

@Data

public class Topic {

private int id;

private String title;

private String time;

private int count;

private int version;

}

准备映射文件(映射文件夹中有相应的映射接口)

package com.xsha.boot.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;

import com.xsha.boot.entity.Topic;

import org.springframework.stereotype.Repository;

@Repository

public interface TopicMapper extends BaseMapper {

}

测试操作(在test类中进行简单的单元测试)

package com.xsha.boot;

import com.xsha.boot.entity.Topic;

import com.xsha.boot.mapper.TopicMapper;

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

public class MainApplicationTest {

@Autowired

// 可在指定的接口上添加注解Repository,就不会爆红了

private TopicMapper topicMapper;

// 查询所有数据

YhUiMK @Test

public void findAll() {

List topics = topicMapper.selectList(null);

for (int i = 0; i < topics.size(); i++) {

System.out.println(topics.get(i));

}

}

// 添加操作

public void addTopic() {

// SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

// Date date = new Date();

Topic topic = new Topic();

topic.setTitle("SSM框架整合了哪些主流框架");

// 时间的添加可以采用mybatis-plus框架实现,可查看Controller中接口实现和实体类属性的注解

// topic.setTime(ft.format(date));

int row = topicMapper.insert(topic);

System.out.println("添加的行数:"+row);

// 修改操作

public void updateTopic() {

topic.setId(20);

topic.setCount(10);

int row = topicMapper.updateById(topic);

System.out.println("修改的行数"+row);

}

Mybatis-plus自动填充策略

主键自动填充

// 可以在id属性上添加TableId注解可以修改id唯一键值的策略(自动填充),如@TableId(type=IdType.AUTO)

// @TableId(type=IdType.ID_WORKER) 生成19位唯一数字的键值

// @TableId(type=IdType.ID_WORKER_STR) 生成19位唯一字符串的键值

private int id;

时间自动填充

实体类属性添加注解

// 采用mybatis-plus框架的策略自动填充时间

// @TableField(fill=FieldFill.INSERT) 表示自动填充创建时间

// @TableField(fill=FieldFill.INSERT_UPDATE) 表示自动填充更新时间

@TableField(fill = FieldFill.INSERT)

private String time;

Controller类继承接口实现时间自动填充方法

package com.xsha.boot.controller;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;

import org.apache.ibatis.reflection.MetaObject;

import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;

import java.util.Date;

@Component

public class MyMetaObjectController implements MetaObjectHandler {

// 使用mybatis-plus实现添加操作,这个方法自动调用

@Override

public void insertFill(MetaObject metaObject) {

SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

Date date = new Date();

// 第一个参数不是表格的字段名称,而是实体类的属性名称

this.setFieldValByName("time", ft.format(date), metaObject);

}

// 使用mybatis-plus实现更新操作,这个方法自动调用

public void updateFill(MetaObject metaObject) {

// 更新时间可根据需求实现

}

乐观锁的具体实现

表格添加字段version,作为乐观锁版本号对应实体类添加版本号属性,并且在属性上面添加注解Version(baomidou下的Version)在配置类中添加乐观锁插件

@Configuration

@MapperScan("com.xsha.boot.mapper")

public class MyConfig {

// 乐观锁插件

@Bean

public OptimisticLockerInterceptor optimisticLockerInterceptor() {

return new OptimisticLockerInterceptor();

}

}

Mybatis-plus查询操作(简单)

// 单个id查询

@Test

public void selectTopic() {

Topic topic = topicMapper.selectById(20);

System.out.println(topic);

}

// 多个id批量查询

@Test

public void selectTopics() {

List topics = topicMapper.selectBatchIds(Arrays.asList(1, 2, 3, 4));

for (int i = 0; i < topics.size(); i++) {

System.out.println(topics.get(i));

}

}

Mybatis-plus实现分页操作

在配置类中配置分页插件

// 分页插件

@Bean

public PaginationInterceptor paginationInterceptor() {

return new PaginationInterceptor();

}

编写分页代码

// 分页查询

@Test

public void selectByPage() {

// 1.创建page对象,传递当前页和每页记录数的两个参数

Page page = new Page<>(1, 3);

// 2.调用mybatis-plus分页查询的方法,把分页所有的数据封装到page对象里面,第二个参数是条件

topicMapper.selectPage(page, null);

// 3.通过page对象获取分页数据

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()); // 是否有上一页

}

Mybatis-plus删除操作(简单)

物理删除

// 单个id删除

@Test

public void deleteTopic() {

int row = topicMapper.deleteById(20);

System.out.println(row);

}

// 多个id批量删除

@Test

public void deleteTopics() {

int rows = topicMapper.deleteBatchIds(Arrays.asList(1, 2, 3, 4));

System.out.println(rows);

}

逻辑删除

表格中添加标志位字段,供逻辑删除使用

表格字段设置默认值,就不能使用mybatis-plus的自动填充使用mybatis-plus的自动填充

使用mybatis-plus的自动填充时,在实体类属性上添加TableLogic注解

@TableLogic

private int delete;

在配置类中配置逻辑删除插件

// 逻辑删除插件

@Bean

pubYhUiMKlic ISqlInjector sqlInjector() {

return new LogicSqlInjector();

}

在配置文件中添加逻辑删除与否的默认值(可有可无)

# 逻辑删除与否的默认值

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

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

代码编写

// 逻辑删除

@Test

public void logicDeleteTopic() {

int row = topicMapper.deleteById(21);

System.out.println(row);

}

注意:采用mybatis-plus的逻辑删除方式时,之后查询数据时就不会包括逻辑删除的数据

性能分析

在配置类中添加性能分析插件

/**

* SQL执行性能分析插件

* 开发环境使用,线上不推荐。maxTime指的是sql最大执行时长

*

* 三种环境:dev开发环境、test测试环境、prod生成环境

* @return

*/

@Bean

@Profile({"dev", "test"}) // 设置dev,test的环境开启

public PerformanceInterceptor performanceInterceptor() {

PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();

performanceInterceptor.setMaxTime(100); // 数值单位为毫秒ms

performanceInterceptor.setFormat(true);

return performanceInterceptor;

}

在配置文件中配置环境

# 环境设置:dev test prod

spring.profiles.active=dev

Mybatis-plus实现复杂条件查询

使用QueryWrapper类对象构造条件(还有其他的)

// mybatis-plus实现复杂查询

@Test

public void querySelect() {

// 1.创建QueryWrapper对象

QueryWrapper queryWrapper = new QueryWrapper<>();

// 2.通过QueryWrapper设置条件

// ge(>=)、gt(>)、le(<=)、lt(<)

queryWrapper.ge("count", 3);

List topics1 = topicMapper.selectList(queryWrapper);

System.out.println("FIRST");

System.out.println(topics1);

// eq(==)、ne(!=)

queryWrapper.ne("deleted", 0);

List topics2 = topicMapper.selectList(queryWrapper);

System.out.println("SECOND");

System.out.println(topics2);

// between(在和之间)

queryWrapper.between("time", "2021-10-12 07:05:29.546779", "2021-10-27 15:02:09.458571");

List topics3 = topicMapper.selectList(queryWrapper);

System.out.println("THIRD");

System.out.println(topics3);

// like(模糊查询)

queryWrapper.like("title", "SSM");

List topics4 = topicMapper.selectList(queryWrapper);

System.out.println("FORTH");

System.out.println(topics4);

// 排序 orderByDesc orderByAsc

queryWrapper.orderByDesc("count");

List topics5 = topicMapper.selectList(queryWrapper);

System.out.println("FIFTH");

System.out.println(topics5);

// 指定要查询的列 last拼接sql语句

queryWrapper.select("id", "title", "count");

queryWrapper.last("limit 2");

List topics6 = topicMapper.selectList(queryWrapper);

System.out.println("SIXTH");

System.out.println(topics6);

}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:# JWT 图解
下一篇:很棒的音频部件t适用于任何Android音乐应用程序
相关文章

 发表评论

暂时没有评论,来抢沙发吧~