美文网首页程序员
优雅单测-5基于Mybatis支持苞米豆单测

优雅单测-5基于Mybatis支持苞米豆单测

作者: uncle_hangzhou | 来源:发表于2020-06-30 15:44 被阅读0次

1.苞米豆MyBatis-Plus介绍

MyBatis Plus 是国内人员开发的 MyBatis 增强工具,在 MyBatis 的基础上只做增强不做改变。核心功能为提供一套通用的CRUD框架,使用者只要专注拼接sql逻辑即可

单测之前假设:

  • 已顺利完成Mybatis的单测
  • 基于SpringBoot,但是希望单测执行快速稳定

2.Mybatis单测支持baomidou

使用baomidou框架做单测,区别于直接使用mybatis的是, 使用MybatisSqlSessionFactoryBean代替原生****SqlSessionFactoryBean即可

2.1 环境准备

引入依赖

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

Mapper接口:

public interface BaseLiveReportMapper extends BaseMapper<LiveReportPO> {
}

Model:

@TableName("live_report")
public class LiveReportPO extends Model<LiveReportPO> {
}

2.2 开始基于Spring容器的单测

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = BaseLiveReportMapperTest.Config.class)
public class BaseLiveReportMapperTest {
    @Autowired
    private BaseLiveReportMapper baseLiveReportMapper;

    @Test
    public void getTest() {
        LiveReportPO liveReportPO = baseLiveReportMapper.selectById(1L);
        Assert.assertNotNull(liveReportPO);
    }
    
    @Configuration
    @Import(value = MybatisConfig.class)
    static class Config {
    }
}

2.3 增加数据源配置依赖


import java.sql.SQLException;
import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import com.zaxxer.hikari.HikariDataSource;
@Configuration
@MapperScan(basePackages = { "com.x.live.center.dao.mapper" }, 
            sqlSessionFactoryRef = "dataSessionFactory",
            sqlSessionTemplateRef = "dataSessionTemplate")
@PropertySource( "classpath:application-test.properties")
public class MybatisConfig {
    @Value("${spring.datasource.url}")
    private String url;
    @Value("${spring.datasource.username}")
    private String username;
    @Value("${spring.datasource.password}")
    private String password;
    
    @Bean(initMethod = "getConnection", destroyMethod = "close" ,name = "testDataSource")
    public DataSource dataSource() throws SQLException {
        HikariDataSource dataSource = new HikariDataSource();
        dataSource.setJdbcUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }  
    @Bean(name = "dataSessionFactory")
    public SqlSessionFactory sessionFactory(@Qualifier("testDataSource") DataSource dataSource) throws Exception {
        // SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        // 替换SqlSessionFactoryBean为苞米豆的MybatisSqlSessionFactoryBean
        MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        sqlSessionFactoryBean.setTypeAliasesPackage("com.x.live.center.dao.mapper");
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath*:/mapper/*Mapper.xml"));
        return sqlSessionFactoryBean.getObject();
    }
    @Bean(name = "dataSessionTemplate")
    public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory dataSessionFactory) {
        return new SqlSessionTemplate(dataSessionFactory);
    }
}

单测运行成功:

image.png

3. 配置详解

值得一提的是,如果不使用苞米豆提供的Spring环境session工厂(MybatisSqlSessionFactoryBean),执行就会提示没有对应的可执行sql:

image.png image.png

那么可以思考一下baomidou是如何实现BaseMapper接口的,又为什么会报这个错的?

原理:

简单看一下源码,可以看到MybatisSqlSessionFactoryBean 和sqlSessionFactoryBean的实现基本是一样的, 只在方法 buildSqlSessionFactory() 中做了比较多修改。 其中主要在此处加在所有的Mapper,根据配置生成CRUD代码,注入 CURD 动态 SQL

所以说苞米豆框架并不完全基于Mybatis实现的,从SqlSessionFacotryBean开始,而是通过copy部分代码

111.png

4.最后

具体Mybatis中用到的配置做用处解释:

  • SqlSessionFactoryBean是生产SqlSessionFactory的一种工厂bean
  • SqlSessionFactory是打开SqlSession会话的工厂接口,默认实现类DefaultSqlSessionFactory使用数据库连接池
  • SqlSession是客户端和数据库服务端之间的会话信息,里面有操作数据库的方法
  • SqlSessionTemplate是SqlSession的一个实现
  • DataSource方法:为Spring返回需要注册的数据源,这里使用HikariDataSource实现

下一章详细解一下苞米豆是如何实现的源码解析

相关文章

网友评论

    本文标题:优雅单测-5基于Mybatis支持苞米豆单测

    本文链接:https://www.haomeiwen.com/subject/wrexqktx.html