什么是mybatis,全是干货

本文详细介绍了MyBatis数据持久化框架,包括其核心概念SqlSessionFactory和SqlSession,以及创建MyBatis的步骤,如数据源、全局配置文件、Mapper接口和XML映射文件。MyBatis通过XML或注解方式灵活配置SQL,降低了JDBC的繁琐工作,提高了代码的可重用性和灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

博主的每篇博文的浪漫主义

【“爱意就像大雨落下”】 https://www.bilibili.com/video/BV1444y1f7m6?share_source=copy_web&vd_source=385ba0043075be7c24c4aeb4aaa73352

“爱意就像大雨落下”

在这里插入图片描述

又又又见到各位读者拉,①我为什么又说又了??

在这里插入图片描述
没错,我们今天的学习笔记的内容是

  • 什么是mybatis?
  • 怎么样来创建一个mybatis?
  • mybatis所带来的一系列东西!

什么是mybatis?

MyBatis 是一个开源、轻量级的数据持久化框架。

MyBatis 内部封装了 JDBC,简化了加载驱动、创建连接、创建 statement 等繁杂的过程,开发者只需要关注 SQL 语句本身。

那什么是数据的持久化尼?

数据持久化是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中数据模型的统称。例如,文件的存储、数据的读取以及对数据表的增删改查等都是数据持久化操作。

MyBatis 支持定制化 SQL、存储过程以及高级映射,可以在实体类和 SQL 语句之间建立映射关系,是一种半自动化的 ORM 实现。
在这里插入图片描述
我们称之为ORM。
那什么是ORM尼?

ORM(Object Relational Mapping,对象关系映射)是一种数据持久化技术,它在对象模型和关系型数据库之间建立起对应关系,并且提供了一种机制,通过 JavaBean 对象去操作数据库表中的数据。

MyBatis 的主要思想是将程序中的大量 SQL 语句剥离出来,使用 XML 文件或注解的方式实现 SQL 的灵活配置,将 SQL 语句与程序代码分离,在不修改程序代码的情况下,直接在配置文件中修改 SQL 语句。

大伙呀,要好好理解这段话呀!!

总归有优点吧,那不然还要这个干什么?

  • 与JDBC 相比,减少了 50% 以上的代码量
  • MyBatis 相当灵活,不会对应用程序或者数据库的现有设计强加任何影响,SQL 写在 XML
    中,和程序逻辑代码分离,降低耦合度,便于同一管理和优化,提高了代码的可重用性。
  • 提供 XML 标签,支持编写动态 SQL 语句。
  • 提供映射标签,支持对象与数据库的 ORM 字段关系映射。

大家看到这一段应该不陌生吧,通过jdbc连接数据库

在这里插入图片描述
在这里插入图片描述
使用 jdbc编程连接数据库的步骤:

  1. 加载数据库驱动
  2. 创连并获取数据庳链接
  3. 创建jdbc statement对象
  4. 设置sql语句
  5. 设置sql语句中的参数(使用preparedStatement)
  6. 通过statement执行sql并获取结果
  7. 对sql执行结栗进行解析处理
  8. 释放资源(resultset、preparedstatement、connection)

什么是mybatis
我们再来复习一遍!
MyBatis是一个优秀的持久层框架(ORM),它对jdbc的操作数据库的过程进行封装,使开发者只需要关注SQL本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。

