MyBatis——通过占位符实现insert操作、一些重要对象(SqlSessionFactory、SqlSession)的理解

简介: MyBatis——通过占位符实现insert操作、一些重要对象(SqlSessionFactory、SqlSession)的理解

文章目录:


1.通过占位符实现insert操作

1.1 承接上一篇博文

1.2 StudentDao接口中添加一个抽象方法

1.3 StudentDao.xml文件中添加insert标签(使用占位符)

1.4 MyBatis.xml主配置文件中添加日志标签

1.5 MyTest测试类中编写实现方法

2.MyBatis框架中一些重要对象 

2.1 Resources 

2.2 SqlSessionFactoryBuilder

2.3 SqlSessionFactory接口(重要对象)

2.4 SqlSession接口(重要对象)

写在结尾:MyBatis的底层其实就是JDBC!!!


1.通过占位符实现insert操作


1.1 承接上一篇博文

https://blog.csdn.net/weixin_43823808/article/details/114142592


1.2 StudentDao接口中添加一个抽象方法

package com.bjpowernode.dao;
import com.bjpowernode.entity.Student;
/**
 *
 */
public interface StudentDao {
    //查询一个学生
    Student selectStudentById(Integer id);
    //添加学生
    //返回值int:表示本次操作影响的数据库的行数
    int insertStudent(Student student);
}

