spring整合mybatis中数据源的几种配置方式(总结篇)

因为spring 整合mybatis的过程中, 有好几种整合方式,尤其是数据源那块,经常看到不一样的配置方式,总感觉有点乱,所以今天有空总结下。

创新互联是一家集网站建设,沂水企业网站建设,沂水品牌网站建设,网站定制,沂水网站建设报价,网络营销,网络优化,沂水网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。

一、采用org.mybatis.spring.mapper.MapperScannerConfigurer

其实逆向工程也是这种方式

1、数据源配配置文件

2、DAO文件

 package com.jdd.mapper;
 import com.jdd.pojo.Employee;
 import java.util.List;
 public interface EmployeeMapper {
   public Employee getEmployeeById(int id);
   public List findAllEmployees();
 }

3、Mapper.xml 文件

   <?xml version="." encoding="UTF-" ?>
 
 
   
   
 

   这样在service类里就可以直接注入dao接口了

 package com.jdd.service.impl;
 import com.jdd.mapper.EmployeeMapper;
 import com.jdd.pojo.Employee;
 import com.jdd.service.EmployeeService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import java.util.List;
 @Service("employeeService")
 public class EmployeeServiceImpl implements EmployeeService{
   @Autowired
   private EmployeeMapper employeeMapper;
   @Override
   public Employee getEmployeeById(int id) {
     return employeeMapper.getEmployeeById(id);
   }
   @Override
   public List findAllEmployees() {
     return employeeMapper.findAllEmployees();
   }
 }

  二、 采用抽象类org.mybatis.spring.support.SqlSessionDaoSupport, 给它注入 sqlSessionFactory的方式

1、数据源配置文件

   <?xml version="." encoding="UTF-"?>
 
   
   
   
   
     
     
     
     
     
     
   
   
   
     
     
     
   
 

   2、baseDao类

 package com.jdd.dao;
 import org.apache.ibatis.session.SqlSessionFactory;
 import org.mybatis.spring.support.SqlSessionDaoSupport;
 import javax.annotation.Resource;
 public abstract class BaseDao extends SqlSessionDaoSupport {
   @Resource
   public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
     super.setSqlSessionFactory(sqlSessionFactory);
   }
 }

   3、接口 EmployeeDao.java 类

 package com.jdd.dao;
 import com.jdd.pojo.Employee;
 import java.util.List;
 public interface EmployeeDao {
   Employee getEmployeeById(int id);
   List findAllEmployees();
 }

4、dao实现类 EmployeeDaoImpl

 package com.jdd.dao.impl;
 import com.jdd.dao.BaseDao;
 import com.jdd.dao.EmployeeDao;
 import com.jdd.pojo.Employee;
 import org.springframework.stereotype.Repository;
 import java.util.List;
 @Repository("employeeDao")
 public class EmployeeDaoImpl extends BaseDao implements EmployeeDao {
   @Override
   public Employee getEmployeeById(int id) {
     return this.getSqlSession().selectOne("com.jdd.dao.EmployeeDao.getEmployeeById", id);
   }
   @Override
   public List findAllEmployees() {
     return this.getSqlSession().selectList("com.jdd.dao.EmployeeDao.findAllEmployees");
   }
 }

5、这样就可以在service类里注入 employeeDao了

三、采用 org.mybatis.spring.SqlSessionTemplate 模板类

1、数据源文件

 <?xml version="." encoding="UTF-"?>
 
   
   
   
     
     
     
     
     
     
     
   
   
   
     
     
     
   
   
     
   
 

2、 basedao.java 类

 package com.jdd.dao;
 import org.mybatis.spring.SqlSessionTemplate;
 import javax.annotation.Resource;
 public abstract class BaseDao {
   public SqlSessionTemplate sqlSessionTemplate;
   @Resource
   public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
     this.sqlSessionTemplate = sqlSessionTemplate;
   }
 }

3、接口 EmployeeDao.java 类

package com.jdd.dao;
 import com.jdd.pojo.Employee;
 import java.util.List;
 public interface EmployeeDao {
   Employee getEmployeeById(int id);
   List findAllEmployees();
 }

4、dao实现类 EmployeeDaoImpl

 package com.jdd.dao.impl;
 import com.jdd.dao.BaseDao;
 import com.jdd.dao.EmployeeDao;
 import com.jdd.pojo.Employee;
 import org.springframework.stereotype.Repository;
 import java.util.List;
 @Repository("employeeDao")
 public class EmployeeDaoImpl extends BaseDao implements EmployeeDao {
   @Override
   public Employee getEmployeeById(int id) {
     return sqlSessionTemplate.selectOne("com.jdd.dao.EmployeeDao.getEmployeeById", id);
   }
   @Override
   public List findAllEmployees() {
     return sqlSessionTemplate.selectList("com.jdd.dao.EmployeeDao.findAllEmployees");
   }
 }