Mybatis通过xml或注解的方式将要执行的各种statement (statement,preparedstatemnt、CallableStatement〉配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。

实现一个简易mybatis的步骤怎么来!!

在这里插入图片描述

数据源
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/数据库名
jdbc.username=root
jdbc.password=123456
mybatis-config.xml全局文件进行配置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <properties resource="db.properties"></properties>
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        <setting name="logImpl" value="LOG4J"/>
        <!--<setting name="logPrefix" value="mapper" />-->
    </settings>
     <!-- 配置mybatis运行环境 -->
    <environments default="development">
        <environment id="development">
        <!-- 使用JDBC的事务管理 -->
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
            <!-- MySQL数据库驱动 -->
                <property name="driver" value="${jdbc.driver}" />
                <!-- 连接数据库的URL -->
                <property name="url" value="${jdbc.url}" />
                <property name="username" value="${jdbc.username}" />
                <property name="password" value="${jdbc.password}" />
            </dataSource>
        </environment>
    </environments>
    <!--mapper sql映射文件-->
     <!-- 将mapper文件加入到配置文件中 -->
    <mappers>
        <mapper resource="UserMapper.xml"/>
    </mappers>
</configuration>

在这里插入图片描述

UserMapper(interface)
public interface UserMapper {
//根据ID查询
    User findById(Integer id);
}
UserMapper(xml映射文件)
<?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="mapper.UserMapper">
    <select id="findById" resultType="domain.User">
    select * from USER where id = #{id}
  </select>
</mapper>
通过配置文件实现
    @Test
    public void test() throws Exception {
 
        String resource = "mybatis-config.xml";
//获取配置文件流
        InputStream resourceAsStream = Resources.getResourceAsStream(resource);
//创建SqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
 
        SqlSession session = sqlSessionFactory.openSession();
 
        User u = session.selectOne("mapper.UserMapper.findById", 1);
        System.out.println("user:" + u);
        session.close();
 
    }

SqlSessionFactory是SqlSession的创建工厂,每一个SqlSession实例代表应用程序和数据库的一次连接。 在整个应用当中,

  • 我们应该只创建一个SqlSessionFactory实例,但是可以有多个SqlSession实例。

那么,

我们来学习一下SqlSessionFactory和SqlSession

这里的学习笔记知识点来自这位博主点这里

SqlSessionFactory

  1. SqlSessionFactory是MyBatis的关键对象,它是个单个数据库映射关系经过编译后的内存镜像。
  2. SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象类获得,而SqlSessionFactoryBuilder则可以从XML配置文件或一个预先定制的Configuration的实例构建出SqlSessionFactory的实例。
  3. 每一个MyBatis的应用程序都以一个SqlSessionFactory对象的实例为核心。
  4. SqlSessionFactory是线程安全的,SqlSessionFactory一旦被创建,应该在应用执行期间都存在。在应用运行期间不要重复创建多次,建议使用单例模式。
  5. SqlSessionFactory是创建SqlSession的工厂。

在这里插入图片描述

SqlSession

  1. SqlSession是MyBatis的关键对象,是执行持久化操作的独享,类似于JDBC中的Connection
  2. 它是应用程序与持久层之间执行交互操作的一个单线程对象,也是MyBatis执行持久化操作的关键对象。
  3. SqlSession对象完全包含以数据库为背景的所有执行SQL操作的方法,它的底层封装了JDBC连接,可以用SqlSession实例来直接执行被映射的SQL语句。
  4. 每个线程都应该有它自己的SqlSession实例。
  5. SqlSession的实例不能被共享,同时SqlSession也是线程不安全的,绝对不能将SqlSeesion实例的引用放在一个类的静态字段甚至是实例字段中。也绝不能将SqlSession实例的引用放在任何类型的管理范围中,比如Servlet当中的HttpSession对象中。
  6. 使用完SqlSeesion之后关闭Session很重要,应该确保使用finally块来关闭它。

SqlSession源码:

在这里插入图片描述
SqlSessionFactory调用过程
mybatis框架主要是围绕着SqlSessionFactory进行的,创建过程大概如下:

  1. 定义一个Configuration对象,其中包含数据源、事务、mapper文件资源以及影响数据库行为属性设置settings
String resource = "mybatis-config.xml";//全局配置文件路径
 InputStream inputStream = Resources.getResourceAsStream(resource);//读取xml文件
  1. 通过配置对象,则可以创建一个SqlSessionFactoryBuilder对象
new SqlSessionFactoryBuilder().build(inputStream);//构建会话工厂类
  1. 通过 SqlSessionFactoryBuilder 获得SqlSessionFactory 的实例。
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  1. SqlSessionFactory 的实例可以获得操作数据的SqlSession实例,通过这个实例对数据库进行操作
SqlSession session = sqlSessionFactory.openSession();

在这里插入图片描述

根据上面代码:mybatis有三个基本要素:

在这里插入图片描述

在这里插入图片描述

  1. 每个 MyBatis 应用程序都以一个 SqlSessionFactory 对象的实例为核心。
  2. 首先获取 SqlSessionFactoryBuilder 对象,可以根据 XML 配置文件或者 Configuration
    类的实例构建该对象。
  3. 然后获取 SqlSessionFactory 对象,该对象实例可以通过 SqlSessionFactoryBuilder 对象来获取。
  4. 有了 SqlSessionFactory 对象之后,就可以进而获取 SqlSession 实例。SqlSession
    对象中完全包含以数据库为背景的所有执行 SQL 操作的方法,用该实例可以直接执行已映射的 SQL 语句。

我们再来看一下,通过常规代码实现

注意在下面该例中,configuration 添加了一个映射器类(mapper class)。映射器类是 Java 类,它们包含 SQL 映射语句的注解从而避免了 XML 文件的依赖。不过,由于 Java 注解的一些限制加之某些 MyBatis 映射的复杂性,XML 映射对于大多数高级映射(比如:嵌套 Join 映射)来说仍然是必须的。有鉴于此,如果存在一个对等的 XML 配置文件的话,MyBatis 会自动查找并加载它(这种情况下, BlogMapper.xml 将会基于类路径和 BlogMapper.class 的类名被加载进来)

@Test
    public void test5() throws Exception {
        //创建连接池
        DataSource dataSource = new PooledDataSource("com.mysql.jdbc.Driver", "jdbc:mysql://localhost:3308/数据库名", "root", "123456");
        //事务
        TransactionFactory transactionFactory = new JdbcTransactionFactory();
        //创建环境
        Environment environment = new Environment("development", transactionFactory, dataSource);
        //创建配置
        Configuration configuration = new Configuration(environment);
        //开启驼峰规则
        configuration.setMapUnderscoreToCamelCase(true);
        //加入资源(Mapper接口)
        configuration.addMapper(UserMapper.class);
        //通过一个SqlSessionFactoryBuilder对象获取一个SqlSessionFactory工厂实例,通过唯一工厂创建SqlSession
        //(相当于获取数据库连接)
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
       
        SqlSession session = sqlSessionFactory.openSession();
 
        try {
          //statement:sql唯一标识(mapper.xml映射文件中的id标识)
          //parament:参数
            User user = session.selectOne("mapper.UserMapper.findById", 1);
            System.out.println(user);
            //操作数据时,需要有提交操作
            //提交session
            session.commit();
        } finally {
        //关闭session
            session.close();
        }
    }

救救就学到这里,博主的文章为什么没人看,虽然是抄作业吧,但我也是仔仔细细过了一遍的
提示:对于这篇学习笔记就暂时到这了,兄弟们加油
对于这篇学习笔记就暂时到这了,兄弟们加油

从现在做起,坚持下去,一天进步一小点,不久的将来,你会感谢曾经努力的你!

如果又出错的,请各位友友指正。

请添加图片描述

新人报到,各位友友们,给我个三联(点赞,关注,收藏)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极具浪漫主义色彩的菜鸟学习之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值