MyBatis的核心配置

1.Mybatis核心对象

mybatis:https://mybatis.org/mybatis-3/zh/index.html
主要有三个核心对象:SqlSessionFactoryBuilder, SqlSessionFactory, SqlSession

1.1 SqlSessionFactoryBuilder

1.1.1 介绍

这个是一个构建器,是用来构建SqlSessionFactory对象的,SqlSessionFactoryBuilder可以通过读取mybatis的配置文件,然后构建一个SqlSessionFactory对象,SqlSessionFactoryBuilder将mybatis配置文件、xml映射文件和Mapper 接口的映射关系解析好,然后放在java对象中,java对象存在于内存中,内存中访问会非常快的,那么我们每次去用的时候就不需要重新去解析xml了,SqlSessionFactoryBuilder解析配置之后,生成的对象就是SqlSessionFactory,这个是一个重量级的对象,创建他是比较耗时的,所以一般一个db我们会创建一个SqlSessionFactory对象,然后在系统运行过程中会一直存在,而SqlSessionFactoryBuilder用完了就可以释放了。

1.1.2 作用域

这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。 因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。

1.1.3 API

alt +7 左侧的Structrue
查找接⼝的实现类:Ctrl + H
MyBatis的核心配置_第1张图片
三种方式:Reader, InputStream, Confiugration也就是字符流,字节流和类的方式

1.2 SqlSessionFactory

1.2.1 介绍

SqlSessionFactory是一个工厂,是用来创建SqlSession的工厂,SqlSessionFactory是一个重量级的对象,一般一个db对应一个SqlSessionFactory对象,系统运行过程中会一直存在。
SqlSessionFactory是一个接口,这个接口有2个实现DefaultSqlSessionFactory和SqlSessionManager,一般都是通过SqlSessionFactoryBuilder来创建SqlSessionFactory对象。
通过SqlSessionFactoryBuilder来创建SqlSessionFactory对象主要有2种方式,一种通过读取mybatis配置文件的方式,另外一种是硬编码的方式,springboot中会使用到硬编码的方式。

1.2.2 作用域

SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。 使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次。因此 SqlSessionFactory 的最佳作用域是应用(application)作用域。
有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。

1.2.3 API

MyBatis的核心配置_第2张图片
openSession()方法的参数为boolean值时,若传入的对象是true标识开启事务控制,自动提交,若传入的值是false标识关闭事务控制。
若不传入参数,默认为false。

1.2.4案例

1.UserMappe.class接口添加以下方法

    /**
     * 插入用户
     */
    public int insertUser(User user);

2.UserMappe.xml文件添加以下内容

    
    <insert id="insertUser" parameterType="user">
        insert into users values(null, #{uname}, #{uage})
    insert>

3.TestMybatis测试类添加以下测试方法

    @Test
    public void testInserUser() throws IOException {
   
        ///1.获取核心配置类
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        //2.创建SqlSessionFacotry
        SqlSessionFactory sqlSessionFacotry = new SqlSessionFactoryBuilder().build(is);
        //3.获取SqLSession对象
        SqlSession session = sqlSessionFacotry.openSession();
        /**
         * 1.方法 mapper运行完毕使用session.commit()方法提交事务-96行
         * 2.使用openSession(true)自动提交事务
         */
        //4.执行sql语句
        UserMapper mapper = session.getMapper(UserMapper.class);
        User user = new User();
        user.setUname("lily");
        user.setUage(23);
        mapper.insertUser(user);
//        session.commit();
        //5。释放资源
        session.close();
    }

1.3 SqlSession

1.3.1 介绍

SqlSession就类似于jdbc中Connection连接对象,在mybatis中叫做Sql会话对象,一般一个db操作使用一个SqlSession对象,所以这个对象一般是方法级别的,方法结束之后,这个对象就销毁了,这个对象可以调用sqlSessionFactory.openSession的方法来进行获取。
我们可以直接通过SqlSession对象来调用mapper xml中各种db操作,需要指定具体的操作的id,id的格式为namespace.操作的id。

1.3.2 作用域

每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求(request)或方法作用域。

1.3.3 api

MyBatis的核心配置_第3张图片

每次收到 HTTP 请求,就可以打开一个 SqlSession,返回一个响应后,就关闭它。 这个关闭操作很重要,为了确保每次都能执行关闭操作,你应该把这个关闭操作放到 finally 块中。

try(){
   
}finally{
   
	sqlSession.close();
}

例如,在开发中常常使用一个工具类提供sqlSession的获取和关闭:

package com.example.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;

/**
 * ClassName: MyBatisUtil
 * Package: com.example.utils
 * Description:
 *
 * @Create 2023/3/28 12:19
 * @Version 1.0
 */
public class MyBatisUtil
{
   
    //利用static(静态)属于类不属于对象,且全局唯一
    private static SqlSessionFactory sqlSessionFactory = null;
    //利用静态块在初始化类时实例化sqlSessionFactory
    static {
   
        InputStream is= null;
        try {
   
            is = Resources.getResourceAsStream("mybatis-config.xml");
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        } catch (IOException e) {
   
            e.printStackTrace();
            throw new ExceptionInInitializerError(e);
        }
    }

    /**
     * openSession 创建一个新的SqlSession对象
     * @return SqlSession对象
     */
    public static SqlSession openSession(boolean autoCommit){
   
        return sqlSessionFactory.openSession();
    }

    /**
     * 释放一个有效的SqlSession对象
     * @param session 准备释放SqlSession对象
     */
    public static void closeSession(SqlSession session){
   
        if(session != null){
   
            session.close();
        }
    }
}

1.3.4 mapper接口

可以通过SqlSession直接调用mapper.xml中的db操作,不过更简单的以及推荐的方式是使用Mapper接口,Mapper接口中的方法和mapper xml文件中的各种db操作建立了映射关系,是通过Mapper接口完整名称+方法名称和mapper xml中的namespace+具体操作的id来进行关联的,然后我们直接调用Mapper接口中的方法就可以间接的操作db了,使用想当方便,Mapper接口需要通过SqlSession获取,传入Mapper接口对应的Class对象,然后会返回这个接口的实例,如:

UserMapper mapper = sqlSession.getMapper(UserMapper.class);

2 MyBatis核心配置文件

核心配置文件主要用于配置连接数据库的环境以及MyBatis的全局配置信息,MyBatis的核心配置文件名称可以随便起名,建议使用mybatis-config.xml

2.1 mybatis-config.xml头部约束

1.dtd约束

xml文件的声明处引入dtd约束文件 ===》 规定xml中语法规则。(会自动提示)


DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">

2.引入约束:
File—>Settings—>Languages & Frameworks—>Schemas and DTDs—>点击+号—>把复制的dtd约束黏贴—>OK
3.导入本地约束文件
MyBatis的核心配置_第4张图片

2.2 mybatis-config.xml配置文件的元素

mybatis-config.xml 文件中的元素节点是有一定顺序的,节点位置必须按以上位置排序,否则会编译错误。

The content of element type "configuration" must match "
(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,
reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)".

2.2.1 属性properties标签

属性可以在外部进行配置,并可以进行动态替换。

1.属性文件中配置,如db.properties或jdbc.properties

内容如下:

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false
jdbc.username=root
jdbc.password=root

设置好的属性在核心配置文件mybatis-config.xml中使用方式如下:

    <properties resource="db.properties">properties>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            dataSource>
        environment>

    environments>
2.Property元素的子元素中设置,也可以同时动态替换
<properties resource="db.properties">
  <property name="username" value="root"/>
  <property name="password" value="root"/>
properties>

你可能感兴趣的:(mybatis,mybatis,java,开发语言)