背景:有时候需要测试xml中的sql写的对不对,重启整个系统比较慢。
一般的方式是:
(1)创建mybatis-config.xml,里面配置datasource,然后配置要测试的sql所在xml
(2)然后再通过mybatis自带的方式获取它的SqlSessionFactory 和sqlSession
import org.apache.ibatis.datasource.pooled.PooledDataSource;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.mapping.Environment;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.ibatis.transaction.TransactionFactory;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MybatisTest {
@Before
public void beforeTest() throws IOException {
System.out.println("-------------------------------before----------------------------");
// 创建数据源
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
sqlSession = sqlSessionFactory.openSession(true);
}
@After
public void after(){
System.out.println("-------------------------------after----------------------------");
sqlSession.close();
}
@Test
public void testMybatis() throws IOException {
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map params = new HashMap<>();
params.put("XX",1001);
System.out.println(mapper.query(params));
}
}
mybatis-config.xml
其实也挺方便的,但还是很烦,每次要去mybatis-config.xml里面去加 xml!!!
借鉴springboot中对mapperLocations的处理:
改进后的方法:
import org.apache.ibatis.datasource.pooled.PooledDataSource;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.mapping.Environment;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.ibatis.transaction.TransactionFactory;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MybatisTest {
SqlSession sqlSession;
DataSource dataSource;
private void setDataSource(){
// 创建数据源
dataSource = new PooledDataSource("org.postgresql.Driver",
"jdbc:postgresql://xxxx",
"xx",
"xxx");
}
public Resource[] resolveMapperLocations(String[] mapperLocations) {
ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();
List resources = new ArrayList();
if (mapperLocations != null) {
for (String mapperLocation : mapperLocations) {
try {
Resource[] mappers = resourceResolver.getResources(mapperLocation);
resources.addAll(Arrays.asList(mappers));
} catch (IOException e) {
// ignore
}
}
}
return resources.toArray(new Resource[resources.size()]);
}
@Before
public void beforeTestSpring() throws Exception {
System.out.println("-------------------------------before222----------------------------");
// 创建数据源
setDataSource();
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
org.springframework.core.io.Resource[] resources = resolveMapperLocations(new String[]{"mappers/com/xxxx/*.xml"});
sqlSessionFactoryBean.setMapperLocations(resources);
sqlSessionFactoryBean.setDataSource(dataSource);
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBean.getObject();
sqlSession = sqlSessionFactory.openSession(true);
}
@After
public void after(){
System.out.println("----------after-------------");
sqlSession.close();
}
@Test
public void testMybatis() throws IOException {
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map params = new HashMap<>();
params.put("XX",1001);
System.out.println(mapper.query(params));
}
}
这样的好处就是:
(1)配一个mapperLocation就好了,不用再去一个个配sql的xml位置。
(2)springboot单元测试也可以做测试,但是会启动所有的bean,扫描所有xml,这样不用依赖spring启动,只要有spring环境即可,同时又避免了springboot整个启动,扫描所有xml。



