MyBatis学习:MyBatis执行SQL语句的过程和Resources,SqlSessionFactoryBuilder,SqlSessionFactory,SqlSession

1、本篇博客的背景和目的

目前我本人正在学习MyBatis框架,在原先了解并且懵懵懂懂使用的基础上,开始系统正式的学习。目前已经阐述了MVC架构模式和三层架构,明晰了在Web项目中的普遍编码层次,认识了框架,回顾了JDBC连接数据库,稍详细介绍了MyBatis框架,初步建立了一个使用MyBatis和MySQL的Maven项目,简单解释了STDOUT_LOGGING日志和INSERT语句手动提交事务,简单记录了MyBatis中#占位符的使用方法。本篇博客回顾一下MyBatis执行SQL语句的过程和使用到的一些重要类和接口。

2、我的上一篇博文

上一篇博文我记录了MyBatis中#占位符的使用情况,感兴趣的读者可以移步查看,链接如下所示:

MyBatis学习:使用占位符#_你是我的日月星河的博客-CSDN博客https://blog.csdn.net/weixin_46281472/article/details/126004776

3、MyBatis执行SQL语句的代码过程

其实就是我前面的几篇博客中记录的Main方法中的代码,这里我先直接粘贴一下:

package com.dcy;

import com.dcy.domain.Student;
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;

public class Starter {
    public static void main(String[] args) throws IOException {
        /*
        myBatis的核心类是SqlSessionFactory
        就是需要我们加载一下主配置文件,有点像我们使用SpringMVC加载spring.xml配置文件或者BeanFactory对象一样。
        这些在官网是有的。
         */
        //定义主配置文件的目录,从类路径开始:com/**/**这样的,如果是在resources目录下,那就是 **/**/
        String config="mybatis.xml";
        //下面读取主配置文件,使用MyBatis框架中的Resources类
        InputStream inputStream = Resources.getResourceAsStream(config);
        //下面创建SqlSessionFactory对象,使用的是SqlSessionFactoryBuilder类,需要用到上面的inputStream参数
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //MyBatis最终执行SQL语句,使用的是SqlSession类中的方法。SqlSession实例的获得,依靠的是SqlSessionFactory类。
        //下面获取SqlSession对象,SqlSession是接口
        SqlSession session = sqlSessionFactory.openSession();
        //指定要执行的SQL语句的id
        //SQL语句的id=namespace+"."+SQL语句所在标签的id属性的值
        String SQLID="com.dcy.dao.StudentDao"+"."+"insertStudent";
        //通过SqlSession对象的方法执行SQL语句
//        Student student = session.selectOne(SQLID);  //这个是没有使用占位符,没有传参的
        Student student=new Student();
        student.setId(1006);
        student.setAge(24);
        student.setEmail("luoluo.163.com");
        student.setName("洛洛");
        Integer row=session.insert(SQLID,student);//将一个java对象传过去
        session.commit();//提交一下事务
        System.out.println("影响的行数是"+row);
        //最后我们关闭SqlSession对象
        session.close();
    }
}

上面代码中也有注释,我再解释一下:

1、获得主配置文件的路径(一般主配置文件都是写在resources文件下的,也就是根路径下),然后使用MyBatis中的Resources类的静态方法,读取主配置文件为InputStream类型的对象。

2、根据将获得的InputStream类型的对象作为参数,调用SqlSessionFactoryBuilder类的静态build()方法,获得SqlSessionFactory对象。

3、使用获得的SqlSessionFactory对象的openSession()方法,获得SqlSession类型的对象。

4、需要获得要执行的SQL语句的“地址”,也就是  XML配置文件中的:namespace属性值+id属性值。还需要将需要传给SQL语句的参数准备好。

5、通过获得的SqlSession对象,调用对应的方法,将SQL语句的“地址”和需要传给SQL语句的数据两者作为参数,执行方法,获得返回值。

6、提交事务,关闭SqlSession对象即可。

4、MyBatis执行SQL语句过程中的重要对象

Resources:这个类就一个作用,就是读取主配置文件的信息,把配置信息变成InputStream 对象;

SqlSessionFactoryBuilder:就是负责创建  SqlSessionFactory 对象的,创建的过程中需要主配置信息作为参数,也就是InputStream对象。

SqlSessionFactory很重要: 创建这个对象需要更多的时间和资源;这个对象在项目中有一个就可以啦,因为它需要创建Connection对象;因为它就是根据总配置文件创建的。它实际上是一个接口,它就只是创建SqlSession的。DefaultSqlSessionFactory是它的实现类。这个接口中的方法:openSession()就是获取一个默认的SqlSession对象,这个对象是需要手工提交事务的;里面还有一个方法是  openSession(boolean)  ;这个布尔参数就表示是否自动提交事务。真 true 就表示创建一个自动提交事务的SqlSession对象。

SqlSession:它是一个接口。它提供了大量执行SQL语句的方法。对象就可以直接执行SQL语句了。它的一个实现类是DefaultSqlSession,这个类并不是线程安全的。里面的方法我们看方法名就可以大概清楚简单的使用注意事项和需要的参数以及返回值。注意:因为DefaultSqlSession不是线程安全的,所以要严格按照步骤,在方法内部,获取SqlSession对象,执行SQL语句,关闭SqlSession对象

5、下一篇博文

猜你喜欢

转载自blog.csdn.net/weixin_46281472/article/details/126024873
今日推荐