天天看點

MyBatis架構的入門學習1、MyBatis架構的概述2、JDBC操作資料庫的問題分析3、MyBatis的環境搭建4、MyBatis入門案例

文章目錄

  • 1、MyBatis架構的概述
    • 1.1、什麼是架構,架構要解決那些問題?
    • 1.2、持久層技術解決方案有哪些?
    • 1.3、什麼是ORM?
  • 2、JDBC操作資料庫的問題分析
    • 2.1、JDBC源碼回顧
    • 2.2、JDBC問題分析
  • 3、MyBatis的環境搭建
    • 3.1、下載下傳MyBatis架構
    • 3.2、Mybatis環境搭建
    • 3.3、Mybatis環境搭建的注意事項
  • 4、MyBatis入門案例
    • 4.1、建立資料庫
    • 4.2、引入log4j配置檔案,可省略
    • 4.3、Mybatis簡單的測試案例
    • 4.4、Mybatis注解開發案例
    • 4.5、小結

1、MyBatis架構的概述

  MyBatis 是一個優秀的基于 Java 的持久層架構,它内部封裝了 JDBC,使開發者隻需要關注 SQL 語句本身,而不需要花費精力去處理加載驅動、建立連接配接、建立 Statement 等繁雜的過程。

  MyBatis 通過 XML 或注解的方式将要執行的各種 Statement 配置起來,并通過 Java 對象和 Statement 中 SQL 的動态參數進行映射生成最終執行的 SQL 語句,最後由 MyBatis 架構執行 SQL 并将結果映射為 Java 對象并傳回。

  采用 ORM 思想解決了實體和資料庫映射的問題,對 JDBC 進行了封裝,屏蔽了 JDBC API 底層通路細節,使我們不用與 JDBC API 打交道,就可以完成對資料庫的持久化操作。

  Mybatis架構的執行流程:

MyBatis架構的入門學習1、MyBatis架構的概述2、JDBC操作資料庫的問題分析3、MyBatis的環境搭建4、MyBatis入門案例

1.1、什麼是架構,架構要解決那些問題?

  架構(Framework)是整個或部分系統的可重用設計,表現為一組抽象構件及構件執行個體間互動的方法;另一種定義認為,架構是可被應用開發者定制的應用骨架。前者是從應用方面而後者是從目的方面給出的定義。

  簡而言之,架構其實就是某種應用的半成品,就是一組元件,供你選用完成你自己的系統。簡單說就是使用别人搭好的舞台,你來做表演。而且,架構一般是成熟的,不斷更新的軟體。

  架構要解決的最重要的一個問題是技術整合的問題,在 J2EE 的 架構中,有着各種各樣的技術,不同的軟體企業需要從 J2EE 中選擇不同的技術,這就使得軟體企業最終的應用依賴于這些技術,技術自身的複雜性和技術的風險性将會直接對應用造成沖擊。

  而應用是軟體企業的核心,是競争力的關鍵所在,是以應該将應用自身的設計和具體的實作技術解耦。這樣,軟體企業的研發将集中在應用的設計上,而不是具體的技術實作,技術實作是應用的底層支撐,它不應該直接對應用産生影響。

  架構一般處在低層應用平台(如 J2EE )和高層業務邏輯之間的中間層。

1.2、持久層技術解決方案有哪些?

  (1)JDBC(Java DataBase Connectivity,Java 資料庫連接配接):JDBC是一種用于執行SQL語句的Java API,可以為多種關系資料庫提供統一通路,它由一組用Java語言編寫的類和接口組成。JDBC提供了一種基準,據此可以建構更進階的工具和接口,使資料庫開發人員能夠編寫資料庫應用程式。主要操作的三個對象:Connection、PreparedStatement 和 ResultSet。

  (2)Spring 的 JdbcTemplate:對資料庫的操作在 JDBC 上面做了深層次的封裝,主要封裝了PreparedStatement和ResultSet。

  (3)Apache 的 DBUtils:對JDBC進行簡單封裝的開源工具類庫,使用它能夠簡化JDBC應用程式的開發,同時也不會影響程式的性能。

  需要知道的是,以上這些其實都不算做架構。JDBC是一種規範,而Spring 的 JdbcTemplate和Apache 的 DBUtils都隻是一個工具類。

1.3、什麼是ORM?

  ORM(Object Relational Mappging),對象關系映射。

  簡單來說,就是把資料庫表和實體類、資料庫表中的列和實體類的屬性對應起來,僅僅操作實體類就可以實作操作資料庫表。

實體類的屬性 資料庫表的列
User實體類 – 對應 – user表
userId – 對應 – id
userName – 對應 – user_name

  一般來說,常常将實體類中的屬性和資料庫表的字段名稱保持一緻。

