SqlSessionTemplate MapperScannerConfigurer「建议收藏」

SqlSessionTemplate MapperScannerConfigurer「建议收藏」mybatis SqlSessionFactoryBean SqlSessionTemplateMapperScannerConfigurer1.MyBatis简介   MyBatis是什么?MyBatis是一款一流的支持自定义SQL、存储过程和高级映射的持久化框架。MyBatis几乎消除了所有的JDBC代码,也基本不需要手工去设置参数和获取检索结果。MyBatis能够使用简单的XM

大家好,又见面了,我是你们的朋友全栈君。

          mybatis   SqlSessionFactoryBean  SqlSessionTemplate MapperScannerConfigurer


1. MyBatis简介
     MyBatis是什么? MyBatis是一款一流的支持自定义SQL、存储过程和高级映射的持久化框架。MyBatis几乎消除了所有的JDBC代码,也基本不需要手工去设置参数和获取检索结果。MyBatis能够使用简单的XML格式或者注解进行来配置,能够映射基本数据元素、Map接口和POJOs(普通java对象)到数据库中的记录。
  • SqlSessionFactoryBuilder:build方法创建SqlSessionFactory实例。

  • SqlSessionFactory:创建SqlSession实例的工厂。

  • SqlSession:用于执行持久化操作的对象,类似于jdbc中的Connection。

     所有的MyBatis应用都以SqlSessionFactory实例为中心。SqlSessionFactory实例通过SqlSessionFactoryBuilder来获得,SqlSessionFactoryBuilder能够从XML配置文件或者通过自定义编写的配置类(Configurationclass),来创建一个SqlSessionFactory实例。然后通过SqlSessionFactory实例来创建一个SqlSession实例。SqlSession包含了所有执行数据库SQL语句的方法。您能够直接地通过SqlSession实例执行映射SQL语句
  SqlSessionFactoryBuilder这个类可以在任何时候被实例化、使用和销毁。一旦您创造了SqlSessionFactory就不需要再保留它了。所以SqlSessionFactoryBuilder实例的最好的作用域是方法体内(即一个本地方法变量)
  SqlSessionFactory一旦创建,SqlSessionFactory将会存在于您的应用程序整个运行生命周期中。很少或根本没有理由去销毁它或重新创建它。最佳实践是不要在一个应用中多次创建SqlSessionFactory。这样做会被视为“没品味”。所是SqlSessionFactory最好的作用域范围是一个应用的生命周期范围。这可以由多种方式来实现,最简单的方式是使用Singleton模式或静态Singleton模式。但这不是被广泛接受的最佳做法,相反,您可能更愿意使用像GoogleGuice或Spring的依赖注入方式。这些框架允许您创造一个管理器,用于管理SqlSessionFactory的生命周期
  每个线程都有自己的SqlSession实例,SqlSession实例是不能被共享,也是不是线程安全的。因此最好使用Request作用域或者方法体作用域。不要使用类的静态变量来引用一个SqlSession实例,甚至不要使用类的一个实例变更来引用。永远不要在一个被管理域中引用SqlSession,比如说在Servlet中的HttpSession中。如果你正在使用WEB框架,应该让SqlSession跟随HTTP请求的相似作用域。也就是说,在收到一个HTTP请求过后,打开SqlSession,等返回一个回应以后,立马关掉这个SqlSession。关闭SqlSession是非常重要的。你必须要确保SqlSession在finally方法体中正常关闭
   Mapper是一种创建用于绑定映射语句的接口。Mapper接口的实例是用SqlSession来获得的,所以Mapper 实例作用域像SqlSession 一样,使用请求作用域。在方法被调用的时候调用Mapper实例,然后使用后,就会自动销毁掉,而不需要使用明确的注销
