Java MyBatis的介绍及其执行原理

2023-05-16

写在前面

??MyBatis学习
??今天我们进行MyBatis框架的学习,认识MyBatis及其执行原理,感谢你的阅读,内容若有不当之处,希望大家多多指正,一起进步!!!
如果觉得博主文章还不错,可以??三连支持一下哦??
在这里插入图片描述

文章目录

  • Java MyBatis的介绍及其执行原理
    • 回顾JDBC编程
      • JDBC使用步骤
      • JDBC编程存在的问题
      • JDBC编程问题的解决
    • mybatis的介绍及原理
      • mybatis介绍
      • mybatis执行原理
    • mybatis的使用示例
    • 源码地址

Java MyBatis的介绍及其执行原理

回顾JDBC编程

在了解MyBatista编程之前,让我们先回顾一下JDBC编程吧!

JDBC使用步骤

1. 引入依赖jar包

<dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.28</version>
</dependency>

引入MySQL的相关依赖,因为小编电脑里装的MySQL8.0版本,所以我引入的依赖也为8.0的版本。

2. 编程流程

 public static void main(String[] args) throws ClassNotFoundException {
        //1.加载数据库驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        try {
            //2.获取数据库的连接
            Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/Java2022", "root", "111111");
       
            //3.创建Statementd对象
            Statement statement = connection.createStatement();
            
            //4.执行相关的SQL
            String sql = "select * from student";
            ResultSet resultSet = statement.executeQuery(sql);
            
            //5.对结果集进行处理
            while (resultSet.next()) {
                int sid = resultSet.getInt("SID");
                String sname = resultSet.getString("Sname");
                int sage = resultSet.getInt("Sage");
                String sex = resultSet.getString("Ssex");
                System.out.println(sid + "," + sname + "," + sage + "," + sex);
            }

            //6.关闭资源
            connection.close();
            statement.close();
            resultSet.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }

JDBC编程存在的问题

1. 每次都要加载连接驱动,假如我们在开发的过程中MySQL版本换了呢?就要加载别的数据库驱动, 驱动名称存在硬编码的问题

在这里插入图片描述

2. 每次都需要获取连接,指明数据库,用户名,密码等, 连接信息存在硬编码问题

在这里插入图片描述
3. 在上述JDBC编程代码中,我们执行的SQL语句是查询学生的信息,如果我们有别的查询需求呢?这时候就要更换查询语句了 SQL和Java代码存在耦合的问题
在这里插入图片描述
4. 在对结果集的处理过程中, 需要对结果集的数据类型进行判断,列名也需要手动判断
在这里插入图片描述
5. 每次需要关闭资源,另外再加上每次连接数据库 会造成资源的浪费
在这里插入图片描述

?? 总结 ??

1. 数据库的连接创建和释放的频繁会造成系统的资源浪费从而影响系统性能。
2. SQL语句在Java代码中存在硬编码,造成了代码不易维护,实际使用过程中SQL变化可能比较大,SQL变动需要修改Java代码。
3. 对结果集的解析存在硬编码(需要查询列号),SQL变化导致解析的代码发生变化,使得系统不易维护。

JDBC编程问题的解决

那么该如何解决以上的问题呢?
请添加图片描述

1. 数据库的连接创建和释放的频繁会造成系统的资源浪费从而影响系统性能。
【解决方法】: 使用连接池来复用数据库的连接
2. SQL语句在Java代码中存在硬编码,造成了代码不易维护,实际使用过程中SQL变化可能比较大,SQL变动需要修改Java代码。
【解决方法】: 将SQL语句放在配置文件中(XML),这样即使需求改变我们直接修改配置文件,而不用修改Java代码本身
3. 对结果集的解析存在硬编码(需要查询列号),SQL变化导致解析的代码发生变化,使得系统不易维护。
【解决方法】: 将数据库中的数据集映射成Java对象

其实对以上的解决方案, mybatis 已经给我们提供了,并且提供了一些其他特征。

mybatis的介绍及原理

mybatis介绍

MyBatis 是一款优秀的持久层框架,它支持 自定义 SQL存储过程以及 高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

mybatis执行原理

执行原理图

在这里插入图片描述
??【解读mybatis执行原理图】??