實體類的屬性 資料庫表的列
User實體類 – 保持一緻 – user表
id – 保持一緻 – id
user_name – 保持一緻 – user_name

2、JDBC操作資料庫的問題分析

2.1、JDBC源碼回顧

import java.sql.*;

public class JdbcTest {
    public static void main(String[] args) {
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        try {
            // 加載資料庫驅動
            Class.forName("com.mysql.jdbc.Driver");
            // 通過驅動管理類擷取資料庫連接配接
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo?characterEncoding=utf-8", "root", "root");
            // 定義Sql語句,?表示占位符
            String sql = "select * from user where name = ?";
            // 擷取預處理statement
            preparedStatement = connection.prepareStatement(sql);
            // 設定參數,第一個參數為 sql 語句中參數的序号(從1開始),第二個參數為設定的參數值
            preparedStatement.setString(1, "Atlantis");
            // 向資料庫發出sql執行查詢,查詢出結果集
            resultSet = preparedStatement.executeQuery();
            // 周遊查詢結果集
            while (resultSet.next()) {
                String id = resultSet.getString("id");
                String name = resultSet.getString("name");
                System.out.println("id:" + id + "  name:" + name);
            }
        } 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();
                }
            }
        }
    }
}
           

2.2、JDBC問題分析

  (1)資料庫連接配接建立、釋放頻繁造成系統資源浪費進而影響系統性能,如果使用資料庫連接配接池可解決此問題。

  (2)SQL 語句在代碼中寫死,造成代碼不易維護,實際應用 SQL 變化的可能較大,SQL 變動需要改變 Java

代碼。

  (3)使用 PreparedStatement 向占有位符号傳參數存在寫死,因為 SQL 語句的 where 條件不一定,可能多也可能少,修改 SQL 還要修改代碼,系統不易維護。

  (4)對結果集解析存在寫死(查詢列名),SQL 變化導緻解析代碼變化,系統不易維護,如果能将資料庫記錄封裝成 pojo 對象解析比較友善。

3、MyBatis的環境搭建

3.1、下載下傳MyBatis架構

  Maven中央倉庫下載下傳:https://mvnrepository.com/artifact/org.mybatis/mybatis。

MyBatis架構的入門學習1、MyBatis架構的概述2、JDBC操作資料庫的問題分析3、MyBatis的環境搭建4、MyBatis入門案例

3.2、Mybatis環境搭建

  (1)建立Maven工程并在 pom.xml 導入需要的 jar 包坐标。

  注意,除了 Mybatis 的 jar 包外,我們還需要 Mysql 資料庫連接配接的 jar 包。 log4j 日志和 junt 單元測試的 jar 包可以根據實際情況是否導入。

  若不使用Maven建構工程,可直接将

mybatis-x.x.x.jar

以及其他相應的 jar 包導入項目即可。

MyBatis架構的入門學習1、MyBatis架構的概述2、JDBC操作資料庫的問題分析3、MyBatis的環境搭建4、MyBatis入門案例
<?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>com.atlantis</groupId>
    <artifactId>Mybatis</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!-- 打包方式 -->
    <packaging>jar</packaging>

    <!-- 設定編碼 -->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
    </properties>

    <dependencies>
        <!-- mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.6</version>
        </dependency>
        <!-- Mysql資料庫連接配接 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>
        <!-- log4j日志 -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <!-- junit單元測試 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>
           

  (2)建立實體類和Dao層接口

package com.atlantis.domain;

import java.util.Date;

public class User {
    private Integer id;
    private String username;
    private String sex;
    private Date birthday;
    private String address;

	// 省略構造方法
	// 省略get和set方法
	// 省略toString方法 
}
           
package com.atlantis.dao;

import com.atlantis.domain.User;
import java.util.List;

public interface UserDao {
    /**
     * 查詢所有使用者
     * @return List<User>
     */
    List<User> findAll();
}
           

  (3)建立Mybatis的主配置檔案SQLMapConfig.xml

<?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>
    <!-- 配置資料庫環境 -->
    <environments default="mysql">
        <!-- Mysql的配置環境 -->
        <environment id="mysql">
            <!-- 配置事務的類型 -->
            <transactionManager type="JDBC"/>
            <!-- 配置資料源(連接配接池) -->
            <dataSource type="POOLED">
                <!-- 配置連接配接資料庫的4個基本資訊 -->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf8"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 指定映射配置檔案的位置,即每個Dao接口獨立的配置檔案 -->
    <mappers>
        <mapper resource="com/atlantis/dao/UserDao.xml"/>
    </mappers>
</configuration>
           

  (4)建立Dao接口的映射配置檔案xxxDao.xml

<?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="com.atlantis.dao.UserDao">
    <select id="findAll" resultType="com.atlantis.domain.User">
        select * from user
    </select>
</mapper>
           

