
mybatis
描述
我們從最原始的 JDBC 代碼開始,分階段來實現(xiàn)一個手寫的 MyBatis 框架,在每個階段我們都會解決一些問題,最終寫出的框架和 MyBatis 的整體構(gòu)架思路相約。階段大致如下:
- 最原始 JDBC 代碼的實現(xiàn)
- 解決硬編碼問題
- 抽取方法,用面向過程的思路去搭建框架
- 用面向?qū)ο蟮乃悸啡ブ貥?gòu)工程
原始 JDBC 實現(xiàn)
實現(xiàn)步驟如下:
- pom.xml
- 創(chuàng)建測試類
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.edugroup</groupId>
<artifactId>mybatis-source-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<!-- junit單元測試依賴 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--<dependency>
<groupId>com.kkb</groupId>
<artifactId>mybatis-framework-16</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>-->
<!-- mysql依賴 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.35</version>
</dependency>
<!-- DOM4J依賴 -->
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<!-- dbcp連接池依賴 -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<!-- OGNL表達(dá)式的依賴 -->
<dependency>
<groupId>ognl</groupId>
<artifactId>ognl</artifactId>
<version>2.7.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
package com.edugroup.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.junit.Test;
public class TestJDBC {
@Test
public void testSelectUser() {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet rs = null;
try {
// 加載數(shù)據(jù)庫驅(qū)動
Class.forName("com.mysql.jdbc.Driver");
// 通過驅(qū)動管理類獲取數(shù)據(jù)庫鏈接connection = DriverManager
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/testdb?characterEncoding=utf-8",
"root", "123456");
String sql = "select * from user_info where name = ?";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, "tester");
// 向數(shù)據(jù)庫發(fā)出 sql 執(zhí)行查詢,查詢出結(jié)果集
rs = preparedStatement.executeQuery();
// 遍歷查詢結(jié)果集
while (rs.next()) {
System.out.println(rs.getString("id") + " " + rs.getString("name"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 釋放資源
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) {
}
}
}
}
}
原始 JDBC 實現(xiàn)存在的問題
上面的連接數(shù)據(jù)庫代碼,存在以下的問題:
- 硬編碼配置信息,比如:連接的URL,用戶名及密碼,DriverClassName等;
- 打開及關(guān)閉連接,對于每個業(yè)務(wù)而言都是一樣的,會導(dǎo)致大量重復(fù)代碼;
- 單獨打開 Connection,資源消耗較大,應(yīng)改為使用數(shù)據(jù)源連接池的方式;
- 處理輸入?yún)?shù)及輸出結(jié)果和具體的業(yè)務(wù)高度相關(guān)。

碼字不易,感謝點贊打賞