目錄
- 一、MyBatis介紹
- 二、MyBatis工作原理
- 三、MyBatis環境搭載
- 四、實作步驟
一、MyBatis介紹
MyBatis是一個支援普通SQL查詢、存儲過程以及進階映射的持久層架構。
MyBatis架構也被稱之為ORM(Object/Relation Mapping,即對象關系映射)
架構。所謂的ORM就是一種為了解決面向對象與關系型資料庫中資料類型
不比對的技術,它通過描述Java對象與資料庫表之間的映射關系,自動将
Java應用程式中的對象持久化到關系型資料庫的表中。
ORM架構的工作原理
二、MyBatis工作原理
MyBatis的工作流程
(1)MyBatis讀取核心配置檔案mybatis-config.xml:mybatis-config.xml核心配置檔案主要配置了MyBatis的運作環境等資訊。
(2)加載映射檔案Mapper.xm:Mapper.xml檔案即SQL映射檔案,該檔案配置了操作資料庫的SQL語句,需要在mybatis-config.xml中加載才能執行。
(3)構造會話工廠:通過MyBatis的環境等配置資訊建構會話工廠SqlSessionFactory,用于建立SqlSession。
(4)建立SqlSession對象:由會話工廠SqlSessionFactory建立SqlSession對象,該對象中包含了執行SQL語句的所有方法。
(5)動态生成SQL語句:MyBatis底層定義了一個Executor接口用于操作資料庫,它會根據SqlSession傳遞的參數動态的生成需要執行的SQL語句,同時負責查詢緩存地維護。
(6)MappedStatement對象将傳入的Java對象映射到SQL語句中:SqlSession内部通過執行器Executor操作資料庫,增删改語句通過Executor接口的update()方法執行,查詢語句通過query()方法執行。這兩個執行方法中包含一個MappedStatement類型的參數,該參數是對映射資訊的封裝,存儲了要映射的SQL語句的id、參數等。Mapper.xml檔案中一個SQL語句對應一個MappedStatement對象,SQL語句的id即是MappedStatement的id。
(7)輸入參數映射:在執行Executor類的update()方法和query()方法時,MappedStatement對象會對使用者執行SQL語句時輸入的參數進行定義,Executor執行器會在執行SQL語句之前,通過MappedStatement對象将輸入的參數映射到SQL語句中。Executor執行器對輸入參數的映射過程類似于JDBC程式設計對PreparedStatement對象設定參數的過程。
(8)輸出結果映射:excutor()方法在資料庫中執行完SQL語句後,MappedStatement對象會對輸出的結果進行定義,Executor執行器會在執行SQL語句之後,通過MappedStatement對象将輸出結果映射至Java對象中。Executor執行器将輸出結果映射到Java對象的過程類似于JDBC程式設計對結果的解析處理過程。
三、MyBatis環境搭載
使用MyBatis架構進行資料庫開發之前,需要先搭建MyBatis環境,MyBatis環境搭建主要有如下基本步驟。
(1)建立工程;
(2)引入相關依賴;
(3)資料庫準備;
(4)編寫資料庫連接配接資訊配置檔案;
(5)編寫核心配置檔案和映射檔案。
1.建立工程:在IntelliJ IDEA中,建立名稱為mybatis的Maven工程
2.引入相關依賴:由于本項目要連接配接資料庫以及對程式進行測試,是以需要在項目的pom.xml檔案中導入MySQL驅動包、Junit測試包、MyBatis的核心包等相關依賴。編寫好pom檔案後,重新加載pom檔案起作用:pom檔案上右鍵-Maven-Reimport
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
3.建立資料庫:在MySQL中建立一個名稱為mybatis的資料庫
4.建立資料庫連接配接資訊配置檔案:在項目的src/main/resources目錄下建立資料庫連接配接的配置檔案,這裡将其命名為db.properties,在該檔案中配置資料庫連接配接的參數。
mysql.driver=com.mysql.cj.jdbc.Driver
mysql.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false
mysql.username=root
mysql.password=1234
5.建立MyBatis的核心配置檔案:在項目的src/main/resources目錄下建立MyBatis的核心配置檔案,該檔案主要用于項目的環境配置,如資料庫連接配接相關配置等。核心配置檔案可以随意命名,但通常将其命名為mybatis-config.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">
<configuration>
<!-- 環境配置 -->
<!-- 加載類路徑下的屬性檔案 -->
<properties resource="db.properties"/>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<!-- 資料庫連接配接相關配置 ,db.properties檔案中的内容-->
<dataSource type="POOLED">
<property name="driver" value="${mysql.driver}"/>
<property name="url" value="${mysql.url}"/>
<property name="username" value="${mysql.username}"/>
<property name="password" value="${mysql.password}"/>
</dataSource>
</environment>
</environments>
</configuration>
四、實作步驟
該程式是實作根據id查詢使用者資訊的操作,實作步驟如下:
1.資料準備:在mybatis資料庫中建立users表,并在users表中插入幾條資料。
//使用mybatis資料庫
use mybatis;
//建立users表
create table users(
uid int primary key auto_increment,
uname varchar(20) not null,
uage int not null
);
//向users表中插入資料
insert into users(uid,uname,uage) values(null,'張三',20),(null,'李四',18);
2.建立POJO實體:在項目的src/main/java目錄下建立com.zh.pojo包,在com.zh.pojo包下建立User類,該類用于封裝User對象的屬性。
package com.zh.pojo;
public class User {
private int id; //使用者id
private String uname; //使用者姓名
private int uage; //使用者年齡
//生成getter、setter方法
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public int getUage() {
return uage;
}
public void setUage(int uage) {
this.uage = uage;
}
}
3.建立映射檔案UserMapper.xml:在項目的src/main/resources目錄下建立一個檔案夾,在mapper檔案夾下建立映射檔案UserMapper.xml,該檔案主要用于實作SQL語句和Java對象之間的映射,使SQL語句查詢出來的關系型資料能夠被封裝成Java對象。
<?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>
<select id="findById" parameterType="int" resultMap="com.zh.pojo.User">
select * from users where uid = #{id}
</select>
</mapper>
4.修改mybatis-config.xml配置檔案:在mybatis-config.xml映射檔案中添加UserMapper.xml映射檔案路徑的配置,用于将UserMapper.xml映射檔案加載到程式中。
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
5.編寫測試類:在項目的src/test/java目錄下建立Test包,在Test包下建立UserTest類,該類主要用于程式測試。
package Test;
import com.itheima.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.IOException;
import java.io.Reader;
public class UserTest {
@Test
public void userFindByIdTest() {
//讀取檔案名
String resources = "mybatis-config.xml";
//建立流
Reader reader = null;
try {
//讀取mybatis-config.xml檔案内容到reader對象中
reader = Resources.getResourceAsReader(resources);
} catch (IOException e) {
e.printStackTrace();
}
//初始化mybatis資料庫,建立SqlSessionFactory類的執行個體
SqlSessionFactory sqlMapper = new
SqlSessionFactoryBuilder().build(reader);
//建立SqlSession執行個體
SqlSession session = sqlMapper.openSession();
//傳入參數查詢,傳回結果
User user = session.selectOne("findById", 1);
//輸出結果
System.out.println(user.getUname());
//關閉session
session.close();
}
}
6.點選運作程式,觀察控制台輸出。
補充:如果出現以下錯誤資訊。
該問題主要是沒有識别到我們的配置檔案,将resources目錄mark為resources root即可解決