MyBatis在普通Java中的应用
MyBatisPlusadmin 发布于:2017-06-10 09:54:57
阅读:loading
接着上一篇的quartz来说,背景都一样,涉及到dao层模块,最先是把以前封装的apache-dbutils组件拿过来,后来越来越觉得在代码里写一堆sql日后肯定会很蛋疼的,在能力范围内将代码写到最好,我理解的最好是可维护性最佳,毕竟niubility的人写出来的代码渣渣水平都是能改的,而渣渣写出来的代码反而niubility的人都改不了的,不废话了。
强烈建议按着这里过一遍http://www.mybatis.org/mybatis-3/zh/index.html,基本上你就都了解了,MyBatis的介绍说SqlSessionFactory对象只能适于一个环境,换句话说,如果你想适用于两个数据库,那么需要创建两个SqlSessionFactory实例,每个数据库对应一个;如果是三个数据库则需要三个实例,以此类推。
这里有一个概念需要说明一下,普通Java程序的意义这里解释的有些不科学,其实我想表达式非框架环境,即抛离spring后的mybatis,普通类调用mybatis的方式。
由于本次软件的特殊,配置类型的文件都将存放的与src目录同级,所以在创建SqlSessionFactory的时候,它的configuration.xml配置文件是我以流的形式传递的,而配置文件中涉及到从database.properties配置文件中获取连接数据库的相关参数,所以我预先读取到此properties文件中的参数,再去构造相关的SqlSessionFactory实例(configuration.xm文件中有properties文件的读取标签,可能是由于本次配置文件存储目录的特殊性,导致它提供的配置文件路径无法被找到),参考代码如下:
configuration.xml 配置文件,包括两个数据源
<?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>
<!-- 参数设置 -->
<settings>
<setting name="logPrefix" value=""/><!-- 生成日志的输出前缀 -->
</settings>
<!--
指定某个包下的Javabean名称可以使用短名称,即直接使用类名替代类的限定名
注:如果没有使用注解来声明它的名称,默认为首字母小写
-->
<typeAliases>
<package name="cn.chendd.vo"/>
</typeAliases>
<!-- properties文件通过构造SqlSessionFactory来指定 -->
<environments default="LOCALE">
<environment id="LOCALE">
<transactionManager type="JDBC" />
<dataSource type="cn.chendd.mybatis.DbcpPoolFactory">
<property name="driver" value="${driverClassName}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
<property name="driver.poolMaximumActiveConnections" value="${initialSize}"/><!-- 可以存在活动的连接数量 -->
<property name="driver.poolMaximumIdleConnections" value="${maxIdle}"/><!-- 最大的空闲连接数 -->
<property name="driver.poolMaximumCheckoutTime" value="${maxWait}"/><!-- 超时时间 -->
<property name="driver.encoding" value="UTF-8"/>
</dataSource>
</environment>
<environment id="REMOVE">
<transactionManager type="JDBC" />
<dataSource type="cn.chendd.mybatis.DbcpPoolFactory">
<property name="driver" value="${driverClassName}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
<property name="driver.poolMaximumActiveConnections" value="${initialSize}"/><!-- 可以存在活动的连接数量 -->
<property name="driver.poolMaximumIdleConnections" value="${maxIdle}"/><!-- 最大的空闲连接数 -->
<property name="driver.poolMaximumCheckoutTime" value="${maxWait}"/><!-- 超时时间 -->
<property name="driver.encoding" value="UTF-8"/>
</dataSource>
</environment>
</environments>
<!-- 配置文件 -->
<mappers>
<mapper resource="sqls/DemoDao.xml" />
</mappers>
</configuration>
数据源实例枚举
public enum EnumDataSource {
LOCALE(),//数据源1
REMOVE(),//数据源2
;
}
SqlSessionFactory实例包装(实例数与environment环境数一样)
private static Map<EnumDataSource , SqlSessionFactory> sqlSessionFactorys = Init.instances;
/**
* 内部单例类
*/
protected static final class Init {
private static Map<EnumDataSource , SqlSessionFactory> instances = new HashMap<EnumDataSource , SqlSessionFactory>();
static {
initSqlSessionFactory();
}
private static void initSqlSessionFactory() {
String config = new PropertiesUtil("configuration.xml").getPropertiesByPath();
EnumDataSource datas[] = EnumDataSource.values();
Properties props = new PropertiesUtil("database.properties").getProperties();
//每构造一个数据源都需要一个新的InputStream对象,因为build函数会将Input流close
for (EnumDataSource enumDataSource : datas) {
try {
InputStream input = new FileInputStream(config);
SqlSessionFactory instance = new SqlSessionFactoryBuilder().build(input , props);
instances.put(enumDataSource, instance);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
}
每个BaseDao的实现基于一个数据源
/**
* BaseDao封装,基于某个具体的数据源
*/
public class LocaleDao extends SqlSessionFactoryUtil {
@Override
public SqlSession getSqlSession() {
return super.getLocaleSqlSession();
}
}
/**
* BaseDao封装,基于某个具体的数据源
*/
public class RemoteDao extends SqlSessionFactoryUtil {
@Override
public SqlSession getSqlSession() {
return super.getRemoveSqlSession();
}
}
测试类
public static void main(String[] args) {
LocaleDao dao = new LocaleDao();
//查询一条数据
Map<String , Object> map = dao.selectOne("cn.DemoDao.queryUsers" , null);
System.out.println(map);
}
点赞