MyBatis对象分析及创建工具类

前端之家收集整理的这篇文章主要介绍了MyBatis对象分析及创建工具类前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_404_0@

@H_404_0@

一、MyBatis 对象分析

1. Resources 类

@H_404_0@mybatis中的一个类, 负责读取主配置文件,返回 IO 流对象

@H_404_0@InputStream in = Resources.getResourceAsStream("mybatis.xml");

2. sqlSessionFactoryBuilder类

@H_404_0@sqlSessionFactory 的 创 建 , 需 要 使 用 sqlSessionFactoryBuilder 对 象 的 build() 方 法 。

@H_404_0@由 于sqlSessionFactoryBuilder 对象在创建完工厂对象后,就完成了其历史使命,即可被销毁。

@H_404_0@所以,一般会将该 sqlSessionFactoryBuilder 对象创建为一个方法内的局部对象,方法结束,对象销毁

@H_404_0@sqlSessionFactoryBuilder builder = new sqlSessionFactoryBuilder();
sqlSessionFactory factory = builder.build(in);

3. sqlSessionFactory接口

@H_404_0@重量级对象, 程序创建一个对象耗时比较长,使用资源比较多,是线程安全的,

@H_404_0@在整个项目中,有一个就够用了

@H_404_0@sqlSessionFactory作用: 获取sqlSession对象

@H_404_0@sqlSession sqlSession = factory.openSession();

@H_404_0@openSession()方法说明:

  • openSession() :无参数的, 获取是非自动提交事务的sqlSession对象
  • openSession(boolean): openSession(true) 获取自动提交事务的sqlSession.
    openSession(false) 非自动提交事务的sqlSession对象
@H_404_0@对于 insert 、delete、update 如果使用的无参数的,那么需要在执行完sql语句之后,手动的提交事务

4. sqlSession 接口

@H_404_0@sqlSession 接口对象用于执行持久化操作。

@H_404_0@sqlSession接口 :定义了操作数据的方法 例如 selectOne(),selectList(),insert(),update(),delete(),commit(),rollback()

@H_404_0@在IDEA中 Ctrl + H就可以看到实现类

@H_404_0@需要注意:

@H_404_0@sqlSession对象不是线程安全的,需要在方法内部使用, 在执行sql语句之前,使用openSession()获取sqlSession对象。
在执行完sql语句后,需要关闭它,执行sqlSession.close(). 这样能保证他的使用是线程安全的

@H_404_0@这样的话在看之前写的操作就懂了

  1. public void testInsert() throws IOException {
  2. // 访问mybatis读取student数据
  3. //1.定义mybatis主配置文件名称,从类路径的根开始(target/clasess),编译之后的目录
  4. String config = "mybatis.xml";
  5. //2.读取这个config表示的文件
  6. InputStream in = Resources.getResourceAsStream(config);
  7. //3.创建了sqlSessionFactoryBuilder对象
  8. sqlSessionFactoryBuilder builder = new sqlSessionFactoryBuilder();
  9. //4.创建sqlSessionFactory对象
  10. sqlSessionFactory factory = builder.build(in);
  11. //5.获取sqlSession对象,从sqlSessionFactory中获取sqlSession
  12. sqlSession sqlSession = factory.openSession();
  13. //6.【重要】指定要执行的sql语句的标识。 sql映射文件中的namespace + "." + 标签的id值
  14. // String sqlId = "com.md.dao.StudentDao"+"."+"selectStudents";
  15. String sqlId = "com.md.dao.StudentDao.insertStudent";
  16. //7.【重要】执行sql语句,通过sqlId找到语句
  17. // 第一个参数是执行的sql语句,第二个是对象
  18. int i = sqlSession.insert(sqlId,new Student(1004,"刘桑","ls@qq.com",18));
  19. // 需要注意,mybatis默认不是自动提交事务,所以在写完insert、update、delete之后,手动的提交事务
  20. sqlSession.commit();
  21. //8.输出结果
  22. System.out.println("执行insert影响的行数:"+i);
  23. //9.关闭sqlSession对象
  24. sqlSession.close();
  25. }

二、创建工具类

1. 创建 MyBatisUtils类

@H_404_0@在com.md下新建一个包utils,里面创建MyBatisUtils

@H_404_0@至于为什么使用静态代码块,主要看sqlSessionFactory接口的特性

  1. package com.md.utils;
  2. import org.apache.ibatis.io.Resources;
  3. import org.apache.ibatis.session.sqlSession;
  4. import org.apache.ibatis.session.sqlSessionFactory;
  5. import org.apache.ibatis.session.sqlSessionFactoryBuilder;
  6. import java.io.IOException;
  7. import java.io.InputStream;
  8. /**
  9. * @author MD
  10. * @create 2020-08-05 10:59
  11. */
  12. public class MyBatisUtils {
  13. private static sqlSessionFactory factory = null;
  14. // 保证了sqlSessionFactory对象只创建一次
  15. static {
  16. // 和你项目的主配置文件名一致
  17. String config = "mybatis.xml";
  18. // 读取这个config表示的文件
  19. try {
  20. InputStream in = Resources.getResourceAsStream(config);
  21. // 创建了sqlSessionFactory对象,使用创建了sqlSessionFactoryBuilder对象
  22. factory = new sqlSessionFactoryBuilder().build(in);
  23. } catch (IOException e) {
  24. e.printStackTrace();
  25. }
  26. }
  27. // 获取sqlSession的方法
  28. public static sqlSession getsqlSession() {
  29. sqlSession sqlSession = null;
  30. if (factory != null){
  31. // 非自动提交事务
  32. sqlSession = factory.openSession();
  33. }
  34. return sqlSession;
  35. }
  36. }

2. 使用MyBatisUtils

  1. public static void main(String[] args) {
  2. sqlSession sqlSession = MyBatisUtils.getsqlSession();
  3. String sqlId = "com.md.dao.StudentDao.selectStudents";
  4. List<Student> studentList = sqlSession.selectList(sqlId);
  5. studentList.forEach(stu -> System.out.println(stu));
  6. sqlSession.close();
  7. }
@H_404_0@这样就方便很多,只用专注于写sql就行了

猜你在找的Mybatis相关文章