mybatis(基于spring4)连接多个数据库

来源:互联网 发布:全球懂英语的人数 知乎 编辑:程序博客网 时间:2024/06/05 19:39

应业务要求,需要在项目中访问另外一个数据库。最初方案是使用使用DriverManager.getConnection的形式获取,这个是最简单的办法,当然弊端也很多。所以花了一天时间在网上折腾~ 各种原创,转载貌似都没能折腾成功。最后借鉴了不少帖子的内容,终于可行了,下面贴出我的一些代码。项目使用的是spring4.3.6+mybatis3.4.1,框架搭建这里就不罗嗦了。进入正题:


1、jdbc.properties配置文件

#web数据库web.jdbc.driver=com.mysql.jdbc.Driverweb.jdbc.url=jdbc:mysql://localhost:3306/dev_webweb.jdbc.username=rootweb.jdbc.password=123#app数据库app.jdbc.driver=com.mysql.jdbc.Driverapp.jdbc.url=jdbc:mysql://192.168.6.14:3306/dev_appapp.jdbc.username=rootapp.jdbc.password=123


2、applicationContext.xml核心配置,其他的配置例如mybatis的mapper扫描、事务管理的就不贴出了。

<bean id="propertyConfigurer"      class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">    <property name="locations">        <list>            <value>classpath:jdbc.properties</value>        </list>    </property></bean><!-- 数据库连接池 :webDataSource --><bean id="webDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"      destroy-method="close">    <!-- 数据库驱动 -->    <property name="driverClass" value="${web.jdbc.driver}"/>    <!-- 相应驱动的jdbcUrl -->    <property name="jdbcUrl" value="${web.jdbc.url}"/>    <!-- 数据库的用户名 -->    <property name="user" value="${web.jdbc.username}"/>    <!-- 数据库的密码 -->    <property name="password" value="${web.jdbc.password}"/>    <!-- 初始化连接池时连接数量为5个 -->    <property name="initialPoolSize" value="5"/>    <!-- 允许最小连接数量为5个 -->    <property name="minPoolSize" value="5"/>    <!-- 允许最大连接数量为20个 -->    <property name="maxPoolSize" value="20"/>    <!-- 允许连接池最大生成100个PreparedStatement对象 -->    <property name="maxStatements" value="100"/>    <!-- 连接有效时间,连接超过3600秒未使用,则该连接丢弃 -->    <property name="maxIdleTime" value="3600"/>    <!-- 连接用完时,一次产生的新连接步进值为2 -->    <property name="acquireIncrement" value="2"/>    <!-- 获取连接失败后再尝试10次,再失败则返回DAOException异常 -->    <property name="acquireRetryAttempts" value="10"/>    <!-- 获取下一次连接时最短间隔600毫秒,有助于提高性能 -->    <property name="acquireRetryDelay" value="600"/>    <!-- 检查连接的有效性 -->    <property name="testConnectionOnCheckin" value="true"/>    <!-- 每个1200秒检查连接对象状态 -->    <property name="idleConnectionTestPeriod" value="1200"/>    <!-- 获取新连接的超时时间为10000毫秒 -->    <property name="checkoutTimeout" value="10000"/></bean><!-- 数据库连接池 :appDataSource --><bean id="appDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"      destroy-method="close">    <!-- 数据库驱动 -->    <property name="driverClass" value="${app.jdbc.driver}"/>    <!-- 相应驱动的jdbcUrl -->    <property name="jdbcUrl" value="${app.jdbc.url}"/>    <!-- 数据库的用户名 -->    <property name="user" value="${web.jdbc.username}"/>    <!-- 数据库的密码 -->    <property name="password" value="${app.jdbc.password}"/>    <!-- 初始化连接池时连接数量为5个 -->    <property name="initialPoolSize" value="5"/>    <!-- 允许最小连接数量为5个 -->    <property name="minPoolSize" value="5"/>    <!-- 允许最大连接数量为20个 -->    <property name="maxPoolSize" value="20"/>    <!-- 允许连接池最大生成100个PreparedStatement对象 -->    <property name="maxStatements" value="100"/>    <!-- 连接有效时间,连接超过3600秒未使用,则该连接丢弃 -->    <property name="maxIdleTime" value="3600"/>    <!-- 连接用完时,一次产生的新连接步进值为2 -->    <property name="acquireIncrement" value="2"/>    <!-- 获取连接失败后再尝试10次,再失败则返回DAOException异常 -->    <property name="acquireRetryAttempts" value="10"/>    <!-- 获取下一次连接时最短间隔600毫秒,有助于提高性能 -->    <property name="acquireRetryDelay" value="600"/>    <!-- 检查连接的有效性 -->    <property name="testConnectionOnCheckin" value="true"/>    <!-- 每个1200秒检查连接对象状态 -->    <property name="idleConnectionTestPeriod" value="1200"/>    <!-- 获取新连接的超时时间为10000毫秒 -->    <property name="checkoutTimeout" value="10000"/></bean>
<!-- 数据库连接池 --><bean id="customDataSource" class="com.web.framework.dataSource.CustomDataSource">
<property name="targetDataSources"> <map key-type="java.lang.String"> <entry value-ref="webDataSource" key="webDataSource"/> <entry value-ref="appDataSource" key="appDataSource"/> </map> </property> <!-- 默认使用webDataSource --> <property name="defaultTargetDataSource" ref="webDataSource"/></bean>

上述代码中依赖了一个类CustomDataSource,在com.web.framework.dataSource包下新建类。代码如下:

CustomDataSource:

public class CustomDataSource extends AbstractRoutingDataSource {    @Override    protected Object determineCurrentLookupKey() {        return CustomThreadLocal.getDbType();    }}

CustomThreadLocal:

public class CustomThreadLocal {    private static final ThreadLocal<String> threadLocal = new ThreadLocal<String>();    public static void setDbType(String dbType) {        threadLocal.set(dbType);    }    public static String getDbType() {        return ((String) threadLocal.get());    }    public static void clearDbType() {        threadLocal.remove();    }}


至此配置结束。如果是访问默认库dev_web的话使用正常的开发流程即可,如果是想访问dev_app数据库怎么办呢?其实非常简单的,只要在查询语句的表名前加上数据库名即可。例如我们要查询dev_app数据库的用户表里所有用户:


<mapper namespace="com.web.framework.mapper.AppUserMapper">    <resultMap id="BaseResultMap" type="com.web.framework.entity.AppUser">        <id column="user_id" jdbcType="VARCHAR" property="userId"/>        <result column="user_name" jdbcType="VARCHAR" property="userName"/>        <result column="user_password" jdbcType="VARCHAR" property="userPassword"/>        <result column="create_time" jdbcType="TIMESTAMP" property="createTime"/>    </resultMap>    <sql id="Base_Column_List">        user_id, user_name, user_password, create_time    </sql>    <select id="selectAllUser" resultMap="BaseResultMap">        select        <include refid="Base_Column_List"/>        from dev_app.app_user    </select>


上面都些是关键代码位置,并且精简了一些东西,可以为有需要的朋友做参考,如有问题或优化,欢迎指正,谢谢。




0 0
原创粉丝点击