最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解如何使用MyBatis簡化JDBC開發(fā)

 更新時間:2023年01月29日 10:47:26   作者:橙?子_  
JavaEE?企業(yè)級?Java?項目中的經(jīng)典三層架構(gòu)為表現(xiàn)層,業(yè)務層和持久層.MyBatis?對?JDBC?代碼進行了封裝,作為一款優(yōu)秀的持久層框架,專門用于簡化JDBC開發(fā).本文主要介紹一下如何使用MyBatis簡化JDBC開發(fā),需要的可以參考一下

1. 前言

JavaEE 企業(yè)級 Java 項目中的經(jīng)典三層架構(gòu)為表現(xiàn)層,業(yè)務層和持久層,使用Java 代碼操作數(shù)據(jù)庫屬于持久層內(nèi)容,而 MyBatis 對 JDBC 代碼進行了封裝,作為一款優(yōu)秀的持久層框架,專門用于簡化JDBC開發(fā)。

MyBatis 支持自定義 SQL,存儲過程以及高級映射。MyBatis 免除了幾乎所有的 JDBC 代碼以及設置參數(shù)和獲取結(jié)果集的工作。MyBatis 可以通過簡單的 XML 或注解來配置和映射原始類型,接口和 Java POJO(Plain Old Java Objects,普通老式 Java 對象)為數(shù)據(jù)庫中的記錄。

MyBatis 本是 Apache 的一個開源項目 iBatis, 2010 年這個項目由 Apache software foundation 遷移到了google code,并且改名為 MyBatis 。2013 年 11 月遷移到 Github。

小tips:在學習一門全新的技術(shù)前,盡量做到從頭到尾通讀官網(wǎng)信息,MyBatis 的中文版官網(wǎng)相比于其他的網(wǎng)站還是非常友好的,建議首先閱讀官網(wǎng)信息。

什么是框架呢?

框架的概念其實不難理解,這里的框架是指一個半成品的軟件,是一套可重用,通用的,軟件基礎代碼模型,在框架基礎之上構(gòu)建項目使編碼更加高效,規(guī)范,通用并且擴展性強。

2. JDBC 存在的缺點

之前使用 JDBC 代碼操作數(shù)據(jù)庫時,我們一般分為注冊驅(qū)動,獲取連接,定義sql,設置參數(shù)值,獲取 sql 執(zhí)行對象,執(zhí)行 sql,處理返回數(shù)據(jù),釋放資源等幾個步驟。下面使用一個簡單的例子分析 JDBC 究竟存在哪些缺點。

需求:使用 Java 代碼操作數(shù)據(jù)庫,查詢學生表中所有男生信息,并且將其封裝為對象,最終存放在集合中。

public class JDBCDemo {

    public static void main(String[] args) throws Exception {
        //1. 注冊驅(qū)動
        Class.forName("com.mysql.jdbc.Driver");
        //2. 獲取連接
        String url = "jdbc:mysql://localhost:3306/blog?useSSL=false";
        String username = "root";
        String ppassword = "abc123";//密碼
        Connection conn = DriverManager.getConnection(url, username, password);
        //接收輸入的查詢條件
        String gender = "男";
        //3. 定義sql
        String sql = "select * from student where gender=?";
        //4. 獲取sql執(zhí)行對象
        Statement stmt = conn.createStatement();
        //設置參數(shù)的值
        pstmt.setString(1,gender);
        //5. 執(zhí)行sql
        ResultSet rs = stmt.executeQuery(sql);
        //6. 處理結(jié)果
        //遍歷結(jié)果集,獲取數(shù)據(jù),封裝為對象,裝入集合
        Student s = null;
        List<Student> students = new ArrayList<>();
        while (rs.next()) {
            s = new Student();
            int id = rs.getInt(1);
            String name = rs.getString(2);
            String gender = rs.getString(3);

            s.setId(id);
            s.setName(name);
            s.setGender(gender);

            students.add(s);
        }
        System.out.println(students);
        //7. 釋放資源
        rs.close();
        stmt.close();
        conn.close();
    }
}