2.MyBatis-Spring
  1.    <bean id=“dataSource” class=“org.apache.commons.dbcp.BasicDataSource” destroy-method=“close”>    
  2.                <property name=“driverClassName” value=“oracle.jdbc.driver.OracleDriver” />      
  3.               <property name=“url” value=“jdbc:oracle:****:*****:1521:****” />      
  4.               <property name=“username” value=“****” />      
  5.               <property name=“password” value=“****” />      
  6.     </bean>    
  7.   
  8. <bean id=“sqlSessionFactory” class=“org.mybatis.spring.SqlSessionFactoryBean”>  
  9.       <property name=“configLocation”>  
  10.           <value>classpath:mybatis/mapper.xml</value>  
  11.       </property>  
  12.       <property name=“dataSource” ref=“dataSource” />  
  13.   </bean>  
  14.   <bean id=“sqlSession” class=“org.mybatis.spring.SqlSessionTemplate”>  
  15.       <constructor-arg index=“0” ref=“sqlSessionFactory” />  
  16.   </bean>  
  17.   
  18.   <!– 注解Mapper scanner –>  
  19.   <bean class=“org.mybatis.spring.mapper.MapperScannerConfigurer”>  
  20.       <property name=“basePackage” value=“com.**.ext” />  
  21.       <property name=“sqlSessionTemplateBeanName” value=“sqlSession” />  
  22.   </bean>  
     <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  
                 <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />    
                <property name="url" value="jdbc:oracle:****:*****:1521:****" />    
                <property name="username" value="****" />    
                <property name="password" value="****" />    
      </bean>  

  <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="configLocation">
            <value>classpath:mybatis/mapper.xml</value>
        </property>
        <property name="dataSource" ref="dataSource" />
    </bean>
    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg index="0" ref="sqlSessionFactory" />
    </bean>

    <!-- 注解Mapper scanner -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.**.ext" />
        <property name="sqlSessionTemplateBeanName" value="sqlSession" />
    </bean>


   1)SqlSessionFactoryBean 

    在基本的 MyBatis 中,session 工厂可以使用 SqlSessionFactoryBuilder 来创建。而在 MyBatis-Spring 中,则使用 SqlSessionFactoryBean 来替代

   为了得到factory bean,如上面所示,需在Spring
applicationContext.xml 配置文件中配置:
    

  1. <bean id=“sqlSessionFactory” class=“org.mybatis.spring.SqlSessionFactoryBean”>  
  2.       <property name=“configLocation”>  
  3.           <value>classpath:mybatis/mapper.xml</value>  
  4.       </property>  
  5.       <property name=“dataSource” ref=“dataSource” />  
  6.   </bean>  
  <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="configLocation">
            <value>classpath:mybatis/mapper.xml</value>
        </property>
        <property name="dataSource" ref="dataSource" />
    </bean>

   SqlSessionFactoryBean 实现了 Spring 的 FactoryBean 接口,就说明了由 Spring 最终创建的 bean 不是 SqlSessionFactoryBean 本身, 。 而是工厂类的 getObject()返回的方法的结果。这种情况下,Spring 将会在应用启动时为你 创建 SqlSessionFactory 对象,然后将它以 SqlSessionFactory 为名来存储,这相当于下面的代码:

  1. SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();  
  2. SqlSessionFactory sessionFactory = factoryBean.getObject();  
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
SqlSessionFactory sessionFactory = factoryBean.getObject();

     1. SqlSessionFactoryBean 属性

        1)SqlSessionFactory 有一个单独的必须属性,就是 JDBC 的 DataSource。这可以是任意 的 DataSource,其配置应该和其它 Spring 数据库连接是一样的。
       2) 一个通用的属性是 configLocation,它是用来指定 MyBatis 的 XML 配置文件路径的。 如果基本的 MyBatis 配置需要改变, 那么这就是一个需要它的地方。 通常这会是
<settings>  或
<typeAliases> 的部分。

