文章目錄
- 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架構的執行流程:

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。
3.2、Mybatis環境搭建
(1)建立Maven工程并在 pom.xml 導入需要的 jar 包坐标。
注意,除了 Mybatis 的 jar 包外,我們還需要 Mysql 資料庫連接配接的 jar 包。 log4j 日志和 junt 單元測試的 jar 包可以根據實際情況是否導入。
若不使用Maven建構工程,可直接将
mybatis-x.x.x.jar
以及其他相應的 jar 包導入項目即可。
<?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 的映射配置檔案位置必須和 Dao 接口的包結構相同。
④映射配置檔案的 mapper 标簽 namespace 屬性的取值必須是 Dao 接口的全路徑類名。
⑤映射配置檔案的操作配置,id屬性的取值必須是 Dao 接口的方法名。
當我們遵從了③④⑤點之後,在開發過程中無需再寫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','上海');
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();
}
}
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)。
4.5、小結
通過 Mybatis 入門示例,我們發現使用 Mybatis 是非常容易的一件事情,因為隻需要編寫 Dao 接口并且按照 Mybatis 要求編寫兩個配置檔案,就可以實作功能。遠比我們之前的 JDBC 友善多了。
使用注解之後,将變得更為簡單,隻需要編寫一個 Mybatis 配置檔案。
後面講解一些 Mybatis 的基本使用:https://blog.csdn.net/q961250375/article/details/102766074。