在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框架奠定了坚实的基石。针对接下来的改造任务,我们将主要从以下几个方面着手:
-
摒弃冗余的数据库连接创建环节:在接下来的自主研发框架开发过程中,我们可尝试将连接保存至内存之中,以达到节省系统资源的目的。
-
启用Java类以接收SQL语句:如先前所述,我们在示例中通过一个个独立的Get方法获取字段值,若想要实现数据的打包处理,便需逐一对其赋值。显然,这样的操作过于繁琐,因此在后续的框架编写阶段,我们务必对此加以重视。
-
将连接信息写入配置文件当中:对比于之前的做法------直接在代码内进行编写,未来的框架应当能够以外部配置文件的形式进行属性读取。
-
SQL语句的封装传参化:当前的SQL语句基本上属于硬编码形式,难以进行维护且无法灵活调整。因此,在日后的框架设计中,我们定然会尽力避免此类情况的发生。
敬请各位读者期待后续相关文章。若大家对此专栏有浓厚的兴趣,还望不吝点赞和关注,感谢支持!