MyBatis手寫框架(一)- 原始 JDBC

mybatis

描述

我們從最原始的 JDBC 代碼開始,分階段來實現(xiàn)一個手寫的 MyBatis 框架,在每個階段我們都會解決一些問題,最終寫出的框架和 MyBatis 的整體構(gòu)架思路相約。階段大致如下:

  • 最原始 JDBC 代碼的實現(xiàn)
  • 解決硬編碼問題
  • 抽取方法,用面向過程的思路去搭建框架
  • 用面向?qū)ο蟮乃悸啡ブ貥?gòu)工程

原始 JDBC 實現(xiàn)

實現(xiàn)步驟如下:

  1. pom.xml
  2. 創(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ù)庫代碼,存在以下的問題:

  1. 硬編碼配置信息,比如:連接的URL,用戶名及密碼,DriverClassName等;
  2. 打開及關(guān)閉連接,對于每個業(yè)務(wù)而言都是一樣的,會導(dǎo)致大量重復(fù)代碼;
  3. 單獨打開 Connection,資源消耗較大,應(yīng)改為使用數(shù)據(jù)源連接池的方式;
  4. 處理輸入?yún)?shù)及輸出結(jié)果和具體的業(yè)務(wù)高度相關(guān)。
碼字不易,感謝點贊打賞
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容