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

在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驱动

驱动如下:

java 复制代码
    <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>

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

数据库

java 复制代码
CREATE DATABASE test_ob

数据表

java 复制代码
CREATE TABLE `user` (
  `id` int(11) DEFAULT NULL,
  `name` varchar(120) DEFAULT NULL,
  `age` int(11) DEFAULT NULL
)

添加数据

java 复制代码
insert into `user`(`id`,`name`,`age`) values(1,'王富贵',18)

第三步,编写jdbc程序

java 复制代码
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();
            }
        }
    }
}

加载驱动

java 复制代码
Class.forName("com.mysql.jdbc.Driver");

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

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

连接数据库

java 复制代码
 conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test_ob", "rootmsy", "123");

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

创建Statement对象

java 复制代码
   stmt = conn.createStatement();

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

执行查询

java 复制代码
     rs = stmt.executeQuery("SELECT * FROM user");

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

处理结果集

java 复制代码
 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语句基本上属于硬编码形式,难以进行维护且无法灵活调整。因此,在日后的框架设计中,我们定然会尽力避免此类情况的发生。

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

相关推荐
sg_knight3 小时前
Spring 框架中的 SseEmitter 使用详解
java·spring boot·后端·spring·spring cloud·sse·sseemitter
hadage2335 小时前
--- redis 常见问题 ---
数据库·redis·mybatis
喵个咪6 小时前
初学者入门:用 go-kratos-admin + protoc-gen-typescript-http 快速搭建企业级 Admin 系统
后端·typescript·go
_院长大人_7 小时前
MyBatis Plus 分批查询优化实战:优雅地解决 IN 参数过多问题(实操)
java·mybatis
用户21411832636027 小时前
手把手教你用Claude制作专属PPT生成器-从模板学习到自动生成全流程实战
后端
计算机毕设匠心工作室9 小时前
【python大数据毕设实战】全面皮肤病症状数据可视化分析系统、Hadoop、计算机毕业设计、包括数据爬取、数据分析、数据可视化、机器学习、实战教学
后端·python·mysql
摆烂工程师9 小时前
2025年12月最新的 Google AI One Pro 1年会员教育认证通关指南
前端·后端·ai编程
qq_12498707539 小时前
基于SpringBoot+vue的小黄蜂外卖平台(源码+论文+部署+安装)
java·开发语言·vue.js·spring boot·后端·mysql·毕业设计
代码与野兽10 小时前
AI交易,怎么让LLM自己挑选数据源?
前端·javascript·后端
天天摸鱼的java工程师10 小时前
JDK 25 到底更新了什么?这篇全景式解读带你全面掌握
java·后端