5、同样现在也可以在service类里直接注入 employeeDao使用了。

注:这里basedao的注入比较灵活,也可以注入 SqlSessionFactory, 然后再setter方法里创建 SqlSessionTemplate,如下:

 package com.jdd.dao;
 import org.apache.ibatis.session.SqlSessionFactory;
 import org.mybatis.spring.SqlSessionTemplate;
 import javax.annotation.Resource;
 public abstract class BaseDao {
   public SqlSessionTemplate sqlSessionTemplate;
   @Resource
   public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
     sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactory);
   }
 }

其实不管是采用 继承SqlSessionDaoSupport类, 注入 sqlSessionFactory的方式, 还是直接注入 SqlSessionTemplate 的方式, 本质上是一样的。

如果你采用 注入 sqlSessionFactory的方式, 它在底层也是通过sqlSessionFactory 来创建 SqlSessionTemplate ,然后通过其api来操作。

不信给你们看下 SqlSessionDaoSupport 的源码:

 //
 // Source code recreated from a .class file by IntelliJ IDEA
 // (powered by Fernflower decompiler)
 //
 package org.mybatis.spring.support;
 import org.apache.ibatis.session.SqlSession;
 import org.apache.ibatis.session.SqlSessionFactory;
 import org.mybatis.spring.SqlSessionTemplate;
 import org.springframework.dao.support.DaoSupport;
 import org.springframework.util.Assert;
 public abstract class SqlSessionDaoSupport extends DaoSupport {
   private SqlSession sqlSession;
   private boolean externalSqlSession;
   public SqlSessionDaoSupport() {
   }
   public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
     if (!this.externalSqlSession) {
       this.sqlSession = new SqlSessionTemplate(sqlSessionFactory);
     }
   }
   public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
     this.sqlSession = sqlSessionTemplate;
     this.externalSqlSession = true;
   }
   public SqlSession getSqlSession() {
     return this.sqlSession;
   }
   protected void checkDaoConfig() {
     Assert.notNull(this.sqlSession, "Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required");
   }
 }

   同样 SqlSessionTemplate 继承了 SqlSession 接口, 因此不管操作哪个效果都一样

 //
  // Source code recreated from a .class file by IntelliJ IDEA
  // (powered by Fernflower decompiler)
  //
  package org.mybatis.spring;
  import java.lang.reflect.InvocationHandler;
  import java.lang.reflect.Method;
 import java.lang.reflect.Proxy;
 import java.sql.Connection;
 import java.util.List;
 import java.util.Map;
 import org.apache.ibatis.exceptions.PersistenceException;
 import org.apache.ibatis.executor.BatchResult;
 import org.apache.ibatis.reflection.ExceptionUtil;
 import org.apache.ibatis.session.Configuration;
 import org.apache.ibatis.session.ExecutorType;
 import org.apache.ibatis.session.ResultHandler;
 import org.apache.ibatis.session.RowBounds;
 import org.apache.ibatis.session.SqlSession;
 import org.apache.ibatis.session.SqlSessionFactory;
 import org.springframework.dao.support.PersistenceExceptionTranslator;
 import org.springframework.util.Assert;
 public class SqlSessionTemplate implements SqlSession {
   private final SqlSessionFactory sqlSessionFactory;
   private final ExecutorType executorType;
   private final SqlSession sqlSessionProxy;
   private final PersistenceExceptionTranslator exceptionTranslator;
   public SqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
     this(sqlSessionFactory, sqlSessionFactory.getConfiguration().getDefaultExecutorType());
   }
   public SqlSessionTemplate(SqlSessionFactory sqlSessionFactory, ExecutorType executorType) {
     this(sqlSessionFactory, executorType, new MyBatisExceptionTranslator(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), true));
   }
   public SqlSessionTemplate(SqlSessionFactory sqlSessionFactory, ExecutorType executorType, PersistenceExceptionTranslator exceptionTranslator) {
     Assert.notNull(sqlSessionFactory, "Property 'sqlSessionFactory' is required");
     Assert.notNull(executorType, "Property 'executorType' is required");
     this.sqlSessionFactory = sqlSessionFactory;
     this.executorType = executorType;
     this.exceptionTranslator = exceptionTranslator;
     this.sqlSessionProxy = (SqlSession)Proxy.newProxyInstance(SqlSessionFactory.class.getClassLoader(), new Class[]{SqlSession.class}, new SqlSessionTemplate.SqlSessionInterceptor());
   }
   public SqlSessionFactory getSqlSessionFactory() {
     return this.sqlSessionFactory;
   }
   public ExecutorType getExecutorType() {
     return this.executorType;
   }
   public PersistenceExceptionTranslator getPersistenceExceptionTranslator() {
     return this.exceptionTranslator;
   }
   public  T selectOne(String statement) {
     return this.sqlSessionProxy.selectOne(statement);
   }
   public  T selectOne(String statement, Object parameter) {
     return this.sqlSessionProxy.selectOne(statement, parameter);
   }
   public  Map selectMap(String statement, String mapKey) {
     return this.sqlSessionProxy.selectMap(statement, mapKey);
   }
   public  Map selectMap(String statement, Object parameter, String mapKey) {
     return this.sqlSessionProxy.selectMap(statement, parameter, mapKey);
   }
   public  Map selectMap(String statement, Object parameter, String mapKey, RowBounds rowBounds) {
     return this.sqlSessionProxy.selectMap(statement, parameter, mapKey, rowBounds);
   }
   public  List selectList(String statement) {
     return this.sqlSessionProxy.selectList(statement);
   }
   public  List selectList(String statement, Object parameter) {
     return this.sqlSessionProxy.selectList(statement, parameter);
   }
   public  List selectList(String statement, Object parameter, RowBounds rowBounds) {
     return this.sqlSessionProxy.selectList(statement, parameter, rowBounds);
   }
   public void select(String statement, ResultHandler handler) {
     this.sqlSessionProxy.select(statement, handler);
   }
   public void select(String statement, Object parameter, ResultHandler handler) {
     this.sqlSessionProxy.select(statement, parameter, handler);
   }
   public void select(String statement, Object parameter, RowBounds rowBounds, ResultHandler handler) {
     this.sqlSessionProxy.select(statement, parameter, rowBounds, handler);
   }
   public int insert(String statement) {
     return this.sqlSessionProxy.insert(statement);
   }
   public int insert(String statement, Object parameter) {
     return this.sqlSessionProxy.insert(statement, parameter);
   }
   public int update(String statement) {
     return this.sqlSessionProxy.update(statement);
   }
   public int update(String statement, Object parameter) {
     return this.sqlSessionProxy.update(statement, parameter);
   }
   public int delete(String statement) {
     return this.sqlSessionProxy.delete(statement);
   }
   public int delete(String statement, Object parameter) {
     return this.sqlSessionProxy.delete(statement, parameter);
   }
   public  T getMapper(Class type) {
     return this.getConfiguration().getMapper(type, this);
   }
   public void commit() {
     throw new UnsupportedOperationException("Manual commit is not allowed over a Spring managed SqlSession");
   }
   public void commit(boolean force) {
     throw new UnsupportedOperationException("Manual commit is not allowed over a Spring managed SqlSession");
   }
   public void rollback() {
     throw new UnsupportedOperationException("Manual rollback is not allowed over a Spring managed SqlSession");
   }
   public void rollback(boolean force) {
     throw new UnsupportedOperationException("Manual rollback is not allowed over a Spring managed SqlSession");
   }
   public void close() {
     throw new UnsupportedOperationException("Manual close is not allowed over a Spring managed SqlSession");
   }
   public void clearCache() {
     this.sqlSessionProxy.clearCache();
   }
   public Configuration getConfiguration() {
     return this.sqlSessionFactory.getConfiguration();
   }
   public Connection getConnection() {
     return this.sqlSessionProxy.getConnection();
   }
   public List flushStatements() {
     return this.sqlSessionProxy.flushStatements();
   }
   private class SqlSessionInterceptor implements InvocationHandler {
     private SqlSessionInterceptor() {
     }
     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
       SqlSession sqlSession = SqlSessionUtils.getSqlSession(SqlSessionTemplate.this.sqlSessionFactory, SqlSessionTemplate.this.executorType, SqlSessionTemplate.this.exceptionTranslator);
       Object unwrapped;
       try {
         Object result = method.invoke(sqlSession, args);
         if (!SqlSessionUtils.isSqlSessionTransactional(sqlSession, SqlSessionTemplate.this.sqlSessionFactory)) {
           sqlSession.commit(true);
         }
         unwrapped = result;
       } catch (Throwable var) {
         unwrapped = ExceptionUtil.unwrapThrowable(var);
         if (SqlSessionTemplate.this.exceptionTranslator != null && unwrapped instanceof PersistenceException) {
           SqlSessionUtils.closeSqlSession(sqlSession, SqlSessionTemplate.this.sqlSessionFactory);
           sqlSession = null;
           Throwable translated = SqlSessionTemplate.this.exceptionTranslator.translateExceptionIfPossible((PersistenceException)unwrapped);
           if (translated != null) {
             unwrapped = translated;
           }
         }
         throw (Throwable)unwrapped;
       } finally {
         if (sqlSession != null) {
           SqlSessionUtils.closeSqlSession(sqlSession, SqlSessionTemplate.this.sqlSessionFactory);
         }
       }
       return unwrapped;
     }
   }
 }

总结

以上所述是小编给大家介绍的spring 整合 mybatis 中数据源的几种配置方式,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!


网页名称:spring整合mybatis中数据源的几种配置方式(总结篇)
文章位置:http://myzitong.com/article/ieddjc.html