MyBatis对象分析及建立工具类

1、MyBatis 对象分析

1. Resources 类

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

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

2. SqlSessionFactoryBuilder类

SqlSessionFactory 的 创 建 , 需 要 使 用 SqlSessionFactoryBuilder 对 象 的 build() 方 法 。apache

由 于SqlSessionFactoryBuilder 对象在建立完工厂对象后,就完成了其历史使命,便可被销毁。安全

因此,通常会将该 SqlSessionFactoryBuilder 对象建立为一个方法内的局部对象,方法结束,对象销毁session

SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);mybatis

3. SqlSessionFactory接口

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

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

SqlSessionFactory做用: 获取SqlSession对象spa

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();
    }

2、建立工具类

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就好了

相关文章
相关标签/搜索