⭐写在前面⭐

🧭MyBatis学习
📢今天我们进行MyBatis框架的学习,认识MyBatis及其执行原理,感谢你的阅读,内容若有不当之处,希望大家多多指正,一起进步!!!
♨️如果觉得博主文章还不错,可以👍三连支持⭐一下哦😀

java中用 mybatis 直接执行sql字符串_SQL


文章目录

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


Java MyBatis的介绍及其执行原理

回顾JDBC编程

在了解MyBatis编程之前,让我们先回顾一下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版本换了呢?就要加载别的数据库驱动, 驱动名称存在硬编码的问题

java中用 mybatis 直接执行sql字符串_mysql_02

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

java中用 mybatis 直接执行sql字符串_mysql_03


3.

在上述JDBC编程代码中,我们执行的SQL语句是查询学生的信息,如果我们有别的查询需求呢?这时候就要更换查询语句了

SQL和Java代码存在耦合的问题

java中用 mybatis 直接执行sql字符串_SQL_04


4.

在对结果集的处理过程中,

需要对结果集的数据类型进行判断,列名也需要手动判断

java中用 mybatis 直接执行sql字符串_java_05


5.

每次需要关闭资源,另外再加上每次连接数据库

会造成资源的浪费

java中用 mybatis 直接执行sql字符串_SQL_06

🚀 总结 🚀

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

JDBC编程问题的解决

那么该如何解决以上的问题呢?

java中用 mybatis 直接执行sql字符串_Java_07

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执行原理

执行原理图

java中用 mybatis 直接执行sql字符串_mybatis_08


🚀【解读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对象通过参数在数据库中进行查询,最后输出查询结果。

java中用 mybatis 直接执行sql字符串_java_09

mybatis的使用示例

以查询java2022库下的student表为例:通过SID查询学生的信息。

java中用 mybatis 直接执行sql字符串_mysql_10

1. 新建maven工程

java中用 mybatis 直接执行sql字符串_Java_11

2. 引入mybatis依赖,还有MySQL相关依赖

java中用 mybatis 直接执行sql字符串_mysql_12

<!--   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。

java中用 mybatis 直接执行sql字符串_java_13


第二步:resources文件夹 创建 mybatisConfig.xml文件 并配置,如下:

java中用 mybatis 直接执行sql字符串_SQL_14

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

java中用 mybatis 直接执行sql字符串_Java_15


java中用 mybatis 直接执行sql字符串_SQL_16

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

java中用 mybatis 直接执行sql字符串_SQL_17

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

6. 创建mapper.xml映射配置文件

java中用 mybatis 直接执行sql字符串_mybatis_18

<?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();
    }
}

运行结果:

java中用 mybatis 直接执行sql字符串_SQL_19


🚀【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