SpringBoot集成MyBatis-Plus&Druid

目录

MyBatis-Plus简介 

实例演示

创建Springboot项目

初始化Springboot项目

添加关键依赖

application.properties添加相关配置

启动类

编写实体类

编写mapper接口

条件构造器

分页插件

自定义 SQL 映射


MyBatis-Plus简介 

MyBatis-Plus简介‌MyBatis-Plus‌(简称MP)是一个基于MyBatis的增强工具,旨在简化开发过程并提高开发效率。它通过在MyBatis的基础上进行增强,而不改变MyBatis的核心功能,来实现这一目标。MyBatis-Plus的愿景是成为MyBatis最好的搭档,通过提供一系列增强功能,如无侵入性、损耗小、强大的CRUD操作等,来优化开发者的使用体验。这些特性使得MyBatis-Plus成为许多开发者在简化数据库操作时的首选工具。

  • 无侵入性‌:MyBatis-Plus的增强功能不会对现有工程产生影响,保证了与原生MyBatis的兼容性,使得集成和使用变得非常简单。
  • 损耗小‌:启动时自动注入基本的CRUD操作,性能基本无损耗,直接面向对象操作,通过BaseMapper接口提供强大的CRUD操作能力,减少了开发者的编码工作量。
  • 强大的CRUD操作‌:内置通用Mapper、通用Service,通过少量配置即可实现单表大部分CRUD操作,拥有强大的条件构造器,满足各类使用需求,简化了简单的CRUD操作编写。

此外,MyBatis-Plus与Spring的整合也非常简单,只需要将MyBatis的依赖替换为MyBatis-Plus的依赖,并进行相应的配置,即可实现与Spring框架的无缝对接。这些特性共同使得MyBatis-Plus成为提升MyBatis使用体验的有效工具‌

实例演示

创建Springboot项目

初始化Springboot项目

添加关键依赖

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
            <version>3.5.6</version>
        </dependency>
        <!-- Druid依赖 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.8</version>
        </dependency>

application.properties添加相关配置

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/crm?useUnicode=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=123456yt

logging.level.root=warn
logging.level.com.ktjiaoyu.mybatisplus.mapper=trace
logging.pattern.console=%p%m%n

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
#初始化大小、最小、最大连接数
spring.datasource.druid.initial-size=3
spring.datasource.druid.min-idle=3
spring.datasource.druid.max-active=10
#配置获取连接等待超时的时间
spring.datasource.druid.max-wait=60000
#监控后台账号和密码
spring.datasource.druid.stat-view-servlet.login-username=admin
spring.datasource.druid.stat-view-servlet.login-password=admin
#配置StatFilter
spring.datasource.druid.filter.stat.log-slow-sql=true
spring.datasource.druid.filter.stat.slow-sql-millis=2000

启动类

添加@MapperScan注解,路径指向mapper接口的包路径

编写实体类

package com.ktjiaoyu.thymeleaf.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import lombok.Data;

/**
 * 
 * @TableName sys_user
 */
@TableName(value ="sys_user")
@Data
public class User implements Serializable {
    /**
     * 编号
     */
    @TableId(type = IdType.AUTO)
    private Long usrId;

    /**
     * 姓名
     */
    private String usrName;

    /**
     * 密码
     */
    private String usrPassword;

    /**
     * 角色编号
     */
    private Long usrRoleId;

    /**
     * 状态
     */
    private Integer usrFlag;

    @TableField(exist = false)
    private static final long serialVersionUID = 1L;

    @Override
    public boolean equals(Object that) {
        if (this == that) {
            return true;
        }
        if (that == null) {
            return false;
        }
        if (getClass() != that.getClass()) {
            return false;
        }
        User other = (User) that;
        return (this.getUsrId() == null ? other.getUsrId() == null : this.getUsrId().equals(other.getUsrId()))
            && (this.getUsrName() == null ? other.getUsrName() == null : this.getUsrName().equals(other.getUsrName()))
            && (this.getUsrPassword() == null ? other.getUsrPassword() == null : this.getUsrPassword().equals(other.getUsrPassword()))
            && (this.getUsrRoleId() == null ? other.getUsrRoleId() == null : this.getUsrRoleId().equals(other.getUsrRoleId()))
            && (this.getUsrFlag() == null ? other.getUsrFlag() == null : this.getUsrFlag().equals(other.getUsrFlag()));
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((getUsrId() == null) ? 0 : getUsrId().hashCode());
        result = prime * result + ((getUsrName() == null) ? 0 : getUsrName().hashCode());
        result = prime * result + ((getUsrPassword() == null) ? 0 : getUsrPassword().hashCode());
        result = prime * result + ((getUsrRoleId() == null) ? 0 : getUsrRoleId().hashCode());
        result = prime * result + ((getUsrFlag() == null) ? 0 : getUsrFlag().hashCode());
        return result;
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append(getClass().getSimpleName());
        sb.append(" [");
        sb.append("Hash = ").append(hashCode());
        sb.append(", usrId=").append(usrId);
        sb.append(", usrName=").append(usrName);
        sb.append(", usrPassword=").append(usrPassword);
        sb.append(", usrRoleId=").append(usrRoleId);
        sb.append(", usrFlag=").append(usrFlag);
        sb.append(", serialVersionUID=").append(serialVersionUID);
        sb.append("]");
        return sb.toString();
    }
}