3.3、Mybatis環境搭建的注意事項

  ①在 Mybatis 中,把持久層的操作接口名稱和映射檔案也叫做 Mapper,是以 UserDao 和 UserMapper 是一樣的。

  ②在 IDEA 中建立目錄(Directory)和包(Package)是不一樣的,在建立包時

com.atlantis.dao

是三級目錄,在建立目錄時

com.atlantis.dao

是一級目錄。

MyBatis架構的入門學習1、MyBatis架構的概述2、JDBC操作資料庫的問題分析3、MyBatis的環境搭建4、MyBatis入門案例

  ③ Mybatis 的映射配置檔案位置必須和 Dao 接口的包結構相同。

  ④映射配置檔案的 mapper 标簽 namespace 屬性的取值必須是 Dao 接口的全路徑類名。

  ⑤映射配置檔案的操作配置,id屬性的取值必須是 Dao 接口的方法名。

MyBatis架構的入門學習1、MyBatis架構的概述2、JDBC操作資料庫的問題分析3、MyBatis的環境搭建4、MyBatis入門案例

  當我們遵從了③④⑤點之後,在開發過程中無需再寫Dao接口的實作類,因為剩下的工作都交給Mybatis完成了。

4、MyBatis入門案例

4.1、建立資料庫

CREATE DATABASE mybatis CHARACTER SET utf8 COLLATE utf8_general_ci;
USE mybatis;
CREATE TABLE user (
  id int(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
  username varchar(32) NOT NULL COMMENT '使用者名稱',
	sex char(1) default NULL COMMENT '性别',
  birthday datetime default NULL COMMENT '生日',  
  address varchar(256) default NULL COMMENT '位址'
)CHARACTER SET utf8 COLLATE utf8_general_ci;

-- 插入資料
insert  into user values (1,'測試名稱','男','2019-10-22 17:47:08','北京');
insert  into user values (2,'Atlantis','男','2018-10-22 17:47:08','武漢');
insert  into user values (3,'長安','女','2017-10-22 17:47:08','杭州');
insert  into user values (4,'Andersen','男','2016-10-22 17:47:08','上海');
           
MyBatis架構的入門學習1、MyBatis架構的概述2、JDBC操作資料庫的問題分析3、MyBatis的環境搭建4、MyBatis入門案例

4.2、引入log4j配置檔案,可省略

### 配置根 ###
# log4j.rootCategory=INFO DEBUG, CONSOLE ,LOGFILE
log4j.rootCategory=DEBUG, CONSOLE

log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE

### 配置輸出到控制台 ###
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[%d{YYYY-MM-dd HH:mm:ss}] %-6r [%15.15t] %-5p %30.30c %x - %m %n
           

4.3、Mybatis簡單的測試案例

public class MybatisTest {
    public static void main(String[] args) throws Exception {
        //1.讀取配置檔案
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.建立 SqlSessionFactory 的建構者對象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        //3.使用建構者建立工廠對象 SqlSessionFactory
        SqlSessionFactory factory = builder.build(in);
        //4.使用 SqlSessionFactory 生産 SqlSession 對象
        SqlSession session = factory.openSession();
        //5.使用 SqlSession 建立 dao 接口的代理對象
        UserDao userDao = session.getMapper(UserDao.class);
        //6.使用代理對象執行查詢所有方法
        List<User> users = userDao.findAll();
        for (User user : users) {
            System.out.println(user);
        }
        //7.釋放資源
        session.close();
        in.close();
    }
}
           
MyBatis架構的入門學習1、MyBatis架構的概述2、JDBC操作資料庫的問題分析3、MyBatis的環境搭建4、MyBatis入門案例

4.4、Mybatis注解開發案例

  (1)在Dao持久層接口中添加注解

public interface UserDao {
    /**
     * 查詢所有使用者
     * @return List<User>
     */
    @Select("select * from user")
    List<User> findAll();
}
           

  (2)修改Mybatis的主配置檔案SQLMapConfig.xml

<mappers>
        <mapper class="com.atlantis.dao.UserDao"/>
    </mappers>
           

  注意事項:在使用基于注解的 Mybatis 配置時,請移除 xml 的映射配置(UserDao.xml)。

MyBatis架構的入門學習1、MyBatis架構的概述2、JDBC操作資料庫的問題分析3、MyBatis的環境搭建4、MyBatis入門案例

4.5、小結

  通過 Mybatis 入門示例,我們發現使用 Mybatis 是非常容易的一件事情,因為隻需要編寫 Dao 接口并且按照 Mybatis 要求編寫兩個配置檔案,就可以實作功能。遠比我們之前的 JDBC 友善多了。

  使用注解之後,将變得更為簡單,隻需要編寫一個 Mybatis 配置檔案。

  後面講解一些 Mybatis 的基本使用:https://blog.csdn.net/q961250375/article/details/102766074。

繼續閱讀