Java框架篇---Mybatis 入門
一、Mybatis介紹
MyBatis是一款一流的支援自定義SQL、儲存過程和高階對映的持久化框架。MyBatis幾乎消除了所有的JDBC程式碼,也基本不需要手工去設定引數和獲取檢索結果。MyBatis能夠使用簡單的XML格式或者註解進行來配置,能夠對映基本資料元素、Map介面和POJOs(普通Java物件)到資料庫中的記錄。
二、MyBatis工作流程
(1)載入配置並初始化
觸發條件:載入配置檔案
配置來源於兩個地方,一處是配置檔案,一處是Java程式碼的註解,將SQL的配置資訊載入成為一個個MappedStatement物件(包括了傳入引數對映配置、執行的SQL語句、結果對映配置),儲存在記憶體中。
(2)接收呼叫請求
觸發條件:呼叫Mybatis提供的API
傳入引數:為SQL的ID和傳入引數物件
處理過程:將請求傳遞給下層的請求處理層進行處理。
(3)處理操作請求 觸發條件:API介面層傳遞請求過來
傳入引數:為SQL的ID和傳入引數物件
處理過程:
(A)根據SQL的ID查詢對應的MappedStatement物件。
(B)根據傳入引數物件解析MappedStatement物件,得到最終要執行的SQL和執行傳入引數。
(C)獲取資料庫連線,根據得到的最終SQL語句和執行傳入引數到資料庫執行,並得到執行結果。
(D)根據MappedStatement物件中的結果對映配置對得到的執行結果進行轉換處理,並得到最終的處理結果。
(E)釋放連線資源。
(4)返回處理結果將最終的處理結果返回。
orm工具的基本思想
無論是用過的hibernate,mybatis,你都可以法相他們有一個共同點:
• 從配置檔案(通常是XML配置檔案中)得到 sessionfactory.
• 由sessionfactory 產生 session
• 在session 中完成對資料的增刪改查和事務提交等.
• 在用完之後關閉session 。
• 在Java 物件和 資料庫之間有做mapping 的配置檔案,也通常是xml 檔案。
功能架構
Mybatis的功能架構分為三層:
1.API介面層:提供給外部使用的介面API,開發人員通過這些本地API來操縱資料庫。介面層一接收到呼叫請求就會呼叫資料處理層來完成具體的資料處理。
2.資料處理層:負責具體的SQL查詢、SQL解析、SQL執行和執行結果對映處理等。它主要的目的是根據呼叫的請求完成一次資料庫操作。
3.基礎支撐層:負責最基礎的功能支撐,包括連線管理、事務管理、配置載入和快取處理,這些都是共用的東西,將他們抽取出來作為最基礎的元件。為上層的資料處理層提供最基礎的支撐。
多需要新增的驅動包:
下面進行快速入門:
實體類User
public class User {
private String id;
private String name;
private int age;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
對映檔案UserMapping.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.oumyye.mapping.UserMapping">
<!-- 在select標籤中編寫查詢的SQL語句, 設定select標籤的id屬性為getUser,id屬性值必須是唯一的,不能夠重複
使用parameterType屬性指明查詢時使用的引數型別,resultType屬性指明查詢返回的結果集型別
resultType="com.oumyye.model.User"就表示將查詢結果封裝成一個User類的物件返回
User類就是users表所對應的實體類
-->
<!--
根據id查詢得到一個user物件
-->
<select id="getUser" parameterType="String"
resultType="com.oumyye.model.User">
select * from user where id=#{id}
</select>
</mapper>
資原始檔mybatis.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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<!-- 配置資料庫連線資訊 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/oumyye/mapping/userMapping.xml"/>
</mappers>
</configuration>
測試類:
package test;
import java.io.InputStream;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import com.oumyye.model.User;
public class Tests {
@Test
public void test(){
String resource = "mybatis.xml";
//使用類載入器載入mybatis的配置檔案(它也載入關聯的對映檔案)
InputStream is = Tests.class.getClassLoader().getResourceAsStream(resource);
//構建sqlSession的工廠
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
SqlSession session = sessionFactory.openSession();
/**
* 對映sql的標識字串,
* com.oumyye.mapping.UserMapping是userMapper.xml檔案中mapper標籤的namespace屬性的值,
* getUser是select標籤的id屬性值,通過select標籤的id屬性值就可以找到要執行的SQL
*/
String statement = "com.oumyye.mapping.UserMapping.getUser";//對映sql的標識字串
//執行查詢返回一個唯一user物件的sql
User user = session.selectOne(statement, "1123");
System.out.println(user.toString());
}
}
結果:
“`