要注意这个配置文件不需要是一个完整的 MyBatis 配置。确切地说,任意环境,数据源 和 MyBatis 的事务管理器都会被忽略。SqlSessionFactoryBean 会创建它自己的,使用这些 值定制 MyBatis 的 Environment 时是需要的。

    如果 MyBatis 映射器 XML 文件在和映射器类相同的路径下不存在,那么另外一个需要 配置文件的原因就是它了。使用这个配置,有两种选择。第一是手动在 MyBatis 的 XML 配 置文件中使用<mappers>部分来指定类路径。第二是使用工厂 bean 的 mapperLocations 属 性。

    3)mapperLocations 属性使用一个资源位置的 list。 这个属性可以用来指定 MyBatis 的 XML 映射器文件的位置。 它的值可以包含 Ant 样式来加载一个目录中所有文件, 或者从基路径下 递归搜索所有路径。比如:

  1. <bean id=“sqlSessionFactory” class=“org.mybatis.spring.SqlSessionFactoryBean”>  
  2.   <property name=“dataSource” ref=“dataSource” />  
  3.   <property name=“mapperLocations” value=“classpath*:sample/config/mappers/**/*.xml” />  
  4. </bean>  
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="dataSource" ref="dataSource" />
  <property name="mapperLocations" value="classpath*:sample/config/mappers/**/*.xml" />
</bean>

这会从类路径下加载在 sample.config.mappers 包和它的子包中所有的 MyBatis 映射器 XML 文件。

2)SqlSessionTemplate

MyBatis提供的持久层访问模板化的工具,线程安全,可通过构造参数或依赖注入SqlSessionFactory实例

    SqlSessionTemplate是MyBatis-spring的核心。这个类负责管理MyBatis的SqlSession,调用MyBatis的SQL方法,翻译异常。SqlSessionTemplate是线程安全的,可以被多个DAO所共享使用。当调用SQL方法时,包含从映射器getMapper()方法返回的方法,SqlSessionTemplate将会保证使用的SqlSession是和当前Spring的事务相关的。此外,它管理session的生命周期,包含必要的关闭,提交或回滚操作。

    SqlSessionTemplate实现了SqlSession,这就是说要对MyBatis的SqlSession进行简易替换。

    SqlSessionTemplate通常是被用来替代默认的MyBatis实现的DefaultSqlSession,因为它不能参与到Spring的事务中也不能被注入,因为它是线程不安全的。相同应用程序中两个类之间的转换可能会引起数据一致性的问题。

  1. <span style=“font-size:14px;”><!–创建jdbc数据源 –>    
  2.       <bean id=“dataSource” class=“org.apache.commons.dbcp.BasicDataSource” destroy-method=“close”>    
  3.                 <property name=“driverClassName” value=“oracle.jdbc.driver.OracleDriver” />      
  4.                 <property name=“url” value=“jdbc:oracle:****:*****:1521:****” />      
  5.                 <property name=“username” value=“****” />      
  6.                 <property name=“password” value=“****” />      
  7.       </bean>    
  8.         
  9.       <bean id=“sqlSessionFactory” class=“org.mybatis.spring.SqlSessionFactoryBean”>    
  10.          <property name=“dataSource” ref=“dataSource” />    
  11.          <property name=“configLocation” value=“classpath:com/Template/configuration.xml” />    
  12.       </bean>    
  13.           
  14.     <strong>  <bean id=“sqlSession”     class=“org.mybatis.spring.SqlSessionTemplate”>     
  15.           <constructor-arg index=“0” ref=“sqlSessionFactory” />     
  16.       </bean>    
  17.     
  18.       <bean id=“customerTest” class=“com.Template.Test”>    
  19.           <property name=“sqlSession” ref=“sqlSession” />    
  20.       </bean></span>  </strong>  
