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反射原理

  • 相关阅读:
    EntityFramework查询联合查询(Join,GroupJoin)
    浏览器向服务器请求页面的原理
    如何获取浏览器类型和版本
    64位Win7下32位IE无法启动问题
    jQuery 收藏
    JavaScript五种继承方式[转]
    针对模板页面的数据爬虫实现方法探讨
    ArcGISFlexSDK中关于切换地图问题(不同范围)
    NodeJS缓存文件夹遍历
    高通配置uart
  • 原文地址:https://www.cnblogs.com/chenhceng/p/7704734.html
Copyright © 2011-2022 走看看