zoukankan      html  css  js  c++  java
  • Java进阶知识33 mybatis(ibatis)工作原理、流程

    1、工作原理、流程  

        1、通过Reader对象读取mybatis.xml文件(文件的名称和路径可以自定义,建议放在src目录下);
        2、通过SqlSessionFactoryBuilder对象创建一个SqlSessionFactory对象;
        3、从当前的线程中获取SqlSession对象;
        4、事务开始(在MyBatis中默认自动开启);
        5、通过SqlSession对象读取XXXXXMapper.xml映射文件中的对应操作id,从而获取sql语句;
        6、提交事务(CUD必写);
        7、关闭SQLSession对象,把线程与当前的SQLSession对象分离,以便GC尽早回收。

    下面用简单代码,说明一下mybatis的工作原理、流程(看注释):

    MyBatisUtils.java 工具类

     1 public class MyBatisUtils {
     2     private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();
     3     private static SqlSessionFactory sqlSessionFactory;
     4     
     5     static{
     6         try {
     7             //1、读取配置mybatis.xml
     8             Reader reader = Resources.getResourceAsReader("mybatis.xml");
     9             //2、创建SqlSessionFactory
    10             sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
    11         } catch (Exception e) {
    12             e.fillInStackTrace();
    13             throw new RuntimeException(e);
    14         }
    15     }
    16     
    17     private MyBatisUtils() { }
    18     
    19     //3、获取SqlSession
    20     public static SqlSession getSqlSession(){
    21         SqlSession sqlSession = threadLocal.get();
    22         if (sqlSession == null) {//如果上面获取不到SQLSession,将通过下面的方式来获取
    23             sqlSession = sqlSessionFactory.openSession();
    24         }
    25         return sqlSession;
    26     }
    27     
    28     //7、关闭SqlSession
    29     public static void closeSqlSession() {
    30         SqlSession sqlSession = threadLocal.get();
    31         if (sqlSession != null) {
    32             sqlSession.close();
    33             threadLocal.remove();
    34         }
    35     }
    36 }

    mybatis.xml 核心配置文件

     1 <?xml version="1.0" encoding="UTF-8" ?>
     2 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
     3 "http://mybatis.org/dtd/mybatis-3-config.dtd">
     4 <configuration>
     5     <environments default="development">
     6         <environment id="development">
     7             <transactionManager type="JDBC" />
     8             <dataSource type="POOLED">
     9                 <property name="driver" value="oracle.jdbc.driver.OracleDriver" />
    10                 <property name="url" value="jdbc:oracle:thin:@localhost:1521:shoreid" />
    11                 <property name="username" value="zhangsan" />
    12                 <property name="password" value="123456" />
    13             </dataSource>
    14         </environment>
    15     </environments>
    16 
    17     <mappers><!-- 5、通过SqlSession对象读取XXXXXMapper.xml映射文件中的对应操作id,从而获取sql语句; -->
    18         <mapper resource="com/shore/entity/StudentMapper.xml"/>
    19     </mappers>
    20 </configuration>

    DAO层(StudentDAO)

     1   // 查询全部(相当于Hibernate的持久化操作)
     2   public List<Student> listAll() {
     3       List<Student> bosses = new ArrayList<Student>();
     4       SqlSession sqlSession = MyBatisUtils.getSqlSession(); //3、获取SqlSession
     5       try {
     6           bosses = sqlSession.selectList("student.selectAll");
     7       } catch (Exception e) {
     8           // sqlSession.rollback(); //事务回滚查询操作不用提交、不用回滚)
     9           System.out.println("error:" + e.getMessage());//获取异常信息,打印到控台
    10       } finally {
    11           // sqlSession.commit(); //6、提交事务  (查询操作不用提交、不用回滚)
    12           MyBatisUtils.closeSqlSession();//7、关闭SqlSession
    13       }
    14       return bosses;
    15   }

    该项目的完整代码:https://www.cnblogs.com/dshore123/p/12463550.html

    2、要注意的细节问题  

    a、mybatis.xml文件,建议放在src下面,文件名可以自定义。

    b、XXXXMapper.xml文件,建议跟对象放在同一个package下,文件名一般是“对象名Mapper.xml”。可以自定义。

    c、MyBatisUtils工具类:
        1、在静态初始化块中,加载MyBatis的配置文件和XXXXMapper.xml文件(执行一次)
        2、使用ThreadLocal对象,让当前线程与SqlSession对象绑定在一起(执行一次)
        3、获取当前线程中的SqlSession对象,如果没有的话,从SqlSessionFactory对象中获取SqlSession对象
        4、获取当前线程中的SqlSession对象,将其关闭,释放其占用的资源。


    原创作者:DSHORE

    作者主页:http://www.cnblogs.com/dshore123/

    原文出自:https://www.cnblogs.com/dshore123/p/12464563.html

    版权声明:欢迎转载,转载务必说明出处。(如果本文对您有帮助,可以点击一下右下角的 推荐,或评论,谢谢!

  • 相关阅读:
    saltstack高效运维
    python与RPC服务
    01-08-01【Nhibernate (版本3.3.1.4000) 出入江湖】NHibernate中的一级缓存
    01-08-01【Nhibernate (版本3.3.1.4000) 出入江湖】NHibernate中的三种状态
    01-07-01【Nhibernate (版本3.3.1.4000) 出入江湖】并发控制
    01-06-01【Nhibernate (版本3.3.1.4000) 出入江湖】事务
    01-05-01-2【Nhibernate (版本3.3.1.4000) 出入江湖】立即加载实现--NHibernateUtil.Initialize()和添加fetch关键字的HQL查询
    01-05-01-1【Nhibernate (版本3.3.1.4000) 出入江湖】延迟加载及其class和集合(set、bag等)的Lazy属性配置组合对Get和Load方法的影响
    01-01-01【Nhibernate (版本3.3.1.4000) 出入江湖】配置文件
    【log4net】配置文件
  • 原文地址:https://www.cnblogs.com/dshore123/p/12464563.html
Copyright © 2011-2022 走看看