properties 属性文件的实现方式
数据库连接的 properties
配置文件,配置两个数据源信息:
spring.jdbc.driver=com.mysql.cj.jdbc.Driver
spring.jdbc.url=jdbc:mysql://localhost:3306/spring?useUnicode=true&characterEncoding=utf8&nullCatalogMeansCurrent=true&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
spring.jdbc.username=root
spring.jdbc.password=123456
mybatis.jdbc.driver=com.mysql.cj.jdbc.Driver
mybatis.jdbc.url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8&nullCatalogMeansCurrent=true&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
mybatis.jdbc.username=root
mybatis.jdbc.password=123456
Mybatis
配置文件,配置两个 environment
:
<!-- 引入数据库配置文件 -->
<properties resource="database.properties"/>
<environments default="Spring">
<environment id="Spring">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${spring.jdbc.driver}"/>
<property name="url" value="${spring.jdbc.url}"/>
<property name="username" value="${spring.jdbc.username}"/>
<property name="password" value="${spring.jdbc.password}"/>
</dataSource>
</environment>
<environment id="Mybatis">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${mybatis.jdbc.driver}"/>
<property name="url" value="${mybatis.jdbc.url}"/>
<property name="username" value="${mybatis.jdbc.username}"/>
<property name="password" value="${mybatis.jdbc.password}"/>
</dataSource>
</environment>
</environments>
通过 DataSourceSessionFactory
工具类,获取 SqlSessionFactory
:
package cn.worstone.utils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import java.util.Optional;
public final class DataSourceSessionFactory {
private static String MybatisConfigPath = "mybatis.xml";
private static Map<DataSourceEnvironment, SqlSessionFactory> sessionFactoryMap = new HashMap<>();
/**
* Mybatis 配置的 Environment 中的数据源的枚举类型(即 Environment 的 id 属性值)
*/
public static enum DataSourceEnvironment {
Spring,
Mybatis;
}
public static SqlSessionFactory getSessionFactory(DataSourceEnvironment dataSourceEnvironment) {
SqlSessionFactory sqlSessionFactory = DataSourceSessionFactory.sessionFactoryMap.get(dataSourceEnvironment);
sqlSessionFactory = Optional.ofNullable(sqlSessionFactory).orElseGet(()->{
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(DataSourceSessionFactory.MybatisConfigPath);
} catch (IOException e) {
e.printStackTrace();
}
SqlSessionFactory temp = new SqlSessionFactoryBuilder().build(inputStream, dataSourceProperties);
sessionFactoryMap.put(dataSourceProperties, temp);
return temp;
});
return sqlSessionFactory;
}
}
扩展
定义一个统一的 Mapper
标识接口,每一个具体的 Mapper
接口继承该接口:
package cn.worstone.mapper;
/**
* 通用的 Mapper 接口, 可以定制所有的通用方法, 设置参数类型为 Map<String, Object>
*/
public interface Mapper {
}
定义一个 Mapper
代理工厂,并获取 Mapper
代理,便于在执行完 Mapper
中的方法后关闭 SqlSession
:
package cn.worstone.utils;
import cn.worstone.mapper.Mapper;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public final class MapperFactory {
public static <T> T createMapper(Class<? extends Mapper> clazz, DataSourceSessionFactory.DataSourceEnvironment dataSourceEnvironment, boolean isCommit) {
SqlSessionFactory sqlSessionFactory = MapperFactory.getSqlSessionFactory(dataSourceEnvironment);
SqlSession sqlSession = sqlSessionFactory.openSession(isCommit);
Mapper mapper = sqlSession.getMapper(clazz);
return (T) MapperProxy.