Mybatis學習之自定義持久層框架(一)

前言

說起Mybatis,相信大家都不會感到陌生,它是一款優秀的持久層框架,應用於java後端開發中,爲客戶端程序提供訪問數據庫的接口。

我們都知道,JDBC是Java語言中用來規範客戶端程序如何來訪問數據庫的應用程序接口,提供了諸如查詢和更新數據庫中數據的方法。這也就是Mybatis所具備的功能,那既然已經有了JDBC了,爲什麼還要用Mybatis呢?

原因很簡單,因爲單純使用JDBC進行開發會出現效率低下、耗費資源及影響程序拓展性等問題。

JDBC基本用法及問題分析

package com.lwl.test;

import com.lwl.pojo.User;
import com.mysql.jdbc.PreparedStatement;

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

public class JDBCTest {


        public static final String URL = "jdbc:mysql://192.168.2.134:3306/lagou";
        public static final String USER = "root";
        public static final String PASSWORD = "root";

        public static void main(String[] args) throws Exception {
            Connection connection = null;
            PreparedStatement preparedStatement = null;
            ResultSet resultSet = null;
            User user = new User();

            try {
                // 加載數據庫驅動
                Class.forName("com.mysql.jdbc.Driver");
                // 獲取數據庫連接
                connection = DriverManager.getConnection(URL, USER, PASSWORD);
                // 定義sql語句
                String selectSql = "select * from user where username = ?";
                // 獲取預處理statement
                preparedStatement = (PreparedStatement) connection.prepareStatement(selectSql);
                // 設置參數,第一個參數爲sql語句中參數的序號(從1開始),第二個參數爲設置的參數值
                preparedStatement.setString(1, "王麻子");
                // 向數據庫發出sql執行查詢,查詢出結果集
                resultSet = preparedStatement.executeQuery();
                // 遍歷查詢結果集
                while (resultSet.next()) {
                    int id = resultSet.getInt("id");
                    String username = resultSet.getString("username");
                    // 封裝User
                    user.setId(id);
                    user.setUsername(username);
                }
                System.out.println(user);

            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                // 釋放資源
                if (resultSet != null) {
                    try {
                        resultSet.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) {
                        e.printStackTrace();
                    }
                }
            }
        }
}

運行結果

"C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.3\jbr\bin\java.exe" -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:64450,suspend=y,server=n -javaagent:C:\Users\lwl\.IntelliJIdea2019.3\system\captureAgent\debugger-agent.jar -Dfile.encoding=UTF-8 -classpath "C:\Users\lwl\IdeaProjects\Ipersistence_test\target\test-classes;C:\Users\lwl\IdeaProjects\Ipersistence_test\target\classes;D:\repository\com\lwl\Ipersistence\1.0-SNAPSHOT\Ipersistence-1.0-SNAPSHOT.jar;D:\repository\mysql\mysql-connector-java\5.1.17\mysql-connector-java-5.1.17.jar;D:\repository\c3p0\c3p0\0.9.1.2\c3p0-0.9.1.2.jar;D:\repository\log4j\log4j\1.2.12\log4j-1.2.12.jar;D:\repository\junit\junit\4.10\junit-4.10.jar;D:\repository\org\hamcrest\hamcrest-core\1.1\hamcrest-core-1.1.jar;D:\repository\dom4j\dom4j\1.6.1\dom4j-1.6.1.jar;D:\repository\xml-apis\xml-apis\1.0.b2\xml-apis-1.0.b2.jar;D:\repository\jaxen\jaxen\1.1.6\jaxen-1.1.6.jar;C:\Users\lwl\IdeaProjects\Ipersistence\target\classes;C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar" com.lwl.test.JDBCTest
Connected to the target VM, address: '127.0.0.1:64450', transport: 'socket'
OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
User{id=1, username='王麻子'}
Disconnected from the target VM, address: '127.0.0.1:64450', transport: 'socket'

Process finished with exit code 0

問題分析

在這裏插入圖片描述

爲什麼要用Mybatis?

針對JDBC存在的問題,來解釋一下爲什麼要使用Mybatis:

Mybatis使用配置文件加載數據庫配置信息,很好地解決了硬編碼問題。
對於創建和釋放數據庫連接等步驟,Mybatis直接使用連接池進行解決。
針對“sql語句、設置參數及獲取結果集參數均存在硬編碼”的問題,Mybatis也使用配置文件解決了該問題。(這裏一般不和數據庫配置信息在同一個配置文件中進行配置,因爲數據庫配置信息在一個項目中只配置一次,但sql語句等經常會發生變化)。
對於結果集的封裝操作,Mybatis使用反射和內省進行解決。
以上幾點說明了用Mybatis的好處,不過Mybatis其實也只是對JDBC進行了封裝,說到底原理還是和JDBC一樣,只是Mybatis用起來更加高效率。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章