【手写MyBatis】(01)- JDBC与手写思路分析

文章目录

    • 分析原生JDBC存在的问题
      • JDBC示例代码
      • JDBC存在的问题
    • 手写框架思路分析
      • 配置文件的编写
      • 加载配置文件
      • 执行SqlSession接口

分析原生JDBC存在的问题

JDBC示例代码

一个Select语句共需要8步操作:

依赖

<dependencies>
    
    <dependency>
        <groupId>junitgroupId>
        <artifactId>junitartifactId>
        <version>4.12version>
    dependency>
    
    <dependency>
        <groupId>mysqlgroupId>
        <artifactId>mysql-connector-javaartifactId>
        <version>5.1.35version>
    dependency>
dependencies>

功能代码

public class JdbcTest {

    @Test
    public void selectDataTest() {
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet rs = null;
        try {
            // 1、加载数据库驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 2、通过驱动管理类获取数据库链接connection = DriverManager
            connection = DriverManager.getConnection("jdbc:mysql://192.168.152.100:3306/ssm?characterEncoding=utf-8",
                    "root", "root");
            // 3、定义sql语句 ?表示占位符
            String sql = "select * from user where username = ?";
            // 4、获取预处理 statement
            preparedStatement = connection.prepareStatement(sql);
            // 5、设置参数,第一个参数为 sql 语句中参数的序号(从 1 开始),第二个参数为设置的
            preparedStatement.setString(1, "jeffosmond");
            // 6、向数据库发出 sql 执行查询,查询出结果集
            rs = preparedStatement.executeQuery();
            // 7、遍历查询结果集
            while (rs.next()) {
                System.out.println(rs.getString("id") + " " + rs.getString("username"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 8、释放资源
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (preparedStatement != null) {
                try {
                    preparedStatement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

JDBC存在的问题

创建连接存在硬编码

  • 使用配置文件来解决硬编码问题
  • 连接创建应该全局只创建一次就可以
  • 他需要使用一个单独的配置文件(1个全局的配置文件)来配置

执行statement存在硬编码(sql语句、参数信息、返回值信息)

  • 使用配置文件来解决硬编码的问题
  • 不同的业务模块需要不同的配置文件来配置(N个映射文件)

代码太臃肿

  • 尽量给使用者(程序员)方便
  • 程序员只需要调用类似与sqlsession这样的接口方法就可以实现CRUD功能。不需要编写太多代码.例如:
    • 查询接口方法:
    • Object selectOne(String statemendId,Object paramObj)
    • List selectList(String statemendId,Object paramObj)

手写框架思路分析

配置文件的编写

配置文件的编写(直接借鉴mybatis的配置文件写法)

一共有两部分配置文件:

  • 全局配置文件(全局配置文件会去加载映射文件)
  • 映射文件

将配置文件分为两类,主要的目的是为了便于维护。

加载配置文件

【手写MyBatis】(01)- JDBC与手写思路分析_第1张图片
加载配置文件共5步:

  • 指定全局配置文件的路径
  • 获取InputStream
  • 创建Document对象
  • 按照mybatis的标签语义去解析Document对象(这里面还包含映射文件的解析,但是那是另一个流程)
    • 映射文件最终也会通过对象去封装解析后的信息(多个MappedStatement对象)
      • SqlSource
      • SqlNode
      • BoundSql
  • 使用一个对象将整个配置文件的信息进行封装Configuration对象

执行SqlSession接口

	Object selectOne(String statemendId,Object paramObj)

底层依然需要使用JDBC代码完成处理

  1. 获取连接(在全局配置文件中,配置数据源),此处就可以通过配置的数据源连接池获取连接
  2. 获取sql语句(编写在映射文件中的)
  3. 创建Statement对象
  4. 设置参数(参数值是通过接口传入的。入参信息,都是通过解析sql语句获取到的)
  5. 执行statement
  6. 处理结果集(要映射的结果类型是在映射文件中配置的)

你可能感兴趣的:(MyBatis,笔记)