mybatis动态sqlmybatis 关联查询询时on怎么添加

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&素颜猪 的BLOG
用户名:素颜猪
文章数:193
访问量:10627
注册日期:
阅读量:5863
阅读量:12276
阅读量:337445
阅读量:1040892
51CTO推荐博文
一、创建项目和数据库&& &项目名称:mybatis092901&& &数据库名称:mybatis0929&& &&& &表名称:dept&& &&& &CREATE TABLE `dept` (&& &&& && `deptNo` int(11) NOT NULL,&& &&& && `deptName` varchar(30) DEFAULT NULL,&& &&& && `location` varchar(30) DEFAULT NULL,&& &&& && PRIMARY KEY (`deptNo`)&& &&& &) ENGINE=InnoDB DEFAULT CHARSET=utf8;&& &&& &表名称:emp&& &&& &CREATE TABLE `emp` (&& &&& && `empno` int(11) NOT NULL,&& &&& && `ename` varchar(30) DEFAULT NULL,&& &&& && `hiredate` date DEFAULT NULL,&& &&& && `job` varchar(30) DEFAULT NULL,&& &&& && `sal` double DEFAULT NULL,&& &&& && `mgr` varchar(30) DEFAULT NULL,&& &&& && `comm` varchar(30) DEFAULT NULL,&& &&& && `deptno` int(11) DEFAULT NULL,&& &&& && PRIMARY KEY (`empno`)&& &&& &) ENGINE=InnoDB DEFAULT CHARSET=utf8;二、添加jar包&& &1.在项目上创建lib目录&& &&& &/lib&& &2.在lib目录下添加jar&& &&& &junit-4.10.jar&& &&& &mybatis-3.2.2.jar&& &&& &mysql-connector-java-5.1.10-bin.jar三、添加配置文件&& &1.在项目上创建conf目录&& &&& &/conf&& &2.在conf目录下添加配置文件&& &&& &配置文件名称:mybatis-config.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&&& &&& &&& &&typeAliases&&& &&& &&& &&& &&typeAlias alias="Emp" type="cn.jbit.mybatis092901.domain.Emp"/&&& &&& &&& &&/typeAliases&&& &&& &&& &&environments default="development"&&& &&& &&& &&& &&environment id="development"&&& &&& &&& &&& &&transactionManager type="JDBC"/&&& &&& &&& &&& &&& &&dataSource type="POOLED"&&& &&& &&& &&& &&& &&property name="driver" value="com.mysql.jdbc.Driver"/&&& &&& &&& &&& &&& &&property name="url" value="jdbc:mysql://localhost:3306/mybatis0929"/&&& &&& &&& &&& &&& &&property name="username" value="root"/&&& &&& &&& &&& &&& &&property name="password" value="root"/&&& &&& &&& &&& &&& &&/dataSource&&& &&& &&& &&& &&/environment&&& &&& &&& &&/environments&&& &&& &&/configuration&四、创建实体类&& &1.在src目录下创建包&& &&& &包名:cn.jbit.mybatis092901.domain&& &2.在包下创建实体类&& &&& &类名:Dept.java&& &&& &内容:&& &&& &public class Dept implements Serializable {&& &&& &&& &private Integer deptNo;//部门编号&& &&& &&& &private String deptN//部门名称&& &&& &&& &private S//部门地址&& &&& &&& &//省略get and set && &&& &}&& &&& &类名:Emp.java&& &&& &内容:&& &&& &public class Emp implements Serializable {&& &&& &&& &//员工姓名&& &&& &&& &private String empN&& &&& &&& &//员工编号&& &&& &&& &private Integer empNo;&& &&& &&& &//员工入职时间&& &&& &&& &private Date hireD&& &&& &&& &&& &//员工职位&& &&& &&& &private S&& &&& &&& &//员工工资&& &&& &&& &private D&& &&& &&& &//经理编号&& &&& &&& &private I&& &&& &&& &//奖金&& &&& &&& &private D&& &&& &&& &//部门编号&& &&& &&& &private Integer deptNo;&& &&& &&& &//省略get and set && &&& &}五、持久层设计&& &1.接口设计&& &&& &1).在src目录创建包&& &&& &&& &包名:cn.jbit.mybatis092901.dao&& &&& &2).在包下创建接口&& &&& &&& &接口名:IEmpDao.java&& &&& &&& &接口中内容:&& &&& &&& &public interface IEmpDao {&& &&& &&& &&& &/**&& &&& &&& &&& & * 10.3.1节示例: 使用动态SQL IF元素实现查询根据姓名和部门查询员工信息&& &&& &&& &&& & * @param emp&& &&& &&& &&& & * @return&& &&& &&& &&& & */&& &&& &&& &&& &public List&Emp& findEmpByExampleIf(Emp emp);&& &&& &&& &}六、添加相关映射文件&& &1.在conf下添加配置文件&& &&& &映射文件名称:EmpDaoMapper.xml&& &&& &映射文件内容:&& &&& &&?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="cn.jbit.mybatis092901.dao.IEmpDao"&&& &&& &&& &&resultMap id="empResultMap" type="cn.jbit.mybatis092901.domain.Emp"&&& &&& &&& &&& &&id property="empNo" column="empno" /&&& &&& &&& &&& &&result property="empName" column="ename" /&&& &&& &&& &&& &&result property="hireDate" column="hiredate" /&&& &&& &&& &&& &&result property="job" column="job" /&&& &&& &&& &&& &&result property="salary" column="sal" /&&& &&& &&& &&& &&result property="comm" column="comm" /&&& &&& &&& &&/resultMap&&& &&& &&& &&!--&& &&& &&& &&& &使用if动态拼接sql语句 && &&& &&& & --&&& &&& & &&& &&select id="findEmpByExampleIf" parameterType="Emp" resultMap="empResultMap"&&& &&& & &&& &&& &SELECT * FROM EMP WHERE 1 = 1&& &&& & &&& &&& &&if test ="deptNo != null"&&& &&& & &&& &&& &&& &and deptno= #{deptNo}&& &&& & &&& &&& &&/if&&& &&& & &&& &&& &&if test ="empName != null"&&& &&& & &&& &&& &&& &and ename= #{empName}&& &&& & &&& &&& &&/if&&& &&& & &&& &&/select&&& &&& &&/mapper&七.持久层实现类设计&& &&& &1).在src目录下创建包&& &&& &&& &包名:cn.jbit.mybatis092901.dao.impl&& &&& &2).在包下创建实现类&& &&& &&& &实现类名:EmpDaoImpl.java&& &&& &&& &实现类中的内容:&& &&& &&& &/**&& &&& &&& & * 为了使用代码看起来清晰,SqlSession的获取都使用工具类&& &&& &&& & */&& &&& &&& &@Override&& &&& &&& &public void insertEmp(Emp emp) {&& &&& &&& &&& &String resource = "mybatis-config.xml";&& &&& &&& &&& &Reader reader =&& &&& &&& &&& &SqlSessionFactory factory =&& &&& &&& &&& &SqlSession session =&& &&& &&& &&& &try {&& &&& &&& &&& &&& &reader = Resources.getResourceAsReader(resource);&& &&& &&& &&& &&& &SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();&& &&& &&& &&& &&& &factory = builder.build(reader);&& &&& &&& &&& &&& &session = factory.openSession();&& &&& &&& &&& &&& &List&Emp& empList = new ArrayList();&& &&& &&& &&& &&& &empList = session.selectList("cn.jbit.mybatis092901.dao.IEmpDao.findEmpByExampleIf",emp);&& &&& &&& &&& &} catch (Exception e1) {&& &&& &&& &&& &&& &e1.printStackTrace();&& &&& &&& &&& &}finally {&& &&& &&& &&& &&& &session.close();&& &&& &&& &&& &}&& &&& &&& &}八、在配置文件中添加映射文件引用&& &1.在mybatis-fonfig.xml文件中添加mapper&& &&& &&mappers&&& &&& &&& &&mapper resource="EmpDaoMapper.xml"/&&& &&& &&/mappers&九、测试操作&& &1.在项目中创建test目录&& &&& &/test&& &2.在test目录下创建包&& &&& &cn.jbit.mybatis092901.dao&& &3.在包下创建测试类&& &&& &类名:EmpDaoTest.java&& &&& &内容:&& &&& &public class EmpDaoTest {&& &&& &&& &//员工类的持久层实现&& &&& &&& &private static IEmpDao empDao = new EmpDaoImpl();&& &&& &&& &@Test&& &&& &&& &public void testIf(){&& &&& &&& &&& &Emp emp = new Emp();&& &&& &&& &&& &emp.setDeptNo(9);&& &&& &&& &&& &emp.setEmpName("张平U");&& &&& &&& &&& &List&Emp& emps = empDao.findEmpByExampleIf(emp);&& &&& &&& &&& &printEmpList(emps);&& &&& &&& &}&& &&& &&& &&& &&& &&& &private void printEmpList(List&Emp& empList){&& &&& &&& &&& &for(Emp emp:empList){&& &&& &&& &&& &&& &printEmp(emp);&& &&& &&& &&& &}&& &&& &&& &}&& &&& &}本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)&&待Spring整合Mybatis实现动态数据源切换教程配置一.摘要这篇文章将介绍Spring整合Mybatis 如何完成SqlSessionFactory的动态切换的。并且会简单的介绍下MyBatis整合Spring中的官方的相关代码。Spring整合MyBatis切换SqlSessionFactory有两种方法,第一、 继承SqlSessionDaoSupport,重写获取SqlSessionFactory的方法。第二、继承SqlSessionTemplate 重写getSqlSessionFactory、getConfiguration和SqlSessionInterceptor这个拦截器。其中最为关键还是继承SqlSessionTemplate 并重写里面的方法。而Spring整合MyBatis也有两种方式,一种是配置MapperFactoryBean,另一种则是利用MapperScannerConfigurer进行扫描接口或包完成对象的自动创建。相对来说后者更方便些。MapperFactoryBean继承了SqlSessionDaoSupport也就是动态切换SqlSessionFactory的第一种方法,我们需要重写和实现SqlSessionDaoSupport方法,或者是继承MapperFactoryBean来重写覆盖相关方法。如果利用MapperScannerConfigurer的配置整合来切换SqlSessionFactory,那么我们就需要继承SqlSessionTemplate,重写上面提到的方法。在整合的配置中很多地方都是可以注入SqlSessionTemplate代替SqlSessionFactory的注入的。因为SqlSessionTemplate的创建也是需要注入SqlSessionFactory的。二.实现代码1.继承SqlSessionTemplate 重写getSqlSessionFactory,getConfiguration和SqlSessionInterceptor
package com.hoo.framework.mybatis.
import static java.lang.reflect.Proxy.newProxyI
import static org.apache.ibatis.reflection.ExceptionUtil.unwrapT
import static org.mybatis.spring.SqlSessionUtils.closeSqlS
import static org.mybatis.spring.SqlSessionUtils.getSqlS
import static org.mybatis.spring.SqlSessionUtils.isSqlSessionT
import java.lang.reflect.InvocationH
import java.lang.reflect.M
import java.sql.C
import java.util.L
import java.util.M
import org.apache.ibatis.exceptions.PersistenceE
import org.apache.ibatis.executor.BatchR
import org.apache.ibatis.session.C
import org.apache.ibatis.session.ExecutorT
import org.apache.ibatis.session.ResultH
import org.apache.ibatis.session.RowB
import org.apache.ibatis.session.SqlS
import org.apache.ibatis.session.SqlSessionF
import org.mybatis.spring.MyBatisExceptionT
import org.mybatis.spring.SqlSessionT
import org.springframework.dao.support.PersistenceExceptionT
import org.springframework.util.A
* &b&function:&/b& 继承SqlSessionTemplate 重写相关方法
* @author hoojo
* @createDate
下午03:07:46
* @file CustomSqlSessionTemplate.java
* @package com.hoo.framework.mybatis.support
* @project SHMB
* @blog http://blog.csdn.net/IBM_hoojo
* @email hoojo_@
* @version 1.0
public class CustomSqlSessionTemplate extends SqlSessionTemplate {
private final SqlSessionFactory sqlSessionF
private final ExecutorType executorT
private final SqlSession sqlSessionP
private final PersistenceExceptionTranslator exceptionT
private Map&Object, SqlSessionFactory& targetSqlSessionF
private SqlSessionFactory defaultTargetSqlSessionF
public void setTargetSqlSessionFactorys(Map&Object, SqlSessionFactory& targetSqlSessionFactorys) {
this.targetSqlSessionFactorys = targetSqlSessionF
public void setDefaultTargetSqlSessionFactory(SqlSessionFactory defaultTargetSqlSessionFactory) {
this.defaultTargetSqlSessionFactory = defaultTargetSqlSessionF
public CustomSqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
this(sqlSessionFactory, sqlSessionFactory.getConfiguration().getDefaultExecutorType());
public CustomSqlSessionTemplate(SqlSessionFactory sqlSessionFactory, ExecutorType executorType) {
this(sqlSessionFactory, executorType, new MyBatisExceptionTranslator(sqlSessionFactory.getConfiguration()
.getEnvironment().getDataSource(), true));
public CustomSqlSessionTemplate(SqlSessionFactory sqlSessionFactory, ExecutorType executorType,
PersistenceExceptionTranslator exceptionTranslator) {
super(sqlSessionFactory, executorType, exceptionTranslator);
this.sqlSessionFactory = sqlSessionF
this.executorType = executorT
this.exceptionTranslator = exceptionT
this.sqlSessionProxy = (SqlSession) newProxyInstance(
SqlSessionFactory.class.getClassLoader(),
new Class[] { SqlSession.class },
new SqlSessionInterceptor());
this.defaultTargetSqlSessionFactory = sqlSessionF
public SqlSessionFactory getSqlSessionFactory() {
SqlSessionFactory targetSqlSessionFactory = targetSqlSessionFactorys.get(CustomerContextHolder.getContextType());
if (targetSqlSessionFactory != null) {
return targetSqlSessionF
} else if (defaultTargetSqlSessionFactory != null) {
return defaultTargetSqlSessionF
Assert.notNull(targetSqlSessionFactorys, &Property &#39;targetSqlSessionFactorys&#39; or &#39;defaultTargetSqlSessionFactory&#39; are required&);
Assert.notNull(defaultTargetSqlSessionFactory, &Property &#39;defaultTargetSqlSessionFactory&#39; or &#39;targetSqlSessionFactorys&#39; are required&);
return this.sqlSessionF
public Configuration getConfiguration() {
return this.getSqlSessionFactory().getConfiguration();
public ExecutorType getExecutorType() {
return this.executorT
public PersistenceExceptionTranslator getPersistenceExceptionTranslator() {
return this.exceptionT
* {@inheritDoc}
public &T& T selectOne(String statement) {
return this.sqlSessionProxy.&T& selectOne(statement);
* {@inheritDoc}
public &T& T selectOne(String statement, Object parameter) {
return this.sqlSessionProxy.&T& selectOne(statement, parameter);
* {@inheritDoc}
public &K, V& Map&K, V& selectMap(String statement, String mapKey) {
return this.sqlSessionProxy.&K, V& selectMap(statement, mapKey);
* {@inheritDoc}
public &K, V& Map&K, V& selectMap(String statement, Object parameter, String mapKey) {
return this.sqlSessionProxy.&K, V& selectMap(statement, parameter, mapKey);
* {@inheritDoc}
public &K, V& Map&K, V& selectMap(String statement, Object parameter, String mapKey, RowBounds rowBounds) {
return this.sqlSessionProxy.&K, V& selectMap(statement, parameter, mapKey, rowBounds);
* {@inheritDoc}
public &E& List&E& selectList(String statement) {
return this.sqlSessionProxy.&E& selectList(statement);
* {@inheritDoc}
public &E& List&E& selectList(String statement, Object parameter) {
return this.sqlSessionProxy.&E& selectList(statement, parameter);
* {@inheritDoc}
public &E& List&E& selectList(String statement, Object parameter, RowBounds rowBounds) {
return this.sqlSessionProxy.&E& selectList(statement, parameter, rowBounds);
* {@inheritDoc}
public void select(String statement, ResultHandler handler) {
this.sqlSessionProxy.select(statement, handler);
* {@inheritDoc}
public void select(String statement, Object parameter, ResultHandler handler) {
this.sqlSessionProxy.select(statement, parameter, handler);
* {@inheritDoc}
public void select(String statement, Object parameter, RowBounds rowBounds, ResultHandler handler) {
this.sqlSessionProxy.select(statement, parameter, rowBounds, handler);
* {@inheritDoc}
public int insert(String statement) {
return this.sqlSessionProxy.insert(statement);
* {@inheritDoc}
public int insert(String statement, Object parameter) {
return this.sqlSessionProxy.insert(statement, parameter);
* {@inheritDoc}
public int update(String statement) {
return this.sqlSessionProxy.update(statement);
* {@inheritDoc}
public int update(String statement, Object parameter) {
return this.sqlSessionProxy.update(statement, parameter);
* {@inheritDoc}
public int delete(String statement) {
return this.sqlSessionProxy.delete(statement);
* {@inheritDoc}
public int delete(String statement, Object parameter) {
return this.sqlSessionProxy.delete(statement, parameter);
* {@inheritDoc}
public &T& T getMapper(Class&T& type) {
return getConfiguration().getMapper(type, this);
* {@inheritDoc}
public void commit() {
throw new UnsupportedOperationException(&Manual commit is not allowed over a Spring managed SqlSession&);
* {@inheritDoc}
public void commit(boolean force) {
throw new UnsupportedOperationException(&Manual commit is not allowed over a Spring managed SqlSession&);
* {@inheritDoc}
public void rollback() {
throw new UnsupportedOperationException(&Manual rollback is not allowed over a Spring managed SqlSession&);
* {@inheritDoc}
public void rollback(boolean force) {
throw new UnsupportedOperationException(&Manual rollback is not allowed over a Spring managed SqlSession&);
* {@inheritDoc}
public void close() {
throw new UnsupportedOperationException(&Manual close is not allowed over a Spring managed SqlSession&);
* {@inheritDoc}
public void clearCache() {
this.sqlSessionProxy.clearCache();
* {@inheritDoc}
public Connection getConnection() {
return this.sqlSessionProxy.getConnection();
* {@inheritDoc}
* @since 1.0.2
public List&BatchResult& flushStatements() {
return this.sqlSessionProxy.flushStatements();
* Proxy needed to route MyBatis method calls to the proper SqlSession got from Spring&#39;s Transaction Manager It also
* unwraps exceptions thrown by {@code Method#invoke(Object, Object...)} to pass a {@code PersistenceException} to
* the {@code PersistenceExceptionTranslator}.
private class SqlSessionInterceptor implements InvocationHandler {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
final SqlSession sqlSession = getSqlSession(
CustomSqlSessionTemplate.this.getSqlSessionFactory(),
CustomSqlSessionTemplate.this.executorType,
CustomSqlSessionTemplate.this.exceptionTranslator);
Object result = method.invoke(sqlSession, args);
if (!isSqlSessionTransactional(sqlSession, CustomSqlSessionTemplate.this.getSqlSessionFactory())) {
// force commit even on non-dirty sessions because some databases require
// a commit/rollback before calling close()
mit(true);
} catch (Throwable t) {
Throwable unwrapped = unwrapThrowable(t);
if (CustomSqlSessionTemplate.this.exceptionTranslator != null && unwrapped instanceof PersistenceException) {
Throwable translated = CustomSqlSessionTemplate.this.exceptionTranslator
.translateExceptionIfPossible((PersistenceException) unwrapped);
if (translated != null) {
unwrapped =
} finally {
closeSqlSession(sqlSession, CustomSqlSessionTemplate.this.getSqlSessionFactory());
&&&重写后的getSqlSessionFactory方法会从我们配置的SqlSessionFactory集合targetSqlSessionFactorys或默认的defaultTargetSqlSessionFactory中获取Session对象。而改写的SqlSessionInterceptor 是这个MyBatis整合Spring的关键,所有的SqlSessionFactory对象的session都将在这里完成创建、提交、关闭等操作。所以我们改写这里的代码,在这里获取getSqlSessionFactory的时候,从多个SqlSessionFactory中获取我们设置的那个即可。上面添加了targetSqlSessionFactorys、defaultTargetSqlSessionFactory两个属性来配置多个SqlSessionFactory对象和默认的SqlSessionFactory对象。CustomerContextHolder 设置SqlSessionFactory的类型
package com.hoo.framework.mybatis.
public abstract class CustomerContextHolder {
public final static String SESSION_FACTORY_MYSQL = &mysql&;
public final static String SESSION_FACTORY_ORACLE = &oracle&;
private static final ThreadLocal&String& contextHolder = new ThreadLocal&String&();
public static void setContextType(String contextType) {
contextHolder.set(contextType);
public static String getContextType() {
return contextHolder.get();
public static void clearContextType() {
contextHolder.remove();
2、配置相关的文件applicationContext-session-factory.xml
&?xml version=&1.0& encoding=&UTF-8&?&
&beans xmlns=&http://www.springframework.org/schema/beans&
xmlns:aop=&http://www.springframework.org/schema/aop&
xmlns:tx=&http://www.springframework.org/schema/tx&
xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance&
xsi:schemaLocation=&http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd &&
&!-- 配置c3p0数据源 --&
&bean id=&dataSourceOracle& class=&com.mchange.boPooledDataSource& destroy-method=&close&&
&property name=&driverClass& value=&${datasource.driver}&/&
&property name=&jdbcUrl& value=&${datasource.url}&/&
&property name=&user& value=&${datasource.username}&/&
&property name=&password& value=&${datasource.password}&/&
&property name=&acquireIncrement& value=&${c3p0.acquireIncrement}&/&
&property name=&initialPoolSize& value=&${c3p0.initialPoolSize}&/&
&property name=&minPoolSize& value=&${c3p0.minPoolSize}&/&
&property name=&maxPoolSize& value=&${c3p0.maxPoolSize}&/&
&property name=&maxIdleTime& value=&${c3p0.maxIdleTime}&/&
&property name=&idleConnectionTestPeriod& value=&${c3p0.idleConnectionTestPeriod}&/&
&property name=&maxStatements& value=&${c3p0.maxStatements}&/&
&property name=&numHelperThreads& value=&${c3p0.numHelperThreads}&/&
&property name=&preferredTestQuery& value=&${c3p0.preferredTestQuery}&/&
&property name=&testConnectionOnCheckout& value=&${c3p0.testConnectionOnCheckout}&/&
&bean id=&dataSourceMySQL& class=&com.mchange.boPooledDataSource& destroy-method=&close&&
&property name=&driverClass& value=&com.mysql.jdbc.Driver&/&
&property name=&jdbcUrl& value=&jdbc:mysql://172.31.108.178:3306/world?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&/&
&property name=&user& value=&root&/&
&property name=&password& value=&jp2011&/&
&property name=&acquireIncrement& value=&${c3p0.acquireIncrement}&/&
&property name=&initialPoolSize& value=&${c3p0.initialPoolSize}&/&
&property name=&minPoolSize& value=&${c3p0.minPoolSize}&/&
&property name=&maxPoolSize& value=&${c3p0.maxPoolSize}&/&
&property name=&maxIdleTime& value=&${c3p0.maxIdleTime}&/&
&property name=&idleConnectionTestPeriod& value=&${c3p0.idleConnectionTestPeriod}&/&
&property name=&maxStatements& value=&${c3p0.maxStatements}&/&
&property name=&numHelperThreads& value=&${c3p0.numHelperThreads}&/&
&property name=&preferredTestQuery& value=&${c3p0.preferredTestQuery}&/&
&property name=&testConnectionOnCheckout& value=&${c3p0.testConnectionOnCheckout}&/&
&!-- 配置SqlSessionFactoryBean --&
&bean id=&oracleSqlSessionFactory& class=&org.mybatis.spring.SqlSessionFactoryBean&&
&property name=&dataSource& ref=&dataSourceOracle&/&
&property name=&configLocation& value=&classpath:mybatis.xml&/&
&!-- mapper和resultmap配置路径 --&
&property name=&mapperLocations&&
&!-- 表示在com.hoo目录下的任意包下的resultmap包目录中,以-resultmap.xml或-mapper.xml结尾所有文件 --&
&value&classpath:com/hoo/framework/mybatis/mybatis-common.xml&/value&
&value&classpath:com/hoo/**/resultmap/*-resultmap.xml&/value&
&value&classpath:com/hoo/**/mapper/*-mapper.xml&/value&
&value&classpath:com/hoo/**/mapper/**/*-mapper.xml&/value&
&/property&
&!-- 配置SqlSessionFactoryBean --&
&bean id=&mysqlSqlSessionFactory& class=&org.mybatis.spring.SqlSessionFactoryBean&&
&property name=&dataSource& ref=&dataSourceMySQL&/&
&property name=&configLocation& value=&classpath:mybatis.xml&/&
&!-- mapper和resultmap配置路径 --&
&property name=&mapperLocations&&
&!-- 表示在com.hoo目录下的任意包下的resultmap包目录中,以-resultmap.xml或-mapper.xml结尾所有文件 (oracle和mysql扫描的配置和路径不一样,如果是公共的都扫描 这里要区分下,不然就报错 找不到对应的表、视图)--&
&value&classpath:com/hoo/framework/mybatis/mybatis-common.xml&/value&
&value&classpath:com/hoo/**/resultmap/*-mysql-resultmap.xml&/value&
&value&classpath:com/hoo/**/mapper/*-mysql-mapper.xml&/value&
&value&classpath:com/hoo/**/mapper/**/*-mysql-mapper.xml&/value&
&value&classpath:com/hoo/**/mapper/**/multiple-datasource-mapper.xml&/value&
&/property&
&!-- 配置自定义的SqlSessionTemplate模板,注入相关配置 --&
&bean id=&sqlSessionTemplate& class=&com.hoo.framework.mybatis.support.CustomSqlSessionTemplate&&
&constructor-arg ref=&oracleSqlSessionFactory& /&
&property name=&targetSqlSessionFactorys&&
&entry value-ref=&oracleSqlSessionFactory& key=&oracle&/&
&entry value-ref=&mysqlSqlSessionFactory& key=&mysql&/&
&/property&
&!-- 通过扫描的模式,扫描目录在com/hoo/任意目录下的mapper目录下,所有的mapper都需要继承SqlMapper接口的接口 --&
&bean class=&org.mybatis.spring.mapper.MapperScannerConfigurer&&
&property name=&basePackage& value=&com.hoo.**.mapper&/&
&!-- 注意注入sqlSessionTemplate --&
&property name=&sqlSessionTemplateBeanName& value=&sqlSessionTemplate&/&
&property name=&markerInterface& value=&com.hoo.framework.mybatis.SqlMapper&/&
上面的配置关键是在MapperScannerConfigurer中注入sqlSessionTemplate,这个要注意。当我们配置了多个SqlSessionFactoryBean的时候,就需要为MapperScannerConfigurer指定一个sqlSessionFactoryBeanName或是sqlSessionTemplateBeanName。一般情况下注入了sqlSessionTemplateBeanName对象,那sqlSessionFactory也就有值了。如果单独的注入了sqlSessionFactory那么程序会创建一个sqlSessionTemplate对象。我们可以看看代码SqlSessionFactoryDaoSupport对象的代码。如果你不喜欢使用扫描的方式,也可以注入sqlSessionTemplate或继承sqlSessionTemplate完成数据库操作。
public abstract class SqlSessionDaoSupport extends DaoSupport {
private SqlSession sqlS
private boolean externalSqlS
public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
if (!this.externalSqlSession) {
this.sqlSession = new SqlSessionTemplate(sqlSessionFactory);
public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
this.sqlSession = sqlSessionT
this.externalSqlSession =
这段代码很明显,如果注入了sqlSessionTemplate上面的注入也就不会执行了,如果没有注入sqlSessionTemplate,那么会自动new一个sqlSessionTemplate对象。3、编写相关测试接口和实现的mapper.xml
package com.hoo.server.datasource.
import java.util.L
import java.util.M
import com.hoo.framework.mybatis.SqlM
*MyBatis 多数据源 测试查询接口
public interface MultipleDataSourceMapper extends SqlMapper {
public List&Map&String, Object&& execute4MySQL() throws E
public List&Map&String, Object&& execute4Oracle() throws E
multiple-datasource-mapper.xml
&?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.hoo.server.datasource.mapper.MultipleDataSourceMapper&&
&select id=&execute4Oracle& resultType=&map&&
deviceInfo_tab t where rownum & 10
&select id=&execute4MySQL& resultType=&map&&
city limit 2
上面分别查询oracle和mysql两个数据库中的table4、测试代码
@Autowired
@Qualifier(&multipleDataSourceMapper&)
private MultipleDataSourceM
public void testMapper() {
CustomerContextHolder.setContextType(CustomerContextHolder.SESSION_FACTORY_MYSQL);
trace(mapper.execute4MySQL());
} catch (Exception e1) {
e1.printStackTrace();
CustomerContextHolder.setContextType(CustomerContextHolder.SESSION_FACTORY_ORACLE);
trace(mapper.execute4Oracle());
} catch (Exception e) {
e.printStackTrace();
运行后发现能够顺利查询出数据。如果你是重写SqlSessionDaoSupport,那么方法如下
package com.hoo.framework.mybatis.
import java.util.M
import org.apache.ibatis.session.SqlS
import org.apache.ibatis.session.SqlSessionF
import org.mybatis.spring.SqlSessionU
import org.mybatis.spring.support.SqlSessionDaoS
import org.springframework.beans.BeansE
import org.springframework.context.ApplicationC
import org.springframework.context.ApplicationContextA
*MyBatis 动态SqlSessionFactory
public class DynamicSqlSessionDaoSupport extends SqlSessionDaoSupport implements ApplicationContextAware {
private ApplicationContext applicationC
private Map&Object, SqlSessionFactory& targetSqlSessionF
private SqlSessionFactory defaultTargetSqlSessionF
private SqlSession sqlS
public final SqlSession getSqlSession() {
SqlSessionFactory targetSqlSessionFactory = targetSqlSessionFactorys.get(CustomerContextHolder.getContextType());
if (targetSqlSessionFactory != null) {
setSqlSessionFactory(targetSqlSessionFactory);
} else if (defaultTargetSqlSessionFactory != null) {
setSqlSessionFactory(defaultTargetSqlSessionFactory);
targetSqlSessionFactory = defaultTargetSqlSessionF
targetSqlSessionFactory = (SqlSessionFactory) applicationContext.getBean(CustomerContextHolder.getContextType());
setSqlSessionFactory(targetSqlSessionFactory);
this.sqlSession = SqlSessionUtils.getSqlSession(targetSqlSessionFactory);
return this.sqlS
protected void checkDaoConfig() {
//Assert.notNull(getSqlSession(), &Property &#39;sqlSessionFactory&#39; or &#39;sqlSessionTemplate&#39; are required&);
public void setTargetSqlSessionFactorys(Map&Object, SqlSessionFactory& targetSqlSessionFactorys) {
this.targetSqlSessionFactorys = targetSqlSessionF
public void setDefaultTargetSqlSessionFactory(SqlSessionFactory defaultTargetSqlSessionFactory) {
this.defaultTargetSqlSessionFactory = defaultTargetSqlSessionF
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationC
主要重写getSqlSession方法,上面获取SqlSessionFactory的方法。重写好了后就可以配置这个对象,配置代码如下//每一个DAO由继承SqlSessionDaoSupport全部改为DynamicSqlSessionDaoSupport
public class UserMapperDaoImpl extends DynamicSqlSessionDaoSupport implements UserDao {
public int addUser(User user) {
return this.getSqlSession().insert(&com.hoo.user.dao.UserDao.addUser&, user);
在上面的配置文件中加入配置
&bean id=&baseDao& class=&com.hoo.framework.mybatis.support.DynamicSqlSessionDaoSupport& abstract=&true& lazy-init=&true&&
&property name=&targetSqlSessionFactorys&&
&entry value-ref=&oracleSqlSessionFactory& key=&oracle&/&
&entry value-ref=&mysqlSqlSessionFactory& key=&mysql&/&
&/property&
&property name=&defaultTargetSqlSessionFactory& ref=&oracleSqlSessionFactory&/&
&bean id=&userMapperDao& class=&com.hoo.user.dao.impl.UserMapperDaoImpl& parent=&baseDao&/&
就这样也可以利用DynamicSqlSessionDaoSupport来完成动态切换sqlSessionFactory对象,只需用在注入userMapperDao调用方法的时候设置下CustomerContextHolder的contextType即可。三.总结为了实现这个功能看了mybatis-spring-1.2.0.jar这个包的部分源代码,代码内容不是很多。所以看了下主要的代码,下面做些简单的介绍。MapperScannerConfigurer这个类就是我们要扫描的Mapper接口的类,也就是basePackage中继承markerInterface配置的接口。可以看看ClassPathBeanDefinitionScanner、ClassPathMapperScanner中的doScan这个方法。它会扫描basePackage这个包下所有接口,在ClassPathScanningCandidateComponentProvider中有这个方法findCandidateComponents,它会找到所有的BeanDefinition。最重要的一点是ClassPathMapperScanner中的doScan这个方法它会给这些接口创建一个MapperFactoryBean。并且会检查sqlSessionFactory和sqlSessionTemplate对象的注入情况。所以我们配置扫描的方式也就相当于我们在配置文件中给每一个Mapper配置一个MapperFactoryBean一样。而这个MapperFactoryBean又继承SqlSessionDaoSupport。所以当初我想重写MapperScannerConfigurer中的postProcessBeanDefinitionRegistry方法,然后重写方法中的ClassPathMapperScanner中的doScan方法,将definition.setBeanClass(MapperFactoryBean.class);改成自己定义的MapperFactoryBean。最后以失败告终,因为这里是Spring装载扫描对象的时候都已经为这些对象创建好了代理、设置好了mapperInterface和注入需要的类。所以在调用相关操作数据库的API方法的时候,设置对应的SqlSessionFactory也是无效的。辗转反侧我看到了SqlSessionTemplate这个类,它的功能相当于SqlSessionDaoSupport的实现类MapperFactoryBean。最为关键的是SqlSessionTemplate有一个拦截器SqlSessionInterceptor,它复制所有SqlSession的创建、提交、关闭,而且是在每个方法之前。这点在上面也提到过了!所以我们只需要在SqlSessionInterceptor方法中获取SqlSessionFactory的时候,在这之前调用下CustomerContextHolder.setContextType方法即可完成数据库的SqlSessionFactory的切换。而在MapperScannerConfigurer提供了注入SqlSessionFactory和sqlSessionTemplate的方法,如果注入了SqlSessionFactory系统将会new一个sqlSessionTemplate,而注入了sqlSessionTemplate就不会创建其他对象(见下面代码)。所以我们配置一个sqlSessionTemplate并注入到MapperScannerConfigurer中,程序将会使用这个sqlSessionTemplate。本文最后的实现方式就是这样完成的。
public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
if (!this.externalSqlSession) {
this.sqlSession = new SqlSessionTemplate(sqlSessionFactory);
public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
this.sqlSession = sqlSessionT
this.externalSqlSession =
原文地址:欢迎拜访!由编辑于 18:10:580个牛币请下载代码后再发表评论精精精精最热搜索分享话题编程语言基础Web开发数据库开发客户端开发脚本工具游戏开发服务器软硬件开源组件类库相关分享原原原原精原原精原精原最近下载最近浏览暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级扫描二维码关注最代码为好友"/>扫描二维码关注最代码为好友

我要回帖

更多关于 mybatis 关联映射 的文章

 

随机推荐