<span style="font-size:14px;"><!--创建jdbc数据源 -->  
      <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  
                <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />    
                <property name="url" value="jdbc:oracle:****:*****:1521:****" />    
                <property name="username" value="****" />    
                <property name="password" value="****" />    
      </bean>  

      <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
         <property name="dataSource" ref="dataSource" />  
         <property name="configLocation" value="classpath:com/Template/configuration.xml" />  
      </bean>  

    <strong>  <bean id="sqlSession"     class="org.mybatis.spring.SqlSessionTemplate">   
          <constructor-arg index="0" ref="sqlSessionFactory" />   
      </bean>  

      <bean id="customerTest" class="com.Template.Test">  
          <property name="sqlSession" ref="sqlSession" />  
      </bean></span>  </strong>

这是测试类,由于这是SqlSessionTemplate,所以不需要继承

  1. <span style=“font-size:14px;”>import javax.annotation.Resource;    
  2.     
  3. import org.mybatis.spring.SqlSessionTemplate;    
  4. import org.springframework.beans.factory.BeanFactory;    
  5. import org.springframework.context.support.ClassPathXmlApplicationContext;    
  6. public class Test{    
  7.     @Resource    
  8.     <strong>public SqlSessionTemplate sqlSession;  </strong>  
  9.     
  10.     public static void main(String[] args) {    
  11.         // TODO Auto-generated method stub    
  12.         new Test().firstTest();    
  13.     }    
  14.         
  15.     public void setSqlSession(SqlSessionTemplate sqlSession) {    
  16.         this.sqlSession = sqlSession;    
  17.    }    
  18.     
  19.     public void firstTest() {    
  20.         BeanFactory factory = new ClassPathXmlApplicationContext(“com/Template/applicationContext.xml”);    
  21.        <strong> Test test = (Test)factory.getBean(“customerTest”);    
  22.         Customer cus = (Customer)test.sqlSession.selectOne(“selectCustomer”,10696);  </strong>  
  23.         System.out.println(cus);    
  24.     }    
  25. }</span>    
<span style="font-size:14px;">import javax.annotation.Resource;  

import org.mybatis.spring.SqlSessionTemplate;  
import org.springframework.beans.factory.BeanFactory;  
import org.springframework.context.support.ClassPathXmlApplicationContext;  
public class Test{  
    @Resource  
    <strong>public SqlSessionTemplate sqlSession;  </strong>

    public static void main(String[] args) {  
        // TODO Auto-generated method stub  
        new Test().firstTest();  
    }  

    public void setSqlSession(SqlSessionTemplate sqlSession) {  
        this.sqlSession = sqlSession;  
   }  

    public void firstTest() {  
        BeanFactory factory = new ClassPathXmlApplicationContext("com/Template/applicationContext.xml");  
       <strong> Test test = (Test)factory.getBean("customerTest");  
        Customer cus = (Customer)test.sqlSession.selectOne("selectCustomer",10696);  </strong>
        System.out.println(cus);  
    }  
}</span>  

3)MapperScannerConfigurer

  没有必要在Spring的XML配置文件中注册所有的映射器。相反,你可以使用一个 MapperScannerConfigurer ,它将会查找类路径下的映射器并自动将它们创建成 MapperFactoryBeans 。要创建MapperScannerConfigurer,可以在Spring的配置中添加如下代码

  1. <bean class=“org.mybatis.spring.mapper.MapperScannerConfigurer”>    
  2.     <propery name=“basePackage” value=“org.mybatis.spring.sample.mapper”/>    
  3. </bean>    
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">  
    <propery name="basePackage" value="org.mybatis.spring.sample.mapper"/>  
</bean>  

basePackage属性是让你为映射器接口文件设置基本的包路径。你可以使用分号或逗号作为分隔符设置多于一个的包路径。每个映射器将会在指定的包路径中递归地被搜索到。

