MybatisPlus与Spring和SpringBoot的整合

发布于 2021-12-16  3.5k 次阅读


一,Spring和MybatisPlus进行整合

MybatisPlis作为Mybatis的增强版,在原基础的封装并不做改变,所以Spring整合MybatisPuls其实就是整合Mybatis,只不过在对SqlSessionFactoryBean的配置改成了MybatisPlus提供的

所以演示整合MybatisPlus,先演示一下整合mybatis,然后在原来的基础上做一下修改即可

一,依赖详解

① Spring和MybatisPlus整合的依赖

  • spring-context:上下文,这个依赖包括bean,core,aop,expression
  • mysql-connector-java:mysql驱动
  • druid:druid数据源
  • mybatis-plus:mybatisplus依赖
  • spring-orm:orm依赖
  • spring-jdbc
  • spring-tx:声明式事务

② mybatisplus依赖的组成部分

  • mybatis:mybatis依赖
  • mybatis-spring:mybatis和spring的整合依赖
  • mybatis-plus

所以在导入mybatis-plus依赖时不需要导入mybatis和mybatis-spring依赖

<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.5</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.3.5</version>
</dependency>

<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.7.2</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>

<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>3.1.1</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.3.5</version>
</dependency>

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.5</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>5.3.5</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.5</version>
</dependency>
</dependencies>

二,mybatuis和Spring整合

① 新建一个mybatis主配置文件(可选项)

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

</configuration>

② 新建映射配置文件目录(可选项)

③ 新建数据库连接配置文件

name=root
password=123
url=jdbc:mysql://localhost:3306/test?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
driverclass=com.mysql.jdbc.Driver

④ 新建一个spring配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
      http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
     http://www.springframework.org/schema/tx https://www.springframework.org/schema/tx/spring-tx.xsd
      http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <context:property-placeholder location="connection.properties"/>

    <!--使用druid数据源配置datasource-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="username" value="${name}"/>
        <property name="password" value="${password}"/>
        <property name="driverClassName" value="${driverclass}"/>
        <property name="url" value="${url}"/>
    </bean>

    <!--配置mybatis工厂,之后配置Mybatisplus只需要把这个工厂修改成mybatisplus提供的即可-->
    <bean  class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--配置mybatis的数据源-->
        <property name="dataSource" ref="dataSource"/>
        <!--声明主配置文件位置-->
        <property name="configLocation" value="classpath:/mybatisconfig.xml"/>
        <!--声明映射文件地址-->
        <property name="mapperLocations" value="classpath:/mapper/*"/>
    </bean>

    <!--扫描映射配置文件地址,这个很重要,在整合springboot时是提供@Mapper和@MapperScan来扫描的-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.mapper"/>
    </bean>

    <!--配置事务管理器-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!--开启基于注解的事务管理-->
    <tx:annotation-driven transaction-manager="transactionManager"/>

</beans>

简单测试:

① 在数据库新建一个测试表(略)

② 建一个实体类和表字段形成映射关系

@Data
public class mybatistest {
    int id;
    String name;
    int sex;
    int age;
}

③ 创建接口映射

public interface mybatistest_mapper {

    @Select("select * from mybatistest where id=#{id}")
    public mybatistest selere_id(int id);

}

④ 测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:/spring.xml"})
public class mybatistest_wql {

    @Autowired
    mybatistest_mapper mybatistest_mapper;

    @Test
    public void l() throws Exception {

        System.out.println(mybatistest_mapper.selere_id(1));

    }
}

⑤ 结果

mybatis整合后写的方式有三种:
  • 通过注解使用,不需要配置文件,但spring配置中需要必须要扫描映射接口
  • 使用配置文件,在spring配置中声明映射配置文件和主配置文件的位置,在映射文件中写sql
  • 注解和配置文件混合使用,一个映射接口复杂的SQL使用配置文件,简单的SQL使用注解

三,在上面原基础上进行整合Mybatis-Plus

把前面整合mybatis的一个配置工厂该成Mybatis-PLus提供的就行了

① 修改前:Mybatis提供SqlSessionFactory工厂

<bean  class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--配置mybatis的数据源-->
        <property name="dataSource" ref="dataSource"/>
        <!--声明主配置文件位置-->
        <property name="configLocation" value="classpath:/mybatisconfig.xml"/>
        <!--声明映射文件地址-->
        <property name="mapperLocations" value="classpath:/mapper/*"/>
    </bean>

② 修改后:Mybatis-Plus提供SqlSessionFactory工厂

<bean  class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
    <!--配置mybatis的数据源-->
    <property name="dataSource" ref="dataSource"/>
    <!--声明主配置文件位置-->
    <property name="configLocation" value="classpath:/mybatisconfig.xml"/>
    <!--声明映射文件地址-->
    <property name="mapperLocations" value="classpath:/mapper/*"/>
