MyBatis对象分析及创建工具类
[TOC]
一、MyBatis 对象分析
1. Resources 类
mybatis中的一个类, 负责读取主配置文件,返回 IO 流对象
InputStream in = Resources.getResourceAsStream("mybatis.xml");
2. SqlSessionFactoryBuilder类
SqlSessionFactory 的 创 建 , 需 要 使 用 SqlSessionFactoryBuilder 对 象 的 build() 方 法 。
由 于SqlSessionFactoryBuilder 对象在创建完工厂对象后,就完成了其历史使命,即可被销毁。
所以,一般会将该 SqlSessionFactoryBuilder 对象创建为一个方法内的局部对象,方法结束,对象销毁
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
3. SqlSessionFactory接口
重量级对象, 程序创建一个对象耗时比较长,使用资源比较多,是线程安全的,
在整个项目中,有一个就够用了
SqlSessionFactory作用: 获取SqlSession对象
SqlSession sqlSession = factory.openSession();
openSession()方法说明:
- openSession() :无参数的, 获取是非自动提交事务的SqlSession对象
- openSession(boolean): openSession(true) 获取自动提交事务的SqlSession. openSession(false) 非自动提交事务的SqlSession对象
对于 insert 、delete、update 如果使用的无参数的,那么需要在执行完sql语句之后,手动的提交事务
4. SqlSession 接口
SqlSession 接口对象用于执行持久化操作。
SqlSession接口 :定义了操作数据的方法 例如 selectOne() ,selectList() ,insert(),update(), delete(), commit(), rollback()
在IDEA中 Ctrl + H就可以看到实现类
需要注意:
SqlSession对象不是线程安全的,需要在方法内部使用, 在执行sql语句之前,使用openSession()获取SqlSession对象。 在执行完sql语句后,需要关闭它,执行SqlSession.close(). 这样能保证他的使用是线程安全的
这样的话在看之前写的操作就懂了
public void testInsert() throws IOException { // 访问mybatis读取student数据 //1.定义mybatis主配置文件的名称, 从类路径的根开始(target/clasess),编译之后的目录 String config = "mybatis.xml"; //2.读取这个config表示的文件 InputStream in = Resources.getResourceAsStream(config); //3.创建了SqlSessionFactoryBuilder对象 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); //4.创建SqlSessionFactory对象 SqlSessionFactory factory = builder.build(in); //5.获取SqlSession对象,从SqlSessionFactory中获取SqlSession SqlSession sqlSession = factory.openSession(); //6.【重要】指定要执行的sql语句的标识。 sql映射文件中的namespace + "." + 标签的id值 // String sqlId = "com.md.dao.StudentDao"+"."+"selectStudents"; String sqlId = "com.md.dao.StudentDao.insertStudent"; //7.【重要】执行sql语句,通过sqlId找到语句 // 第一个参数是执行的sql语句,第二个是对象 int i = sqlSession.insert(sqlId,new Student(1004,"刘桑","ls@qq.com",18)); // 需要注意,mybatis默认不是自动提交事务,所以在写完insert、update、delete之后,手动的提交事务 sqlSession.commit(); //8.输出结果 System.out.println("执行insert影响的行数:"+i); //9.关闭SqlSession对象 sqlSession.close(); }
二、创建工具类
1. 创建 MyBatisUtils类
在com.md下新建一个包utils,里面创建MyBatisUtils
至于为什么使用静态代码块,主要看SqlSessionFactory接口的特性
package com.md.utils; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.InputStream; /** * @author MD * @create 2020-08-05 10:59 */ public class MyBatisUtils { private static SqlSessionFactory factory = null; // 保证了SqlSessionFactory对象只创建一次 static { // 和你项目的主配置文件名一致 String config = "mybatis.xml"; // 读取这个config表示的文件 try { InputStream in = Resources.getResourceAsStream(config); // 创建了SqlSessionFactory对象,使用创建了SqlSessionFactoryBuilder对象 factory = new SqlSessionFactoryBuilder().build(in); } catch (IOException e) { e.printStackTrace(); } } // 获取SqlSession的方法 public static SqlSession getSqlSession() { SqlSession sqlSession = null; if (factory != null){ // 非自动提交事务 sqlSession = factory.openSession(); } return sqlSession; } }
2. 使用MyBatisUtils
public static void main(String[] args) { SqlSession sqlSession = MyBatisUtils.getSqlSession(); String sqlId = "com.md.dao.StudentDao.selectStudents"; List<Student> studentList = sqlSession.selectList(sqlId); studentList.forEach(stu -> System.out.println(stu)); sqlSession.close(); }
这样就方便很多,只用专注于写sql就行了
- MyBatis运行原理(二)SqlSession对象创建过程分析
- MyBatis运行原理(三)MyBatis接口式编程及创建代理对象原理分析
- Javascript笔记:jQuery源码分析以及从jQuery对象创建的角度理解extend方法的原理
- java基础1:对象创建内存分析
- javascript笔记:深入分析javascript里对象的创建(中)
- String s = a+b+c+d+e;创建了几个对象的详细分析?
- Android应用程序窗口(Activity)的窗口对象(Window)的创建过程分析
- 从JVM的角度分析String对象的创建
- 2.4Java面向对象-数组工具类创建使用过程
- 详细分析Javascript中创建对象的四种方式
- mybatis逆向工程的pojo对象分析
- Spring3.1.0实现原理分析(九).AOP之创建代理对象的过程
- Mybatis 源码分析一、 SqlSessionFactory的创建过程
- Android Audio代码分析3 - 创建AudioTrack对象
- javascript笔记:深入分析javascript里对象的创建(下)---从对象创建到javascript程序优化
- 对象类Android应用程序资源管理器(Asset Manager)的创建过程分析
- Redis源码分析(二十八)--- object创建和释放redisObject对象
- javascript笔记:深入分析javascript里对象的创建(下)---从对象创建到javascript程序优化
- Android应用程序窗口(Activity)的窗口对象(Window)的创建过程分析
- javascript笔记:深入分析javascript里对象的创建(下)---从对象创建到javascript程序优化