一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務器之家 - 編程語言 - JAVA教程 - spring-mybatis與原生mybatis使用對比分析

spring-mybatis與原生mybatis使用對比分析

2021-02-07 16:48tuicool JAVA教程

這篇文章主要介紹了spring-mybatis與原生mybatis使用對比分析,需要的朋友可以參考下

原生mybatis使用方法:

?
1
2
3
4
5
6
7
8
9
10
11
12
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession(); 
try {  
      Employee employee = new Employee(null, "doubi", "1", "[email protected]");
      EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);  
      mapper.addEmp(employee);       
      session.commit(); 
} finally {
   session.close(); 
}

spring使用方法,直接注入即可

?
1
2
@Autowired
EmployeeMapper employeeMapper

那么spring為我們做了什么?下面研究一下mybatis-spring.jar這個jar包

首先來看一下如何使用spring整合mybatis,下面是使用spring-mybatis的四種方法:

方法一:(使用MapperFactoryBean)

?
1
2
3
4
5
6
7
8
9
10
11
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="dataSource" ref="dataSource"/>   
  <property name="configLocation" value="classpath:mybatis-config.xml"></property>   
  <!-- 自動掃描mapping.xml文件 -->   
  <property name="mapperLocations" value="classpath:mapper/*.xml"></property> 
</bean>
<!--上面生成sqlSessionFactory的幾個方法基本相同-->
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
 <property name="mapperInterface" value="org.mybatis.spring.sample.mapper.UserMapper" />
 <property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>

這樣做的缺點是每一個mapper接口都要在xml里配置一下

方法二:采用接口org.apache.ibatis.session.SqlSession的實現類 org.mybatis.spring.SqlSessionTemplate

mybatis中, sessionFactory可由SqlSessionFactoryBuilder.來創建。MyBatis-Spring 中,使用了SqlSessionFactoryBean來替代。SqlSessionFactoryBean有一個必須屬性dataSource,另外其還有一個通用屬性configLocation(用來指定mybatis的xml配置文件路徑)。

SqlSessionFactoryBean即相當于原生mybatis中的SqlSessionFactoryBuilder

?
1
2
3
4
5
6
7
8
9
10
11
12
13
<!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 --> 
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"
  <property name="dataSource" ref="dataSource" />   
  <property name="configLocation" value="classpath:sqlMapConfig.xml"/>   
  <!-- 自動掃描mapping.xml文件,**表示迭代查找,也可在sqlMapConfig.xml中單獨指定xml文件-->   
  <property name="mapperLocations" value="classpath:com/hua/saf/**/*.xml" /> 
</bean>   
<!-- mybatis spring sqlSessionTemplate,使用時直接讓spring注入即可 --> 
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">   
  <constructor-arg index="0" ref="sqlSessionFactory"></constructor-arg> 
</bean>
//使用方法:
@Repositorypublic class UserDao{  @Resource  private SqlSessionTemplate sqlSessionTemplate;    public User getUser(int id) {    return sqlSessionTemplate.selectOne(this.getClass().getName() + ".getUser", 1);  }  }

為什么可以這樣寫,來看一下SqlSessionTemplate

?
1
2
3
4
public class SqlSessionTemplate implements SqlSession { private final SqlSessionFactory sqlSessionFactory; private final ExecutorType executorType; private final SqlSession sqlSessionProxy; private final PersistenceExceptionTranslator exceptionTranslator; /**  * Constructs a Spring managed SqlSession with the {@code SqlSessionFactory}  * provided as an argument.  *  * @param sqlSessionFactory  */ public SqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {  this(sqlSessionFactory, sqlSessionFactory.getConfiguration().getDefaultExecutorType()); }
........省略......
  public SqlSessionTemplate(SqlSessionFactory sqlSessionFactory, ExecutorType executorType,   PersistenceExceptionTranslator exceptionTranslator) {  notNull(sqlSessionFactory, "Property 'sqlSessionFactory' is required");  notNull(executorType, "Property 'executorType' is required");  this.sqlSessionFactory = sqlSessionFactory;  this.executorType = executorType;  this.exceptionTranslator = exceptionTranslator;  this.sqlSessionProxy = (SqlSession) newProxyInstance(    SqlSessionFactory.class.getClassLoader(),    new Class[] { SqlSession.class },    new SqlSessionInterceptor()); }
}

如上面代碼所示,SqlSessionTemplate類實現了原生Mybatis中的SqlSession接口,實際上它就是原生mybatis中的SqlSession

方法三:采用抽象類 org.mybatis.spring.support.SqlSessionDaoSupport 提供SqlSession

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->
  <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="configLocation" value="classpath:sqlMapConfig.xml"/>
    <!-- 自動掃描mapping.xml文件,**表示迭代查找,也可在sqlMapConfig.xml中單獨指定xml文件-->
    <property name="mapperLocations" value="classpath:com/hua/saf/**/*.xml" />
  </bean>
