zoukankan      html  css  js  c++  java
  • Spring整合MyBatis-----不得不说的秘密

    1.单独使用MyBatis

    单独使用MyBatis,不结合其他框架,主要步骤是:

    1.创建SqlSessionFactory对象

    创建方法是通过SqlSessionFactoryBuilder这个类从mybatis的XML配置文件,或者porperties,或者URL获取相关数据库的配置信息。

    2.从sqlSessionFactory获取SqlSession。

    3.使用SqlSession提供的API,对数据库进行增删改查,以及事务管理。

    1
    2
    3
    4
    5
    6
    7
    String resource = "org/mybatis/example/mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    SqlSession session = sqlSessionFactory.openSession();
    session.insert("BlogMapper.selectBlog"101);
    session.commit();
    sesssion.close();

    2.结合Spring框架使用MyBatis

     MyBatis + Spring的使用方式,一般是在Spring的配置文件里,配置以下内容:

    1.数据源(DataSource)

    2.SqlSessionFactoryBean,实现FactoryBean接口,通过注入DataSource对象,以及MyBatis的相关配置信息,返回SQLSessionFactory对象。

    1
    2
    3
    4
    5
    6
    <jee:jndi-lookup id="dataSource" jndi-name="jdbc/mysql"></jee:jndi-lookup>
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation" value="classpath:mybatis/mybatis-config.xml"></property>
        <property name="mapperLocations" value="classpath:mybatis/*/*.xml"></property>
    </bean>

    加入以上的配置信息就可以Dao类里,直接引用sqlSessionFactory这个对象,对数据库进行操作(跟1的代码一样)。

    如果Dao的代码写多了,这时候会发现,每次的数据库操作,步骤都是要先

    ①获取SqlSession对象->②调用数据库操作的方法->③提交事务->④关闭SqlSession

    其中①③④这三个步骤会一直环绕在每个Dao的方法里。

    这时候会这么想,能否提供这样一个功能,在调用方法之前自动获取SqlSession对象,在调用方法之后自动提交事务和关闭SqlSession对象。这样①③④这样重复的代码就可以剔除了,整个Dao类的代码也变得更加简洁。

    3.SqlSessionTemplate的应用

    上面提到的,在调用方法之前和调用方法之后,各执行一些操作。这种技术一下子就联想到就是AOP编程方式。

    AOP是Spring的第二个核心功能,所以自然它也提供了这样的是一个实现类,就是SqlSessionTemplate

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <jee:jndi-lookup id="dataSource" jndi-name="jdbc/mysql"></jee:jndi-lookup>
     
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation" value="classpath:mybatis/mybatis-config.xml"></property>
        <property name="mapperLocations" value="classpath:mybatis/*/*.xml"></property>
    </bean>
         
    <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg ref="sqlSessionFactory" />
    </bean>

     引入SqlSessionTemplate这个类,在写Dao时,每个方法,在执行之前,自动获取SqlSession对象,执行之后,自动提交事务和关闭会话。

    1
    2
    3
    public Object save(String str, Object obj) throws Exception {
      return sqlSessionTemplate.insert(str, obj);
    }

    现在代码一下子变得更简洁了,只剩下数据操作的方法。

    4.SqlSessionTemplate原理解析思路

    为什么SqlSessionTemplate能够在每个方法,在执行之前,自动获取SqlSession对象,执行之后,自动提交事务和关闭会话。

    要知道这个原理,其实相当于要了解Spring AOP原理。

    要了解Spring AOP原理,就必须知道Java技术里,动态代理的原理。

    Java的动态代理主要是涉及到JDK里java.lang.reflect包下的InvocationHandler接口和Proxy类里创建代理对象的方法。

    SqlSessionTemplate的源码解析

    SqlSessionTemplate的构造方法里,创建了一个SqlSession的代理对象。

    在这个代理对象,每次SQLSession的方法被调用,都执行以下操作。

    上面代码涉及到的知识点比较多,要完全理解,需要掌握下面列出的几点。

    5.知识点归纳

    1.MyBatis中的SqlSessionFactory和SqlSession

    2.Spring中的SqlSessionFactoryBean和SqlSessionTemplate

    3.Spring AOP原理

    4.Java动态代理原理

    5.Java反射原理

  • 相关阅读:
    June. 26th 2018, Week 26th. Tuesday
    June. 25th 2018, Week 26th. Monday
    June. 24th 2018, Week 26th. Sunday
    June. 23rd 2018, Week 25th. Saturday
    June. 22 2018, Week 25th. Friday
    June. 21 2018, Week 25th. Thursday
    June. 20 2018, Week 25th. Wednesday
    【2018.10.11 C与C++基础】C Preprocessor的功能及缺陷(草稿)
    June.19 2018, Week 25th Tuesday
    June 18. 2018, Week 25th. Monday
  • 原文地址:https://www.cnblogs.com/chenhceng/p/7704734.html
Copyright © 2011-2022 走看看