最近项目中遇到一个场景,须要将项目中原有的DB切成MySQL。为了验证修改后的MyBatis的XML映射文件的SQL语法是否OK,从新部署后,在界面上一顿狂点。这种作法太Low,不只没效率,还可能存在漏测。php
经过MyBatis自带的API,实现XML映射文件的加载,达到在本地测试的目的。无需启动spring框架服务,灵活配置本地调试场景。html
配置数据库驱动、用户名、密码等属性,写入db-config.properties文件中,如:java
mysql.driver=com.mysql.cj.jdbc.Driver
mysql.url=jdbc:mysql://localhost:3306/qiyin?useUnicode=true&characterEncoding=utf8
mysql.username=root
mysql.password=123456
复制代码
MyBatis配置文件的各个字段,在官网有详细介绍【传送门】 。
以下是个人配置文件mybatis-config.xml:mysql
<?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">
<!--实现mybatis与数据库的链接 -->
<configuration>
<!-- 引入属性配置文件 -->
<properties resource="db-config.properties"/>
<!-- 指定日志的具体实现 -->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
<!--<setting name="logImpl" value="LOG4J2"/>-->
</settings>
<typeAliases>
<package name="me.ifight.bean"/>
</typeAliases>
<environments default="development">
<environment id="development">
<!-- 采用JDBC管理事务-->
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${mysql.driver}"/>
<property name="url" value="${mysql.url}"/>
<property name="username" value="${mysql.username}"/>
<property name="password" value="${mysql.password}"/>
</dataSource>
</environment>
</environments>
<!-- 注册mapper -->
<mappers>
<mapper resource="mybatisMapper/ProjectMapper.xml"/>
</mappers>
</configuration>
复制代码
值得注意的有一下几点:spring
XXX is not known to the MapperRegistry
或者是抛出BindingException
异常。最终我采用了 <mapper resource="xxx/xxx/xxx.xml"/>
方式,虽然每一个XML映射文件都须要手动声明一次,但胜在不易出错。若是有更nice的方法,请在回复中不吝赐教。上面两步骤完成了一些必要的配置,接下来,就须要使用一个工具类来代替spring来实现数据库会话建立、Mapper类加载等操做。直接上代码:sql
public class MybatisUtil {
private static final LogUtil log = LogUtil.getLogger(MybatisUtil.class, MybatisUtil.class.getSimpleName());
/** * MyBatis配置文件路径 */
private static final String MYBATIS_CONFIG_PATH = "mybatis-config.xml";
private static SqlSessionFactory factory;
private static ThreadLocal<SqlSession> localSessions = new ThreadLocal<>();
/** * 加载并解析配置文件 */
static {
try(
InputStream in = Resources.getResourceAsStream(MYBATIS_CONFIG_PATH)
) {
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
factory = builder.build(in);
} catch (IOException e) {
log.error("SqlSessionFactory init error", e);
}
}
/** * 常见会话 * @return */
public static SqlSession getSession(){
SqlSession sqlSession = localSessions.get();
if (sqlSession == null){
sqlSession = factory.openSession();
localSessions.set(sqlSession);
}
if (sqlSession == null){
log.error("#getSession error, session is nulll");
} else {
log.info("#getSession successfully");
}
return sqlSession;
}
/** * 销毁会话 */
public static void closeSession(){
SqlSession sqlSession = localSessions.get();
if (sqlSession != null){
sqlSession.close();
localSessions.remove();
}
log.info("#closeSession successfully");
}
}
复制代码
在项目的resources目录中,已经有一个MyBatis的XML映射文件:mybatisMapper/ProjectMapper.xml。模拟一个select方法selectProjectsByUserName数据库
<select id="selectProjectsByUserName" resultMap="AllColumnMap">
SELECT <include refid="all_column"/>
FROM todo_project
where created_user_name = #{userName}
order by last_time desc
LIMIT 1000
</select>
复制代码
对应的接口类为:ProjectDaobash
public interface ProjectDao {
List<ProjectDO> selectProjectsByUserName(@Param("userName") String userName);
}
复制代码
public class ProjectDaoTest{
private static final LogUtil log = LogUtil.getLogger(ProjectDaoTest.class, ProjectDaoTest.class.getSimpleName());
private SqlSession sqlSession;
private ProjectDao projectDao;
@Before
public void setUp() throws Exception{
log.info("#setUp start...");
sqlSession = MybatisUtil.getSession();
projectDao = sqlSession.getMapper(ProjectDao.class);
}
@Test
public void testSelectProjectsByUserName(){
List<ProjectDO> projects = projectDao.selectProjectsByUserName("admin");
Assert.assertTrue(CollectionUtils.isNotEmpty(projects));
}
@After
public void tearDown() throws Exception{
log.info("#tearDown start...");
sqlSession.commit();
MybatisUtil.closeSession();
}
}
复制代码
测试脚本的关键在于,使用SqlSession实例的getMapper()方法加载已经注册的Mapper对象。 所谓的已经注册是指在解析MyBatis配置文件时,经过加载MyBatis配置文件中的mappers节点的信息,调用MapperRegistry实例的addMappers方法来完成注册。session
项目中通常都会存在多个MyBatis的XML映射文件,此时须要在mybatis-config.xml文件的mappers节点中添加新的映射关系。而后能够考虑,在测试包目录下,新建一个相似ProjectDaoTest的测试类。在这个类中,能够测试XML映射文件中涉及的每一个sql方法。mybatis