【Mybatis】我抄袭了Mybatis,手写一套MyMybatis框架:使用JDBC连接数据库

2023-12-20 12:27:58

在Java开发中,Mybatis是一个非常流行的持久层框架,它消除了几乎所有的JDBC代码和参数的手动设置以及结果集的检索。Mybatis可以使用简单的XML或注解进行配置,并将接口和Java的POJOs(Plain Old Java Objects)映射成数据库中的记录。

然而,你有没有想过,如果没有Mybatis,我们应该如何手动实现这些功能呢?在这篇专栏中,我将尝试"抄袭" Mybatis,手写一套名为MyMybatis的框架,让我们一起深入理解Mybatis背后的原理和实现。

首先,我们需要理解的是,所有的数据库操作都需要通过JDBC来进行。JDBC(Java Database Connectivity)是Java对数据库进行操作的一套标准API。然而,直接使用JDBC进行数据库操作会有很多繁琐的代码,这也是Mybatis等ORM框架出现的原因。在我们的MyMybatis框架中,我们也将使用JDBC作为底层的数据库操作工具。

万里之行始于足下,我们先来看一下怎么使用JDBC来连接Mysql。

首先我们要准备好的环境有:
一个搭建好的mysql:Linux安装Mysql(图文解说详细版,安装包tar包版)
一套java环境:Windows安装Java环境(OracleJDK)

第一步,新建一个maven项目

在这里插入图片描述

第二步,导入mysql的驱动

打开刚刚创建好的maven项目的pom文件导入mysql驱动

在这里插入图片描述

驱动如下:

    <dependencies>
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.49</version>
        </dependency>
    </dependencies>

第三步,创建数据库和数据表

数据库

CREATE DATABASE test_ob

数据表

CREATE TABLE `user` (
  `id` int(11) DEFAULT NULL,
  `name` varchar(120) DEFAULT NULL,
  `age` int(11) DEFAULT NULL
)

添加数据

insert into `user`(`id`,`name`,`age`) values(1,'王富贵',18)

第三步,编写jdbc程序

package com.masiyi;


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class MyJdbc {
    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;

        try {
            // 加载驱动
            Class.forName("com.mysql.jdbc.Driver");

            // 连接数据库
            conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test_ob", "rootmsy", "123");

            // 创建Statement对象
            stmt = conn.createStatement();

            // 执行查询
            rs = stmt.executeQuery("SELECT * FROM user");

            // 处理结果集
            while (rs.next()) {
                System.out.println("ID: " + rs.getInt("id"));
                System.out.println("Username: " + rs.getString("name"));
                System.out.println("Phone: " + rs.getInt("age"));
                // 其他字段...
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 关闭资源
            try {
                if (rs != null) {
                    rs.close();
                }
                if (stmt != null) {
                    stmt.close();
                }
                if (conn != null) {
                    conn.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

加载驱动

Class.forName("com.mysql.jdbc.Driver");

目的是加载并注册JDBC驱动程序,它是为了将特定数据库的JDBC驱动程序加载到内存中,并向后面的DriverManager注册该驱动,以便能够与特定数据库建立连接。

加载驱动类后,驱动程序会执行静态代码块,其中通常会调用DriverManager的registerDriver方法来注册自己,使得后续的JDBC连接可以使用这个驱动来连接MySQL数据库。其实这里可以不用显式地去写这行代码,为什么可以这样,如果大家感兴趣,我们后面可以深挖一下jdbc的DriverManager源码。这里不做介绍。

在这里插入图片描述

连接数据库

 conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test_ob", "rootmsy", "123");

里面填三个参数:url,user,password就是我们mysql的地址,用户名和密码,这里面的所有引用的类都是java.sql包下面的。通过这个方法我们就获得了一个mysql的连接。后面的操作都是基于该连接上去操作。

在这里插入图片描述

创建Statement对象

   stmt = conn.createStatement();

Statement是JDBC中的一个非常重要接口,用于执行SQL语句并返回结果。

执行查询

     rs = stmt.executeQuery("SELECT * FROM user");

之后我们就可以通过直接执行sql了,这个时候会返回一个ResultSet类,我们使用ResultSet类来接收这个sql返回回来的数据

处理结果集

 while (rs.next()) {
                System.out.println("ID: " + rs.getInt("id"));
                System.out.println("Username: " + rs.getString("name"));
                System.out.println("Phone: " + rs.getInt("age"));
                // 其他字段...
            }

使用 while (rs.next())循环取,如果没有数据循环就会退出,ResultSet里面有很多的get方法,根据需要去取其中的某个字段就行了。

在这里插入图片描述

最后根据谁后创建先关闭谁的规律关闭连接即可:

在这里插入图片描述

最后执行就可以拿到sql执行的结果了

在这里插入图片描述

这篇文章我们展示了利用最为基础的JDBC技术连接MySQL数据库的方式,然而在实际的项目开发过程中,这种做法几乎无人采用,取而代之的是框架对这些繁复操作的高度封装。

然而,此举恰恰为我们撰写自定义MyBatis框架奠定了坚实的基石。针对接下来的改造任务,我们将主要从以下几个方面着手:

  1. 摒弃冗余的数据库连接创建环节:在接下来的自主研发框架开发过程中,我们可尝试将连接保存至内存之中,以达到节省系统资源的目的。

  2. 启用Java类以接收SQL语句:如先前所述,我们在示例中通过一个个独立的Get方法获取字段值,若想要实现数据的打包处理,便需逐一对其赋值。显然,这样的操作过于繁琐,因此在后续的框架编写阶段,我们务必对此加以重视。

  3. 将连接信息写入配置文件当中:对比于之前的做法——直接在代码内进行编写,未来的框架应当能够以外部配置文件的形式进行属性读取。

  4. SQL语句的封装传参化:当前的SQL语句基本上属于硬编码形式,难以进行维护且无法灵活调整。因此,在日后的框架设计中,我们定然会尽力避免此类情况的发生。

敬请各位读者期待后续相关文章。若大家对此专栏有浓厚的兴趣,还望不吝点赞和关注,感谢支持!

在这里插入图片描述

另外如果对Elastic Search感兴趣的话,推荐一下我的专栏,这篇专栏介绍了Elasticsearch的Restful API的入门指南。学习如何使用API进行索引、搜索和分析,包括创建索引、定义映射、添加文档、执行查询等。通过实例和代码片段,快速上手Elasticsearch的Restful API,构建强大的搜索功能。感谢大家支持:

Elastic Search的RestFul API入门

在这里插入图片描述

文章来源:https://blog.csdn.net/csdnerM/article/details/134277279
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。