注意,没有必要去指定SqlSessionFactory或SqlSessionTemplate,因为MapperScannerConfigurer将会创建MapperFactoryBean,之后自动装配。但是,如果你使用了一个以上的DataSource(因此,也是多个的SqlSessionFactory),那么自动装配可能会失效。这种情况下,你可以使用sqlSessionFactory或sqlSessionTemplate属性来设置正确的工厂/模板。

 

  1. <bean id=“sqlSession” class=“org.mybatis.spring.SqlSessionTemplate”>  
  2.      <constructor-arg index=“0” ref=“sqlSessionFactory” />  
  3.  </bean>  
  4.   
  5.  <!– 注解Mapper scanner –>  
  6.  <bean class=“org.mybatis.spring.mapper.MapperScannerConfigurer”>  
  7.      <property name=“basePackage” value=“com.**.ext” />  
  8.    <strong>  <property name=“sqlSessionTemplateBeanName” value=“sqlSession” /></strong>  
  9.  </bean>  
   <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg index="0" ref="sqlSessionFactory" />
    </bean>

    <!-- 注解Mapper scanner -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.**.ext" />
      <strong>  <property name="sqlSessionTemplateBeanName" value="sqlSession" /></strong>
    </bean>




   

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/138171.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 2021机械组培训

    2021机械组培训NBUT大一培训文档

  • 【离散数学】集合论 第四章 函数与集合(2) 特殊函数类(单射、满射、双射及其性质、常/恒等函数、置换/排列)「建议收藏」

    【离散数学】集合论 第四章 函数与集合(2) 特殊函数类(单射、满射、双射及其性质、常/恒等函数、置换/排列)「建议收藏」本文属于「离散数学」系列文章之一。这一系列着重于离散数学的学习和应用。由于内容随时可能发生更新变动,欢迎关注和收藏离散数学系列文章汇总目录一文以作备忘。此外,在本系列学习文章中,为了透彻理解离散数学,本人参考了诸多博客、教程、文档、书籍等资料。以下是本文的不完全参考目录,在后续学习中还会逐渐补充:(国外经典教材)离散数学及其应用第七版DiscreteMathematicsandItsApplications7th,作者是KennethH.Rosen,袁崇义译,机械工业出版社离散.

  • CSS伪类与伪元素「建议收藏」

    CSS伪类与伪元素「建议收藏」为什么要引入伪类与伪元素?css引入伪类和伪元素概念是为了格式化文档树以外的信息。也就是说,伪类和伪元素是用来修饰不在文档树中的部分,比如,一句话中的第一个字母,或是列表中的第一个元素,又或者是鼠标悬停在某个超链接上时要设置的样式。什么是伪类,伪元素?伪类:用于当已有元素处于的某个状态时,为其添加对应的样式,这个状态是根据用户行为而动态变化的。比如说,当用户悬停在指定的元素时,我们可以…

    2022年10月21日
  • 硕士论文计算机要求,计算机硕士论文格式要求

    硕士论文计算机要求,计算机硕士论文格式要求

    2021年11月27日
  • PAT考试总结(考试心得)

    pat试题总结遍历问题的总结dfs中,如果是有环的图,要设置visited数组防止绕圈,同时在dfs函数退出前要将visited数组相应设置为false,否则其他路径就不能遍历该结点;在问题中,如果要求“从一个序列中选取若干个元素来满足条件”,可以考虑dfs,如1103IntegerFactorization(30分)和7-1Forever(20分);字符串处理总结字符串处理中,注意利用sscanf,可以按照格式读取字符串中的数字,如sscanf(s,“Therootis

  • 用pycharm安装python包_pycharm安装模块

    用pycharm安装python包_pycharm安装模块简介在做python开发时,需要很多依赖包,如果已经安装pip,安装依赖包,可以通过命令行;没有安装的,也可以通过PyCharm安装。具体安装步骤1、在File->Setting,如图:2、点击Project:untilted->ProjectInterpreter,如图:3、点击“+”,如图:4、在弹出的“AvailablePackages”的搜索框输入要安装的依赖包,如图:5、点击左下角的“InstallPackage”,如图:6、等待一会,出现如下界面,依赖

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号