public class BaseDao extends SqlSessionDaoSupport{ //使用sqlSessionFactory @Autowired  private SqlSessionFactory sqlSessionFactory; 
@Autowired  public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory)
{
super.setSqlSessionFactory(sqlSessionFactory); 
/**  * 執行insert操作  * @param statement  * @return  */ public int insert(String statement) {
return getSqlSession().insert(statement); } /**  * 執行insert操作  * @param statement  * @param parameter  * @return  */ public int insert(String statement, Object parameter) { 
return getSqlSession().insert(statement, parameter); }
public int update(String statement)
return getSqlSession().update(statement);
}
public int update(String statement, Object parameter) {  return getSqlSession().update(statement, parameter); }
public int delete(String statement)
return getSqlSession().delete(statement);
}
public int delete(String statement, Object parameter) {
return getSqlSession().delete(statement, parameter); }  /**  * 獲取一個list集合  * @param statement  * @return  */ public List<?> selectList(String statement) {  return getSqlSession().selectList(statement); }  /**  * 根據參數 獲取一個list集合  * @param statement  * @param parameter  * @return  */ public List<?> selectList(String statement, Object parameter) {  return getSqlSession().selectList(statement, parameter); }  public Map<?, ?> selectMap(String statement, String mapKey) {  return getSqlSession().selectMap(statement, mapKey); } public Map<?, ?> selectMap(String statement, Object parameter, String mapKey) {  return getSqlSession().selectMap(statement, parameter, mapKey); }  /**  * 獲取Object對象  * @param statement  * @return  */ public Object selectOne(String statement) {  return getSqlSession().selectOne(statement); }  /**  * 獲取connection, 以便執行較為復雜的用法  * @return  */ public Connection getConnection() {  return getSqlSession().getConnection(); } }

如上代碼,一個Dao類繼承了SqlSessionDaoSupport類后,就可以在類中注入SessionFact
ory,進而通過getSqlSession()獲取當前SqlSession

下面是 SqlSessionDaoSupport的源碼 ,它是一個抽象類,并擁有sqlSession屬性,在setSqlSessionFactory方法中實例化了該sqlSession:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public abstract class SqlSessionDaoSupport extends DaoSupport
{
private SqlSession sqlSession; private boolean externalSqlSession;
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()
{
notNull(this.sqlSession, "Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required"); }}

方法四:(也是 最常見的使用方法 ,使用MapperScannerConfigurer,它將會查找類路徑下的映射器并自動將它們創建成MapperFactoryBean)

由于直接使用MapperFactoryBean會在配置文件中配置大量mapper,因此這里使用包掃描的方式通過注解獲取該bean

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->
  <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <!-- 自動掃描mapping.xml文件,**表示迭代查找 -->
    <property name="mapperLocations" value="classpath:com/hua/saf/**/*.xml" />
  </bean>
  <!-- DAO接口所在包名,Spring會自動查找其下的類 ,包下的類需要使用@MapperScan注解,否則容器注入會失敗 -->
  <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.hua.saf.*" />
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
  </bean>
//使用如下代碼,即可完成注入
@Resource
private UserDao userDao;

下面看一下MapperScannerConfigurer這個類:

?
1
2
3
4
public class MapperScannerConfigurer implements BeanDefinitionRegistryPostProcessor, InitializingBean, ApplicationContextAware, BeanNameAware { private String basePackage; private boolean addToConfig = true; private SqlSessionFactory sqlSessionFactory; private SqlSessionTemplate sqlSessionTemplate; private String sqlSessionFactoryBeanName; private String sqlSessionTemplateBeanName; private Class<? extends Annotation> annotationClass; private Class<?> markerInterface; private ApplicationContext applicationContext; private String beanName; private boolean processPropertyPlaceHolders; private BeanNameGenerator nameGenerator;
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {  if (this.processPropertyPlaceHolders) {   processPropertyPlaceHolders();  }  ClassPathMapperScanner scanner = new ClassPathMapperScanner(registry);  scanner.setAddToConfig(this.addToConfig);  scanner.setAnnotationClass(this.annotationClass);  scanner.setMarkerInterface(this.markerInterface);  scanner.setSqlSessionFactory(this.sqlSessionFactory);  scanner.setSqlSessionTemplate(this.sqlSessionTemplate);  scanner.setSqlSessionFactoryBeanName(this.sqlSessionFactoryBeanName);  scanner.setSqlSessionTemplateBeanName(this.sqlSessionTemplateBeanName);  scanner.setResourceLoader(this.applicationContext);  scanner.setBeanNameGenerator(this.nameGenerator);  scanner.registerFilters();  scanner.scan(StringUtils.tokenizeToStringArray(this.basePackage, ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS)); }
ClassPathMapperScanner :
public Set<BeanDefinitionHolder> doScan(String... basePackages) {  Set<BeanDefinitionHolder> beanDefinitions = super.doScan(basePackages);  if (beanDefinitions.isEmpty()) {   logger.warn("No MyBatis mapper was found in '" + Arrays.toString(basePackages) + "' package. Please check your configuration.");  } else {   for (BeanDefinitionHolder holder : beanDefinitions) {    GenericBeanDefinition definition = (GenericBeanDefinition) holder.getBeanDefinition();    if (logger.isDebugEnabled()) {     logger.debug("Creating MapperFactoryBean with name '" + holder.getBeanName()        + "' and '" + definition.getBeanClassName() + "' mapperInterface");    }    // the mapper interface is the original class of the bean    // but, the actual class of the bean is MapperFactoryBean    definition.getPropertyValues().add("mapperInterface", definition.getBeanClassName());    definition.setBeanClass(MapperFactoryBean.class);    definition.getPropertyValues().add("addToConfig", this.addToConfig);    boolean explicitFactoryUsed = false;    if (StringUtils.hasText(this.sqlSessionFactoryBeanName)) {     definition.getPropertyValues().add("sqlSessionFactory", new RuntimeBeanReference(this.sqlSessionFactoryBeanName));     explicitFactoryUsed = true;    } else if (this.sqlSessionFactory != null) {     definition.getPropertyValues().add("sqlSessionFactory", this.sqlSessionFactory);     explicitFactoryUsed = true;    }    if (StringUtils.hasText(this.sqlSessionTemplateBeanName)) {     if (explicitFactoryUsed) {      logger.warn("Cannot use both: sqlSessionTemplate and sqlSessionFactory together. sqlSessionFactory is ignored.");     }     definition.getPropertyValues().add("sqlSessionTemplate", new RuntimeBeanReference(this.sqlSessionTemplateBeanName));     explicitFactoryUsed = true;    } else if (this.sqlSessionTemplate != null) {     if (explicitFactoryUsed) {      logger.warn("Cannot use both: sqlSessionTemplate and sqlSessionFactory together. sqlSessionFactory is ignored.");     }     definition.getPropertyValues().add("sqlSessionTemplate", this.sqlSessionTemplate);     explicitFactoryUsed = true;    }    if (!explicitFactoryUsed) {     if (logger.isDebugEnabled()) {      logger.debug("Enabling autowire by type for MapperFactoryBean with name '" + holder.getBeanName() + "'.");     }     definition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE);    }   }  }  return beanDefinitions; }

總結:spring-mybatis與原生Mybatis相比,如下概念:

1)SqlSessionFactory類在兩者中都存在

2)前者用SqlSessionFactoryBean生成SqlSessionFactory,后者則使用SqlSessionFactoryBuilder;

3)前者使用SqlSessionTemplate,后者使用SqlSession,實際上前者實現了后者

4)MapperFactoryBean中實現了原生mybatis中下面的步驟,因此通過該類可以直接獲取到一個mapper接口的實現對象

?
1
EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);

總結

以上所述是小編給大家介紹的spring-mybatis與原生mybatis使用對比分析,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!

原文鏈接:https://www.tuicool.com/articles/AN7NfiE

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美一级专区免费大片俄罗斯 | 驯服有夫之妇HD中字日本 | 亚洲午夜大片 | 欧洲第一区第二区第三区 | 国产在线视频资源 | 桃色视频软件 | 久久99re8热在线播放 | 国产成人精品视频频 | www视频免费看 | 亚洲精品综合一区二区 | 免费观看无人区完整版 | 秘书小说 | 精品欧美一区二区精品久久 | 精品欧美一区二区三区在线观看 | 日本高清在线看免费观看 | 青青青青青国产免费手机看视频 | 国产精品成人 | www.毛片在线观看 | 2019自拍偷拍视频 | 欧美性色老妇人 | 猥琐对着美女飞机喷到脸上 | 狠狠色成人综合网图片区 | 美女被吸乳老师羞羞漫画 | 无人区乱码区1卡2卡三卡在线 | 国产精品久久久久久久久免费观看 | 韩国三级做爰 | 日本高清免费不卡在线播放 | 精品成人在线 | 国产精品久久国产三级国电话系列 | 日本加勒比一区 | 大胆国模一区二区三区伊人 | h日本漫画全彩在线观看 | 不良网站在线观看 | 成人免费观看一区二区 | 91制片厂免费观看 | 好男人资源免费播放在线观看 | 国产第7页 | 亚洲欧美专区精品久久 | 青草青青在线视频 | 国产一区二区视频免费 | 奇米影视久久 |