Spring + Mybatis, Multiple data source configuration:
suit for : spring3.2.4RELEASE / mybatis3.3.0 / mybatis-spring1.2.2
<1>
datasource-jdbc.properties file:
jdbc.url=DbUrl
jdbc.username=username
jdbc.password=password
jdbc.appName.url=DbUrl2
jdbc.appName.username=username2
jdbc.appName.password=password2
<2>
applicationContext file :
<!--DriverManagerDataSource extends org.springframework.jdbc.datasource.AbstractDriverBasedDataSource, Override some methods, eg: password Decrypt and so on -->
<bean id="dataSource1" class="com.company.project......DriverManagerDataSource">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url">
<value>${jdbc.url}</value>
</property>
<property name="username">
<value>${jdbc.username}</value>
</property>
<property name="password">
<value>${jdbc.password}</value>
</property>
</bean>
<bean id="dataSource2" class="com.company.project......DriverManagerDataSource">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url">
<value>${jdbc.appName.url}</value>
</property>
<property name="username">
<value>${jdbc.appName.username}</value>
</property>
<property name="password">
<value>${jdbc.appName.password}</value>
</property>
</bean>
<bean id="firstSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" >
<property name="configLocation" value="classpath:myBatis_configuration.xml" />
<property name="dataSource" ref="dataSource1" />
</bean>
<bean id="secondSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" >
<property name="configLocation" value="classpath:myBatis_configuration.xml"/>
<property name="dataSource" ref="dataSource2" />
</bean>
<bean id="AclassAbstractDAO" abstract="true">
<property name="sqlSessionFactory" ref="firstSessionFactory" />
</bean>
<bean id="BclassAbstractDAO" abstract="true">
<property name="sqlSessionFactory" ref="secondSessionFactory" />
</bean>
<bean id="AclassDao" parent="AclassAbstractDAO" class="com.company.project......dao.impl.AclassDaoImpl"></bean>
<bean id="BclassDao" parent="BclassAbstractDAO" class="com.company.project......dao.impl.BclassDaoImpl"></bean>
<3>
AclassDaoImpl class :
(1) extends SqlSessionDaoSupport
(2)
@Autowired(required = true)
@Qualifier("firstSessionFactory")
public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory){
super.setSqlSessionFactory(sqlSessionFactory);
}
BclassDaoImpl class :
(1) extends SqlSessionDaoSupport
(2)
@Autowired(required = true)
@Qualifier("secondSessionFactory")
public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory){
super.setSqlSessionFactory(sqlSessionFactory);
}
<4>
myBatis_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="cacheEnabled" value="true" />
<setting name="lazyLoadingEnabled" value="true" />
<setting name="aggressiveLazyLoading" value="false" />
<setting name="multipleResultSetsEnabled" value="true" />
<setting name="useColumnLabel" value="true" />
<setting name="autoMappingBehavior" value="FULL" />
<setting name="defaultExecutorType" value="BATCH" />
<setting name="defaultStatementTimeout" value="25000" />
</settings>
<typeAliases>
<typeAlias alias="alias1" type="com.company.project......EntityName1" />
<typeAlias alias="alias2" type="com.company.project......EntityName2" />
</typeAliases>
<mappers>
<mapper resource="mybatis/mybatisSubConfig1.xml" />
<mapper resource="mybatis/mybatisSubConfig2.xml" />
</mappers>
</configuration>
<5>
mybatisSubConfig1.xml
(1) need namespace
(2) mybatis directly using sql which packaged in the background
(3) batch insert/delete/update
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.company.project......dao.Adao">
<select id="selectMappingName" parameterType="map" resultType="java.util.HashMap" statementType="STATEMENT">
${sql}
</select>
<insert id="insertMappingName" parameterType="java.util.List">
insert into tableName
<foreach collection="list" item="item" index="index" separator="union all">
(select
#{item.columnA}, #{item.columnB}, ......
from dual
)
</foreach>
</insert>
<delete id="deleteMappingName" parameterType="java.util.List">
delete from
app_batch_job_latest_status
<where>
<foreach collection="list" index="index" item="item" open="(" separator="or" close=")">
(
DbTableColumnA = #{item.columnA}
and
DbTableColumnB = #{item.columnB}
)
</foreach>
</where>
</delete>
<update id="updateMappingName" parameterType="java.util.List">
<foreach collection="list" item="item" index="index" open="begin" close=";end;" separator=";">
update app_batch_job_latest_status
<set>
DbTableColumnA = #{item.columnA},
DbTableColumnB = #{item.columnB},
......
DbTableColumnN = #{item.columnN}
</set>
where DbTableColumnX =#{item.columnX}
and DbTableColumnY = #{item.columnY}
</foreach>
</update>
</mapper>
suit for : spring3.2.4RELEASE / mybatis3.3.0 / mybatis-spring1.2.2
<1>
datasource-jdbc.properties file:
jdbc.url=DbUrl
jdbc.username=username
jdbc.password=password
jdbc.appName.url=DbUrl2
jdbc.appName.username=username2
jdbc.appName.password=password2
<2>
applicationContext file :
<!--DriverManagerDataSource extends org.springframework.jdbc.datasource.AbstractDriverBasedDataSource, Override some methods, eg: password Decrypt and so on -->
<bean id="dataSource1" class="com.company.project......DriverManagerDataSource">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url">
<value>${jdbc.url}</value>
</property>
<property name="username">
<value>${jdbc.username}</value>
</property>
<property name="password">
<value>${jdbc.password}</value>
</property>
</bean>
<bean id="dataSource2" class="com.company.project......DriverManagerDataSource">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url">
<value>${jdbc.appName.url}</value>
</property>
<property name="username">
<value>${jdbc.appName.username}</value>
</property>
<property name="password">
<value>${jdbc.appName.password}</value>
</property>
</bean>
<bean id="firstSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" >
<property name="configLocation" value="classpath:myBatis_configuration.xml" />
<property name="dataSource" ref="dataSource1" />
</bean>
<bean id="secondSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" >
<property name="configLocation" value="classpath:myBatis_configuration.xml"/>
<property name="dataSource" ref="dataSource2" />
</bean>
<bean id="AclassAbstractDAO" abstract="true">
<property name="sqlSessionFactory" ref="firstSessionFactory" />
</bean>
<bean id="BclassAbstractDAO" abstract="true">
<property name="sqlSessionFactory" ref="secondSessionFactory" />
</bean>
<bean id="AclassDao" parent="AclassAbstractDAO" class="com.company.project......dao.impl.AclassDaoImpl"></bean>
<bean id="BclassDao" parent="BclassAbstractDAO" class="com.company.project......dao.impl.BclassDaoImpl"></bean>
<3>
AclassDaoImpl class :
(1) extends SqlSessionDaoSupport
(2)
@Autowired(required = true)
@Qualifier("firstSessionFactory")
public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory){
super.setSqlSessionFactory(sqlSessionFactory);
}
BclassDaoImpl class :
(1) extends SqlSessionDaoSupport
(2)
@Autowired(required = true)
@Qualifier("secondSessionFactory")
public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory){
super.setSqlSessionFactory(sqlSessionFactory);
}
<4>
myBatis_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="cacheEnabled" value="true" />
<setting name="lazyLoadingEnabled" value="true" />
<setting name="aggressiveLazyLoading" value="false" />
<setting name="multipleResultSetsEnabled" value="true" />
<setting name="useColumnLabel" value="true" />
<setting name="autoMappingBehavior" value="FULL" />
<setting name="defaultExecutorType" value="BATCH" />
<setting name="defaultStatementTimeout" value="25000" />
</settings>
<typeAliases>
<typeAlias alias="alias1" type="com.company.project......EntityName1" />
<typeAlias alias="alias2" type="com.company.project......EntityName2" />
</typeAliases>
<mappers>
<mapper resource="mybatis/mybatisSubConfig1.xml" />
<mapper resource="mybatis/mybatisSubConfig2.xml" />
</mappers>
</configuration>
<5>
mybatisSubConfig1.xml
(1) need namespace
(2) mybatis directly using sql which packaged in the background
(3) batch insert/delete/update
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.company.project......dao.Adao">
<select id="selectMappingName" parameterType="map" resultType="java.util.HashMap" statementType="STATEMENT">
${sql}
</select>
<insert id="insertMappingName" parameterType="java.util.List">
insert into tableName
<foreach collection="list" item="item" index="index" separator="union all">
(select
#{item.columnA}, #{item.columnB}, ......
from dual
)
</foreach>
</insert>
<delete id="deleteMappingName" parameterType="java.util.List">
delete from
app_batch_job_latest_status
<where>
<foreach collection="list" index="index" item="item" open="(" separator="or" close=")">
(
DbTableColumnA = #{item.columnA}
and
DbTableColumnB = #{item.columnB}
)
</foreach>
</where>
</delete>
<update id="updateMappingName" parameterType="java.util.List">
<foreach collection="list" item="item" index="index" open="begin" close=";end;" separator=";">
update app_batch_job_latest_status
<set>
DbTableColumnA = #{item.columnA},
DbTableColumnB = #{item.columnB},
......
DbTableColumnN = #{item.columnN}
</set>
where DbTableColumnX =#{item.columnX}
and DbTableColumnY = #{item.columnY}
</foreach>
</update>
</mapper>