1.3 StudentDao.xml文件中添加insert标签(使用占位符)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bjpowernode.dao.StudentDao">
    <!--添加insert
        如果传入给MyBatis的是一个Java对象,使用 #{属性名} 获取此属性的值
        属性值放到 #{} 占位符的位置,MyBatis执行此属性对应的 getXXX()方法
        例如:#{id},MyBatis执行 getId()方法
    -->
    <insert id="insertStudent">
        insert into student values(#{id},#{name},#{email},#{age})
    </insert>
</mapper>

1.4 MyBatis.xml主配置文件中添加日志标签

 

<!--设置日志-->
<settings>
    <setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>

1.5 MyTest测试类中编写实现方法

//测试MyBatis执行sql语句
@Test
public void testinsertStudent() throws IOException {
        String config="mybatis.xml";
        InputStream inputStream=Resources.getResourceAsStream(config);
        SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession session=factory.openSession();
        String sqlId="com.bjpowernode.dao.StudentDao" + "." + "insertStudent";
        Student student=new Student();
        student.setId(1005);
        student.setName("张飞");
        student.setEmail("zhangfei@qq.com");
        student.setAge(26);
        int rows=session.insert(sqlId,student);
        System.out.println("使用MyBatis添加一个学生,rows=" + rows);
        //MyBatis默认执行sql语句是 手工提交事务模式,在做insert、update、delete后需要提交事务
        session.commit();
        session.close();
}

在上面的测试代码中,如果没有session.commit(); 这句话,则无法将数据添加到数据库中。(大家可以自行尝试)

这是因为 MyBatis 默认执行sql语句是手工提交事务模式,在做insertupdatedelete后需要提交事务,也就是说在执行完insertupdatedelete后,需要 session.commit(); 这行代码来手动将事务提交才行。

那么 MyBatis 有没有自动提交事务的方法呢?   答案是:当然有!!!

在上面的代码中有这样一行:👇👇👇

SqlSession session=factory.openSession();

这个 openSession() SqlSession 接口的一个实现方法,在其中有很多方法进行了重载,我们只需对这个方法进行修改即可实现自动提交事务:SqlSession session=factory.openSession(true);

见如下代码:👇👇👇

//测试MyBatis执行sql语句
@Test
public void testAutoCommitInsertStudent() throws IOException {
        String config="mybatis.xml";
        InputStream inputStream=Resources.getResourceAsStream(config);
        SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(inputStream);
        //openSession(true):创建一个有自动提交功能的 SqlSession
        //openSession(false):创建一个非自动提交功能的 SqlSession,需手动提交
        //openSession():同 openSession(false)
        SqlSession session=factory.openSession(true);
        String sqlId="com.bjpowernode.dao.StudentDao" + "." + "insertStudent";
        Student student=new Student();
        student.setId(1007);
        student.setName("小明");
        student.setEmail("xiaoming@qq.com");
        student.setAge(15);
        int rows=session.insert(sqlId,student);
        System.out.println("使用MyBatis添加一个学生,rows=" + rows);
        session.close();
}

可以看到,这段代码中并没有 session.commit(); 这句话,但是仍然可以向数据库中添加数据!!!

以上步骤是通过占位符实现了insert操作,那么对于updatedelete操作都是换汤不换药,在这里就不再举例了!!!

2.MyBatis框架中一些重要对象


2.1 Resources 

Resources类,顾名思义就是资源,用于读取资源文件(主配置信息)。其有很多方法通过加载并解析资源文件,返回不同类型的 IO 流对象。

对应于代码中的这一行:👇👇👇

InputStream inputStream=Resources.getResourceAsStream(config);

2.2 SqlSessionFactoryBuilder

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

对应于代码中的这一行:👇👇👇

SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(inputStream);

2.3 SqlSessionFactory接口(重要对象)

SqlSessionFactory接口对象是一个重量级对象(系统开销大的对象),是线程安全的,所以一个应用只需要一个该对象即可。

创建 SqlSession 需要使用 SqlSessionFactory 接口的的 openSession()方法。

作用是 SqlSession 的工厂,也即创建 SqlSession 的对象。

它的实现类如下:👇👇👇

public class DefaultSqlSessionFactory implements SqlSessionFactory { }

SqlSessionFactory接口中的重要方法:👇👇👇

openSession(true):创建一个有自动提交功能的 SqlSession
openSession(false):创建一个非自动提交功能的 SqlSession,需手动提交
openSession():同 openSession(false)

2.4 SqlSession接口(重要对象)

SqlSession接口对象用于执行持久化操作。一个 SqlSession 对应着一次数据库会话,一次会话以 SqlSession 对象的创建开始,以 SqlSession 对象的关闭结束。

SqlSession接口对象是线程不安全的,所以每次数据库会话结束前,需要马上调用其 close() 方法,将其关闭。再次需要会话,再次创建。 SqlSession在方法内部创建,使用完毕后关闭。 

SqlSession的对象是通过 SqlSessionFactory 来获取的。

它的实现类如下:👇👇👇

public class DefaultSqlSession implements SqlSession { }

SqlSession接口中的重要方法:👇👇👇

selectOne:执行sql语句,最多得到一行记录,多余1行则会抛出异常
selectList:执行sql语句,返回多行数据
selectMap:执行sql语句,得到一个Map结果
insert:执行insert语句
update:执行update语句
delete:执行delete语句
commit:提交事务
rollback:回滚事务

写在结尾:MyBatis的底层其实就是JDBC!!!

相关文章
|
3月前
|
XML Java 数据库连接
【MyBatis】MyBatis操作数据库(一)
【MyBatis】MyBatis操作数据库(一)
34 1
|
3月前
|
SQL 存储 Java
基于MyBatis的增删改查操作
基于MyBatis的增删改查操作
33 1
|
3月前
|
XML Java 数据库连接
如何使用 MyBatis 来进行增、删、改、查操作
如何使用 MyBatis 来进行增、删、改、查操作
49 2
|
27天前
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
30 1
|
3月前
|
缓存 Java 数据库连接
我们后端程序员不是操作MyBatis的CRUD Boy
大家好,我是南哥。一个对Java程序员进阶成长颇有研究的人,今天我们接着新的一篇Java进阶指南。为啥都戏称后端是CRUD Boy?难道就因为天天怼着数据库CRUD吗?要我说,是这个岗位的位置要的就是你CRUD,你不得不CRUD。哪有公司天天能给你搭建高并发、高可用、大数据框架的活呢,一条业务线总要成长吧,慢慢成熟了就要装修工来缝缝补补、美化美化,也就是CRUD的活。不能妄自菲薄CRUD Boy,我们是后端工程师。今天来指南下操作数据库之MyBatis框架。
110 3
我们后端程序员不是操作MyBatis的CRUD Boy
|
2月前
|
SQL Java 数据库连接
Mybatis框架中SqlSessionFactory
Mybatis框架中SqlSessionFactory
|
2月前
|
SQL 缓存 Java
使用MyBatis优化Java持久层操作
使用MyBatis优化Java持久层操作
|
2月前
|
SQL Java 数据库连接
Mybatis之SqlSession简析
Mybatis之SqlSession简析
|
2月前
|
SQL 缓存 Java
使用MyBatis优化Java持久层操作
使用MyBatis优化Java持久层操作
|
3月前
|
Java 数据库连接 数据库
Spring日志完结篇,MyBatis操作数据库(入门)
Spring日志完结篇,MyBatis操作数据库(入门)