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

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

posted @ 2020-03-11 18:43  DSHORE  阅读(497)  评论(0编辑  收藏  举报