1.全局配置文件:**SqlMapConfig.xml,用来配置数据源、事务、引入映射文件。
2.映射文件:**Mapper1.xml、Mapper2.xml…Mappern.xml 有多个,对查询数据库的SQL,参数类型以及结果集进行封装。
3.SqlSessionFactory:session工厂,创建SqlSession会话。
4.SqlSession: 会话,进行
CRUD
操作。
5.执行器Executor:
缓存
数据库两种实现方式。SQL输入参数后,执行器生成Statement对象(mybatis其实就是对JDBC的封装)然后Statement对象通过参数在数据库中进行查询,最后输出查询结果。
在这里插入图片描述

mybatis的使用示例

以查询java2022库下的student表为例:通过SID查询学生的信息。
在这里插入图片描述

1. 新建maven工程

在这里插入图片描述

2. 引入mybatis依赖,还有MySQL相关依赖
在这里插入图片描述

<!--   mybatis依赖-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.4.1</version>
    </dependency>
<!--    MySQL驱动依赖-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.28</version>
    </dependency>

3. 配置全局配置文件:mybatisConfig.xml

第一步: 首先在main文件夹下创建一个 resources文件夹 ,与Java原文件目录同级。
??【注意】?? ,一定要把 resources文件夹 设置成Test Sources Root类型。
设置方法: 右键resources文件夹 —> 选择Mark Directory as —> 选择Test Sources Root。
在这里插入图片描述
第二步:resources文件夹 创建 mybatisConfig.xml文件 并配置,如下:
在这里插入图片描述

4. 创建pojo类(Student 类),将数据库中student表数据映射成student对象,Student类中属性类型要和student表中的数据类型要相对应。

在这里插入图片描述
在这里插入图片描述

5. 创建Mapper接口文件(StudentMapper.java)

在这里插入图片描述

public interface StudentMapper {
    Student selectStudentById(Integer id);
}

6. 创建mapper.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">
<!--根标签 namespace命令空间:给定接口文件的全路径-->
<mapper namespace="com.wyscoder.mybatis.mapper.StudentMapper">

    <!--
    select 标签为查询操作标签
    id属性:Statement的id,必填的,和接口文件的方法名保持一致
    parameterType:表示输入参数的类型
    resultType:表示输出参数的类型
    #{XXX}:表示占位符,XXX:接口方法中的参数名称
    -->
    <select id="selectStudentById" parameterType="int" resultType="com.wyscoder.mybatis.pojo.Student">
        select * from student where SID = #{id}
    </select>
</mapper>

7. 修改全局配置文件(mybatisConfig.xml)需要将mapper.xml的路径配置到全局配置文件中

<!--    映射文件-->
    <mappers>
<!--        resource属性,指定mapper.xml文件的路径-->
        <mapper resource="mapper/StudentMapper.xml"/>
    </mappers>

8. 测试

package com.wyscoder.mybatis;


import com.wyscoder.mybatis.mapper.StudentMapper;
import com.wyscoder.mybatis.pojo.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;

/**
 * @author wyscoder
 * @version 1.0
 */
public class TestMabatis {
    public static void main(String[] args) throws IOException {

        //1.读取全局配置文件
        String path = "mybatisConfig.xml";
        //2.通过Resources获取配置文件流
        InputStream resourceAsStream = Resources.getResourceAsStream(path);
        //3.创建会话工厂
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        //4.创建会话
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //5.通过代理模式创建代理类
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);

		//查询sid = 1的学生信息
        Student student = mapper.selectStudentById(1);
        System.out.println(student);

		//关闭资源
        sqlSession.close();
    }
}

运行结果:
在这里插入图片描述
??【MyBatis的使用步骤】??

1. 配置mybatis的全局配置文件(数据源、mapper映射)
2. 创建SqlSessionFactory对象
3. 通过SqlSessionFactory创建SqlSession对象
4. 通过SqlSession对象来对数据库进行CRUD操作
5. 关闭SqlSession资源

源码地址

Gitee源码地址https://gitee.com/wang-yongsheng666/java-study2/tree/master/MyBatis

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java MyBatis的介绍及其执行原理 的相关文章

随机推荐