上面是一段簡單標準的使用 JDBC 操作數(shù)據(jù)庫的代碼,分析代碼我們不難看出,在注冊驅(qū)動,獲取連接和定義 sql 部分,代碼中出現(xiàn)了大量的字符串信息,這些字符串信息非常不利于后期的維護,例如后期修改要連接的數(shù)據(jù)庫等。我們把這個問題稱為 JDBC 的硬編碼問題。示例,存在硬編碼問題的代碼:

//1. 注冊驅(qū)動
Class.forName("com.mysql.jdbc.Driver");
//2. 獲取連接
String url = "jdbc:mysql://localhost:3306/blog?useSSL=false";
String username = "root";
String ppassword = "abc123";//密碼
Connection conn = DriverManager.getConnection(url, username, password);
//接收輸入的查詢條件
String gender = "男";
//3. 定義sql
String sql = "select * from student where gender=?";

在手動設置參數(shù),封住結(jié)果集對象部分,代碼中出現(xiàn)了大量的相似代碼,例如將來的參數(shù)較多時,手動設置參數(shù)也是一件麻煩的事情等,這個問題被稱為 JDBC 的操作繁瑣問題。示例,存在操作繁瑣問題的代碼:

//設置參數(shù)的值
pstmt.setString(1,gender);
//5. 執(zhí)行sql
ResultSet rs = stmt.executeQuery(sql);
//6. 處理結(jié)果
//遍歷結(jié)果集,獲取數(shù)據(jù),封裝為對象,裝入集合
Student s = null;
List<Student> students = new ArrayList<>();
while (rs.next()) {
    s = new Student();
    int id = rs.getInt(1);
    String name = rs.getString(2);
    String gender = rs.getS  
    s.setId(id);
    s.setName(name);
    s.setGender  
    students.add(s);
}

JDBC的缺點,如下圖:

3. MyBatis 優(yōu)化

JDBC 作為基礎性的代碼,固然會出現(xiàn)很多操作繁瑣等的問題,那么這個問題怎么解決呢?前面說使用 MyBatis 簡化 JDBC 開發(fā),那么具體是怎么避免這些問題的呢?

首先,要解決操作繁瑣的問題,只需要讓JDBC中手動設置參數(shù)和手動封裝結(jié)果集對象的操作由程序自動封裝完成。例如下面一行代碼就解決了 JDBC 封裝結(jié)果集對象操作繁瑣的問題:

List<Student> students = sqlSession.selectList("test.selectAll"); //參數(shù)是一個字符串,該字符串必須是映射配置文件的namespace.id

MyBatis 將注冊驅(qū)動,獲取連接,定義sql 的語句從 Java 代碼中抽離,并單獨寫到配置文件中,解決了硬編碼的問題。例如:在 mybatis-cinfig.xml 配置文件中定義數(shù)據(jù)庫連接信息。

4. MyBatis 快速入門

每一個初學者,在學習一門全新的技術(shù)時,都要在實戰(zhàn)練習中掌握其使用方法。今天,我們使用一個小小的案例來入門 MyBatis,學會 MyBatis 的基本使用。

需求:查詢數(shù)據(jù)庫中 student 表中所有的數(shù)據(jù)。

我們使用以下 5 個步驟來解決這個問題:

1.創(chuàng)建 student 表,添加數(shù)據(jù)

2.創(chuàng)建新項目,創(chuàng)建Maven模塊,導入坐標

3.編寫MyBatis核心配置文件

4.編寫sql映射文件

5.編寫代碼

  • 定義 POJO實體類
  • 加載核心配置文件,獲取 SqlSessionFactory 對象
  • 獲取 SqlSession 對象,執(zhí)行 sql 語句
  • 釋放資源

接下來,我們按照上面的步驟講解需求中的問題,學習 MyBatis 的基本使用。下面為詳細過程和代碼演示,整個過程的分析參考文末的過程剖析。

第一步:創(chuàng)建 student 表,添加數(shù)據(jù)

drop table if exists student;