编写mapper接口

package com.ktjiaoyu.thymeleaf.mapper;

import com.ktjiaoyu.thymeleaf.entity.User;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

/**
* @author Administrator
* @description 针对表【sys_user】的数据库操作Mapper
* @createDate 2024-09-09 09:10:40
* @Entity com.ktjiaoyu.thymeleaf.entity.User
*/
public interface UserMapper extends BaseMapper<User> {

}




经过这样几个步骤我们就实现了CRUD的基本功能,最后我们来测试一下(利用Junit测试类)

    @Test
    public void testSelectById(){
        User user = userMapper.selectById(2L);
        System.out.println("usrName:" + user.getUsrName());
    }

测试结果:

以上是MyBatis-Plus的基本使用,其实它也还具备多数功能

条件构造器

MyBatis-Plus 提供了条件构造器 QueryWrapper 和 UpdateWrapper 用于构建复杂查询条件:

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "Tom"); // 等价于 SQL 的 `WHERE name = 'Tom'`
List<User> users = userMapper.selectList(queryWrapper);

分页插件

MyBatis-Plus 提供了分页插件,可以快速实现分页功能:

Page<User> page = new Page<>(1, 10); // 第1页,每页10条数据
Page<User> userPage = userMapper.selectPage(page, null);

自定义 SQL 映射

MyBatis-Plus 支持自定义 SQL 映射,可以方便地进行复杂查询:

@Select("SELECT * FROM user WHERE name = #{name}")
List<User> selectByName(@Param("name") String name);

以上是 MyBatis-Plus 的一些常用功能和使用方法,实际使用时需要根据具体需求选择合适的功能,并结合项目中的具体配置和实体类使用。

Spring Boot结合MyBatis Plus和Seata实现动态数据源以及多数据源事务管理,需要以下几个步骤: 1. **添加依赖**: 首先,在你的`pom.xml`文件中添加Seata、MyBatis Plus和动态数据源相关的依赖: ```xml <dependency> <groupId>org.seata</groupId> <artifactId>seata-spring-boot-starter</artifactId> <version>...版本号...</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>...版本号...</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>...版本号...</version> </dependency> ``` 2. **配置数据源**: 在`application.yml`或`application.properties`中设置两个数据源: ```yaml # 数据源配置示例 dataSources: ds0: driver-class-name: ...//数据库一驱动名 url: ...//数据库一URL username: ...//数据库一用户名 password: ...//数据库一密码 ds1: driver-class-name: ...//数据库二驱动名 url: ...//数据库二URL username: ...//数据库二用户名 password: ...//数据库二密码 ``` 3. **创建DataSourceManager**: 使用Druid的`DataSourceFactory`来创建DataSource实例,并注册到Spring的Bean中,同时注入Seata的TransactionTemplate: ```java @Configuration public class DataSourceConfig { @Value("${spring.datasource.ds0}") private String ds0; @Value("${spring.datasource.ds1}") private String ds1; @Bean(name = "dataSourceManager") public DataSourceManager dataSourceManager() { DruidDataSource dataSource0 = (DruidDataSource) DataSourceUtils.createDataSourceInstance(ds0); DruidDataSource dataSource1 = (DruidDataSource) DataSourceUtils.createDataSourceInstance(ds1); return new DataSourceManager(Arrays.asList(dataSource0, dataSource1)); } @Bean public TransactionTemplate transactionTemplate(DataSourceManager dataSourceManager) { return new TransactionTemplate(new PlatformTransactionManager(dataSourceManager)); } } ``` 4. **配置事务分片策略**: 在MyBatis Plus中启用动态切换数据源并配置事务切分规则: ```java // MyBatis Plus全局配置 @MapperScan("com.example.mapper") // 扫描mapper包 @GlobalConfig({ // 开启动态数据源切换 GlobalConfig.initDynamaic(true), // 使用自定义的DataSourceManager切换数据源 GlobalConfig.dataSource("dataSourceManager"), // 自动提交事务,开启后将不再监听SqlSession的begin-end事件 GlobalConfig.sqlSessionAutoCommit(false), // 配置事务拦截器,这里使用Seata的TransactionProxy GlobalConfig.transactionProxyClass(SeataTranInterceptor.class) }) ``` 5. **编写事务拦截器SeataTranInterceptor**: 这里实现了Seata的事务拦截,需要引入Seata的相关注解: ```java @Component public class SeataTranInterceptor implements TransactionInterceptor { @Resource private GlobalConfig config; @Override public Result doIntercept(Invocation invocation) throws Throwable { TransactionContext tx = Seata.startGlobalTransaction(); try { // 执行业务逻辑 Object result = invocation.proceed(); return Result.ok(result); } catch (Exception e) { tx.rollback(); // 发生异常时回滚事务 throw e; } finally { tx.close(); // 无论是否异常,结束事务 } } } ``` 6. **在服务层使用事务处理**: 在Service层的每个需要事务处理的方法上使用`@Transactional`注解,Seata会自动感知并管理事务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值