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