create table student(
	id int primary key auto_increment,
	name varchar(10),
	gender char(1)
);

insert into student(name,gender) values
('張三','男'),
('李四','女'),
('王五','男');

第二步

創(chuàng)建空項目,創(chuàng)建 Maven 模塊,項目結(jié)構(gòu)如下圖:

在創(chuàng)建好的模塊中的 pom.xml 配置文件中添加依賴坐標,點擊刷新使坐標信息生效:

<dependencies>
    <!--mybatis 依賴-->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.5</version>
    </dependency>

    <!--mysql 驅(qū)動-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.46</version>
    </dependency>

    <!--junit 單元測試-->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13</version>
        <scope>test</scope>
    </dependency>

    <!-- 添加slf4j日志api -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.20</version>
    </dependency>
    <!-- 添加logback-classic依賴 -->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.3</version>
    </dependency>
    <!-- 添加logback-core依賴 -->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-core</artifactId>
        <version>1.2.3</version>
    </dependency>
</dependencies>

在 resources 目錄下創(chuàng)建 logback 的配置文件 logback.xml,用于查看日志信息:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!--
        CONSOLE :表示當前的日志信息是可以輸出到控制臺的。
    -->
    <appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>[%level] %blue(%d{HH:mm:ss.SSS}) %cyan([%thread]) %boldGreen(%logger{15}) - %msg %n</pattern>
        </encoder>
    </appender>

    <logger name="org.chengzi" level="DEBUG" additivity="false">
        <appender-ref ref="Console"/>
    </logger>


    <!--
      level:用來設置打印級別,大小寫無關(guān):TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF, 默認debug
      <root>可以包含零個或多個<appender-ref>元素,標識這個輸出位置將會被本日志級別控制。
      -->
    <root level="DEBUG">
        <appender-ref ref="Console"/>
    </root>
</configuration>

第三步:編寫 MyBatis 核心配置文件

編寫 MyBatis 核心配置文件,可以用于替換連接信息,解決了 JDBC 硬編碼的問題。在模塊下的 resources 目錄下創(chuàng)建 MyBatis 的配置文件 mybatis-config.xml,內(nèi)容如下:

<?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">
<configuration>

    <typeAliases>
        <package name="org.chengzi.pojo"/>
    </typeAliases>
    
    <!--
    environments:配置數(shù)據(jù)庫連接環(huán)境信息??梢耘渲枚鄠€environment,通過default屬性切換不同的environment
    -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!--數(shù)據(jù)庫連接信息-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/blog?useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="abc123"/>
            </dataSource>
        </environment>

        <environment id="test">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!--數(shù)據(jù)庫連接信息-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/blog?useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="abc123"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
       <!--加載sql映射文件-->
       <mapper resource="StudentMapper.xml"/>
    </mappers>
</configuration>

這里使用了<typeAliases>標簽以后,在 sql 映射配置文件中的 resultType 的值可以直接設置為 Student ,而不是:

第四步:編寫 sql 映射文件

編寫 sql 映射配置文件,用于統(tǒng)一管理 sql 語句,同樣也是為了解決 JDBC 硬編碼的問題。在模塊的 resources 目錄下創(chuàng)建映射配置文件 StudentMapper.xml ,內(nèi)容如下:

<?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="test">
    <select id="selectAll" resultType="org.chengzi.pojo.User">
        select * from student;
    </select>
</mapper>

第五步:編寫代碼

在編寫代碼時,大概可以分為四步。首先是定義 POJO 類,在指定的包下創(chuàng)建 Student 類,如下:

package org.chengzi.pojo;

public class Student {
    private int id;
    private String name;
    private String gender;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", gender='" + gender + '\'' +
                '}';
    }
}

接下來在 org.chengzi 包下創(chuàng)建 MyBatisDemo 測試類,用于加載核心配置文件,獲取SqlSessionFactory 對象,獲取 SQLSession 對象并執(zhí)行 sql 語句,最后釋放資源。

public class MyBatisDemo {

