mybatis:https://mybatis.org/mybatis-3/zh/index.html
主要有三个核心对象:SqlSessionFactoryBuilder, SqlSessionFactory, SqlSession
这个是一个构建器,是用来构建SqlSessionFactory对象的,SqlSessionFactoryBuilder可以通过读取mybatis的配置文件,然后构建一个SqlSessionFactory对象,SqlSessionFactoryBuilder将mybatis配置文件、xml映射文件和Mapper 接口的映射关系解析好,然后放在java对象中,java对象存在于内存中,内存中访问会非常快的,那么我们每次去用的时候就不需要重新去解析xml了,SqlSessionFactoryBuilder解析配置之后,生成的对象就是SqlSessionFactory,这个是一个重量级的对象,创建他是比较耗时的,所以一般一个db我们会创建一个SqlSessionFactory对象,然后在系统运行过程中会一直存在,而SqlSessionFactoryBuilder用完了就可以释放了。
这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。 因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。
alt +7 左侧的Structrue
查找接⼝的实现类:Ctrl + H
三种方式:Reader, InputStream, Confiugration也就是字符流,字节流和类的方式
SqlSessionFactory是一个工厂,是用来创建SqlSession的工厂,SqlSessionFactory是一个重量级的对象,一般一个db对应一个SqlSessionFactory对象,系统运行过程中会一直存在。
SqlSessionFactory是一个接口,这个接口有2个实现DefaultSqlSessionFactory和SqlSessionManager,一般都是通过SqlSessionFactoryBuilder来创建SqlSessionFactory对象。
通过SqlSessionFactoryBuilder来创建SqlSessionFactory对象主要有2种方式,一种通过读取mybatis配置文件的方式,另外一种是硬编码的方式,springboot中会使用到硬编码的方式。
SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。 使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次。因此 SqlSessionFactory 的最佳作用域是应用(application)作用域。
有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。
openSession()方法的参数为boolean值时,若传入的对象是true标识开启事务控制,自动提交,若传入的值是false标识关闭事务控制。
若不传入参数,默认为false。
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();
}
SqlSession就类似于jdbc中Connection连接对象,在mybatis中叫做Sql会话对象,一般一个db操作使用一个SqlSession对象,所以这个对象一般是方法级别的,方法结束之后,这个对象就销毁了,这个对象可以调用sqlSessionFactory.openSession的方法来进行获取。
我们可以直接通过SqlSession对象来调用mapper xml中各种db操作,需要指定具体的操作的id,id的格式为namespace.操作的id。
每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求(request)或方法作用域。
每次收到 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();
}
}
}
可以通过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);
核心配置文件主要用于配置连接数据库的环境以及MyBatis的全局配置信息,MyBatis的核心配置文件名称可以随便起名,建议使用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-config.xml 文件中的元素节点是有一定顺序的,节点位置必须按以上位置排序,否则会编译错误。
The content of element type "configuration" must match "
(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,
reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)".
属性可以在外部进行配置,并可以进行动态替换。
内容如下:
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>
<properties resource="db.properties">
<property name="username" value="root"/>
<property name="password" value="root"/>
properties>