MyBatis 從認識到環境搭建

原始 jdbc 是什麼樣的 ?

簡單的梳理一下咱們使用 JDBC 的流程:① 引入相關數據庫驅動 Jar 包 ② 建立一個數據庫鏈接類java

在這個類中包括:數據庫驅動的加載、數據庫鏈接的配置、鏈接對象的獲取、以及釋放關閉,以及具體的SQL以及其執行語句,下面是一個mysql

下面代碼是 JDBC最原始的方式,沒有通過任何優化和封裝,功能是查詢student表中的全部記錄spring

package cn.ideal.jdbc;

import cn.ideal.domain.Student;

import java.sql.*;

public class JdbcDemo {
    public static void main(String[] args) {

        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;

        try {
            //註冊驅動
            Class.forName("com.mysql.jdbc.Driver");
            //獲取與數據庫的鏈接對象
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1", "root", "root99");
            //定義sql語句
            String sql = "SELECT * FROM student";
            //獲取執行sql語句的對象statement
            statement = connection.createStatement();
            //執行sql語句,獲取結果集
            resultSet = statement.executeQuery(sql);

            //遍歷獲取到的結果集
            while (resultSet.next()) {
                int id = resultSet.getInt(1);
                String name = resultSet.getString(2);
                Double score = resultSet.getDouble(3);

                Student student = new Student();
                student.setId(id);
                student.setName(name);
                student.setScore(score);

                System.out.println(student.toString());
            }

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            //釋放資源,後調用的先釋放
            if (resultSet != null) {
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            if (statement != null) {
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

經過這段代碼咱們能夠分析到:sql

  • ① 代碼中,數據庫驅動名稱、連接地址、帳號密碼等,所有被寫死到程序中,也就是說當你須要修改某些值時,你必需要修改源代碼,這也就是咱們所謂的 「硬編碼」數據庫

    • 舉個例子:若是咱們更換了數據庫 Eg:MySQL -> Oracle ,或者更換了服務器,所以地址發生了變化,又或者數據庫密碼被修改,咱們就都須要回到源代碼中進行修改,從新編譯、打包上線
  • ② 數據庫鏈接須要頻繁的建立和釋放,系統資源浪費,且影響性性能(數據庫鏈接池技術解決)

這段代碼是使用了 preparedStatement 預處理對象進行替代其父類 Statement 對象,這也是咱們只考慮原始 JDBC 狀況下 通常會選用的,那麼它又有什麼問題呢?apache

//定義sql
String sql = "SELECT * FROM user WHERE username = ? AND password = ?";
//獲取執行sql的對象
preparedStatement = connection.prepareStatement(sql);
//給?賦值
preparedStatement.setString(1, username);
preparedStatement.setString(2, password);

//執行查詢
resultSet = preparedStatement.executeQuery();
  • ③ 當使用 preparedStatement 設置佔位符語句,而且對其進行參數傳遞時都是 「硬編碼「 由於 sql 語句的 where 條件可能會變化,若是修改 sql 還須要,修改源代碼

    還有一種狀況是這樣的:服務器

//遍歷獲取到的結果集
while (resultSet.next()) {
    int id = resultSet.getInt("id");
    String name = resultSet.getString("name");
    Double score = resultSet.getDouble("score");

    Student student = new Student();
    student.setId(id);
    student.setName(name);
    student.setScore(score);

}
  • ④ 若是咱們在 ResultSet 中遍歷結果集時若是咱們使用 getInt 等這種方法,參數爲字段名,當數據庫對應表字段出現改變時,源代碼再一次須要被修改

以前咱們必定程度上的便捷咱們的開發,可能有使用過 Spring 的 JdbcTemplate 或者 Apache 的 DBUtils ,它們都是對 JDBC 的簡單封裝,只能算做工具類,不能算做一個完整的框架, 而咱們下面要講的 Mybatis 則是一個可能解決這些問題的框架微信

MyBatis 概述

MyBatis 是一款優秀的持久層框架,它支持定製化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎全部的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可使用簡單的 XML 或註解來配置和映射原生信息,將接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java對象)映射成數據庫中的記錄 ——百度百科

一、MyBatis 能夠將 sql 語句配置在 XML 中,這樣解決了 sql 語句寫在 Java類中的 "硬編碼" 問題mybatis

二、經過輸入參數映射機制,將參數靈活的配置起來,解決了在 Java 類中手工配置的問題app

三、經過輸出映射機制, 結果集的檢索自動映射成相應的 Java對象,避免了 JDBC 中對結果集的手工檢索

四、這種映射機制實際上使用了 ORM 的思想

  • ORM (Object Relational Mapping) 對象關係映射
  • 簡單理解:數據庫表和實體類中的屬性進行對應,咱們能夠操做實體類就實現操做數據庫表

MyBatis 的環境配置(IDEA)

(一) 建立 Maven項目

打開 IDEA ,建立一個 Maven 項目,以下圖所示

修改 GroupId 和 ArtifactId 的值

  • GroupID是項目組織惟一的標識符,實際對應JAVA的包的結構,是main目錄裏java的目錄結構

    • 通常以域名倒序填寫
  • ArtifactID就是項目的惟一的標識符,實際對應項目的名稱,就是項目根目錄的名稱

設置其地址

(二) 修改 pom 導入MyBatis座標

選擇打包方式爲 jar包: <packaging>jar</packaging>

下面咱們導入了 mybatis、mysql、log4j (日誌)、junit (單元測試) 的依賴

<?xml version="1.0" encoding="UTF-8"?>
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>cn.ideal</groupId>
    <artifactId>code_01_EnvironmentSetup</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!-- 打包方式 -->
    <packaging>jar</packaging>

    <!-- 對應依賴 -->
    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.12</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
        </dependency>
    </dependencies>

</project>

(三) 建立實體類

package cn.ideal.domain;

import java.io.Serializable;
import java.util.Date;

public class User implements Serializable {
    private Integer id;
    private String username;
    private Integer telephone;
    private Date birthday;
    private String gender;
    private String address;

    ...爲節省長度,省略其對應 get set方法,請你們自行補充

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", telephone=" + telephone +
                ", birthday=" + birthday +
                ", gender='" + gender + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}

(四) 建立mapper接口

mapper 與咱們以前學習的 dao 的意義是一致的,只是名稱上的不一樣,對應的 mapper 寫爲 dao 也是能夠的

package cn.ideal.mapper;

import cn.ideal.domain.User;
import java.util.List;

public interface UserMapper {
    /**
     * 查詢全部用戶信息
     * @return
     */
    List<User> findAllUserInfo();
}

(五) 編寫數據庫鏈接池配置文件(主配置文件)

在resources下建立一個名爲 SqlMapConfig.xml 的文件,這也就是咱們的主配置文件

而數據庫鏈接池的配置,是配置環境中重要的一點

  • ① 因爲其配置文件爲 xml 格式,咱們須要在頭部指定 xml 的版本和編碼信息
<?xml version="1.0" encoding="UTF-8"?>
  • ② 爲了保證 MyBatis 在讀取該 xml 文件時,配置文件中的每個標籤對,以及標籤對中的參數值配置符合標準,引入 DTD 規範約束
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">

接下來就是配置正文,

  • <environments></environments>標籤中的 default 值與 <environment></<environment> 中的 id 值務必保持一致
  • <transactionManager></transactionManager>配置 Mybatis 的事務控制類型
  • <dataSource></<dataSource> 配置數據庫鏈接信息

    • <property></property> 配置具體的值
  • 在底部的 <mappers></mappers>標籤中指定了映射配置文件的位置,也就是說咱們 SQL相關的語句都在這個指定的配置文件中,而這裏咱們指定了它的路徑

詳細代碼:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- mybatis 主配置文件 -->
<configuration>
    <!-- 配置環境,和spring整合後 environments配置將會被廢除 -->
    <environments default="development">
        <environment id="development">
            <!-- 使用JDBC事務管理 -->
            <transactionManager type="JDBC"></transactionManager>
            <!-- 數據庫鏈接池 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/ideal_mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="=root99r"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 指定映射配置文件的位置 -->
    <mappers>
        <mapper resource="cn.ideal.dao/UserMapper.xml"/>
    </mappers>
</configuration>

(六) SQL映射配置文件

爲了解決 原生 JDBC 的一些不足,在 MyBatis 中,SQL語句不會直接出如今 Java類中,它將幾乎全部的 SQL 語句放在 配置文件中,他會在適當的狀況下,加載這個配置文件,完成必定的操做

首先仍然是,xml的版本和編碼格式,而後引入DTD約束

而後在 <mapper></mapper> 標籤中編寫咱們具體的配置

  • 其中的 namespace屬性,就是對SQL進行分類化管理,將實現不一樣業務的SQL分開,這裏咱們對其取值就是咱們以前mapper接口的全限定類
  • 特別注意:建立包時,咱們建立的是一個三級目錄,而建立配置文件的目錄的時候,直接建立 cn.ideal.mapper 是一級目錄,咱們須要一層一層的建立,保證其也爲三級目錄
  • <mapper></mapper>標籤中建立一個 <select></select> 標籤 其中 屬性 id 的值爲mapper接口的方法名

    • parameterType、parameterMap、resultType、resultClass、resultMap分別表明
    • 輸入參數類型、輸入參數集合、結果類型、結果類、結果集合
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.ideal.mapper.UserMapper">
    <select id="findAllUserInfo" resultType="cn.ideal.domain.User">
        select * from  user
    </select>
</mapper>

到這裏Mybatis的簡單認識以及環境的搭建就說完了,篇幅問題,關於Mybatis 分紅幾篇來說,感謝你們的支持

結尾

若是文章中有什麼不足,或者錯誤的地方,歡迎你們留言分享想法,感謝朋友們的支持!

若是能幫到你的話,那就來關注我吧!若是您更喜歡微信文章的閱讀方式,能夠關注個人公衆號

在這裏的咱們素不相識,卻都在爲了本身的夢而努力 ❤

一個堅持推送原創開發技術文章的公衆號:理想二旬不止

相關文章
相關標籤/搜索