    public static void main(String[] args) throws IOException {
        //1. 加載mybatis的核心配置文件,獲取 SqlSessionFactory
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //2. 獲取SqlSession對象,用它來執(zhí)行sql
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //3. 執(zhí)行sql
        List<Student> students = sqlSession.selectList("test.selectAll"); //參數(shù)是一個字符串,該字符串必須是映射配置文件的namespace.id
        System.out.println(students);
        //4. 釋放資源
        sqlSession.close();
    }
}

過程剖析

在使用 MyBatis 持久層框架開發(fā)時,我們首先創(chuàng)建 Maven 模塊,使用 Maven 構(gòu)建和管理這個 Java 項目,所以我們要導入項目依賴的坐標信息,例如 MySQL 數(shù)據(jù)庫的驅(qū)動坐標,用于單元測試的 Junit 和用于查看日志信息的依賴坐標。

接下來是編寫 MyBatis 核心配置文件,一般命名為 mybatis-config.xml,其中<environments>標簽用于配置數(shù)據(jù)庫連接環(huán)境信息,可以配置多個<environment>標簽,通過 default 屬性切換不同的環(huán)境。我們還要定義<mapper> 標簽用于加載 sql 映射文件。

而 sql 映射文件在哪里呢?接下來一步就是編寫 sql 映射文件,在模塊的 resources 文件目錄下創(chuàng)建映射文件的核心配置文件,一般命名有其語法規(guī)則,使用 xxxMapper.xml 命名,而 xxx 表示要操作的數(shù)據(jù)庫表。其中使用 namespace 作為命名空間,而 id 作為標簽中 sql 語句的唯一標識,使用命名空間的方式類似于 Java 中包的概念,允許在不同的命名空間中存在相同名稱的 id ,方便在不同的 sql 映射文件中使用相同的 id,resultType 參數(shù)表示對應語句返回結(jié)果的類型,例如案例中將數(shù)據(jù)包裝為 Student 類型的對象,其 resultType 參數(shù)的值就為 Student。

接下來就是定義 POJO 實體類,用于封裝查詢結(jié)果數(shù)據(jù),例如案例中查詢學生表,將每條記錄封裝為一個對象,這里就在 POJO 包中定義 Student 類。

最后就是核心的一部分,編寫相關(guān)測試類來操作數(shù)據(jù)庫,在源代碼 Java 文件目錄對應的包中創(chuàng)建測試類來操作數(shù)據(jù)庫并封裝結(jié)果集對象。內(nèi)容大致為加載核心配置文件 mybatis-config.xml ,獲取 SqlSessionFactory 類對象,使用該對象的openSession() 方法獲取 SqlSession 對象,用于執(zhí)行 sql,然后封裝結(jié)果集對象 ,此時傳入的參數(shù)是一個字符串,該字符串是映射配置文件的 namespace.id ,最后釋放資源。

5. 總結(jié)

初學者入門時,整個構(gòu)建過程可以多參考官網(wǎng)給出的示例教程和代碼,直接 C V 到 IDE 練習即可。

本文是 MyBatis 持久層框架的入門篇,MyBatis 作為大多數(shù)Java 開發(fā)者第一個學習的大型框架,其思想十分重要,慢慢體會其中每個步驟的意義,多練習就能熟練掌握。

以上就是詳解如何使用MyBatis簡化JDBC開發(fā)的詳細內(nèi)容,更多關(guān)于MyBatis簡化JDBC開發(fā)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論

新宾| 汉川市| 海南省| 修水县| 霞浦县| 呈贡县| 科技| 泉州市| 桃源县| 通渭县| 林甸县| 房山区| 潞西市| 宾川县| 连城县| 武夷山市| 长春市| 宁城县| 本溪市| 平定县| 外汇| 汝南县| 昆山市| 新龙县| 鄢陵县| 堆龙德庆县| 广安市| 万宁市| 怀来县| 永德县| 金乡县| 台州市| 安泽县| 正宁县| 利川市| 化德县| 神农架林区| 万安县| 彰化市| 永顺县| 峨眉山市|