</bean>

修改这一处即可,使用方面Mybatis的所以操作都能实现,并在其基础上对功能进行了增强

运行前面写的测试:

二,SpringBoot整合MybatisPlus

一,Mybatis-Plus场景启动器

<dependency>
   <groupId>com.baomidou</groupId>
   <artifactId>mybatis-plus-boot-starter</artifactId>
   <version>3.4.3</version>
</dependency>

这个场景启动器包括:

  • Mybatis
  • Mybatis-Spring
  • spring-boot-starter-jdbc
  • ……

所以在导入这个场景启动器后,不需要导入mybatis合jdbc场景启动器

二,Mybatis-Plus的自动配置

Mybatis-Plus的自动配置类是com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration

 将MybatisPlusAutoConfiguration源码进行拆分:

① 类上注解

@Configuration
//项目是否包含SqlSessionFactory和SqlSessionFactoryBean类
@ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class})
//容器是否包含DataSource且只有一个
@ConditionalOnSingleCandidate(DataSource.class)
//跟配置文件绑定
@EnableConfigurationProperties({MybatisPlusProperties.class})
//在DataSourceAutoConfiguration数据源和MybatisPlusLanguageDriverAutoConfiguration配置之后加载
@AutoConfigureAfter({DataSourceAutoConfiguration.class, MybatisPlusLanguageDriverAutoConfiguration.class})
public class MybatisPlusAutoConfiguration implements InitializingBean {
……………………
}

② sqlSessionFactory的自动配置

@Bean
@ConditionalOnMissingBean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
    MybatisSqlSessionFactoryBean factory = new MybatisSqlSessionFactoryBean();
    factory.setDataSource(dataSource);
    factory.setVfs(SpringBootVFS.class);
    if (StringUtils.hasText(this.properties.getConfigLocation())) {
        factory.setConfigLocation(this.resourceLoader.getResource(this.properties.getConfigLocation()));
    }
……………………

③MybatisPlusProperties的配置类

@ConfigurationProperties(
    prefix = "mybatis-plus"//跟配置文件的mybatis-plus前缀绑定
)
public class MybatisPlusProperties {
    private static final ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();
    //主配置文件路径
    private String configLocation;
    //映射文件地址,默认是在类路径mapper文件夹下的任何.xml文件
    private String[] mapperLocations = new String[]{"classpath*:/mapper/**/*.xml"};
    //包别名
    private String typeAliasesPackage;
    private Class<?> typeAliasesSuperType;
    private String typeHandlersPackage;
    private boolean checkConfigLocation = false;
    private ExecutorType executorType;
    private Class<? extends LanguageDriver> defaultScriptingLanguageDriver;
    private Properties configurationProperties;
    @NestedConfigurationProperty
    private MybatisConfiguration configuration;
    private String typeEnumsPackage;
…………

自动配置的总结:

  • SqlSessionFactory自动配置好底层容器中的默认数据源
  • MapperLocation自动配置路径为classpath*:/mapper/**/*.xml,任意包的类路径下的所有mapper文件夹下的所有xml文件都是映射文件
  • 容器中也自动配置好了的SqlSessionTemplate
  • 和Myabtis自动配置一样,@Mapper标注的接口会被自动扫描,但MybatisPlus建议使用@MapperScan进行批量扫描

三,简单使用MybatisPlus

Mybatis-Plus可以完成所有在使用Mybatis能完成的操作:如
  • 配置版的Mybatis
  • 注解般的Mybatis
  • 混合版的mybatis
这些在Mybatisplus中都能完成且和之前的配置一样,但Mybatis-Plus还做了一个增强:
  • 使用BaseMapper接口,对对单表的操作进行简化
例:通过Mybatis进行简单的ID查询
① 表的映射对象
@Data
@ToString
@TableName("mybatistest")//声明它要映射的表名,默认不写为类名
public class mybatisplus_pojo {
    int id;
    String name;
    int sex;
    int age;
}

② 映射接口

@Mapper//声明这个注解表名为映射接口,底层会进行扫描
public interface mybatisplus_mapper extends BaseMapper<mybatisplus_pojo> {

    @Override
    mybatisplus_pojo selectById(Serializable id);
}

③ test测试

@SpringBootTest
class SpringbootMybatisplusDomeApplicationTests {

   @Autowired
   mybatisplus_mapper mapper;

   @Test
   void contextLoads() {

      mybatisplus_pojo selectById = mapper.selectById(1L);

      System.out.println(selectById);
}}

④ 结果


路漫漫其修远兮,吾将上下而求索