2.MyBatis(未完成)
目錄
1.3.2 ORM(Object Relational Mapping)
2.3.1 SqlSessionFactoryBuilder
1. 初識MyBatis
MyBatis 本是apache的一個開源專案iBatis, 2010年這個專案由apache software foundation 遷移到了google code,並且改名為MyBatis 。2013年11月遷移到Github。
MyBatis 是一款優秀的持久層框架,它支援定製化 SQL、儲存過程以及高階對映。
官方網站:http://mybatis.org
ORM框架:實體類和SQL語句之間建立對映關係
MyBatis專注於SQL本身,是一個足夠靈活的DAO層解決方案,適用於效能要求較高或者需求多變的網際網路專案
1.1 優點和缺點
優點
- 簡單的持久化框架,小巧並簡單易學
- 靈活, 不會對應用程式或者資料庫的現有設計強加任何影響
- SQL語句封裝在配置檔案中,便於統一管理與維護,降低程式的耦合度
- 提供XML標籤,支援編寫動態SQL
- 提供對映標籤,支援物件與資料庫的ORM欄位對映
- 提供物件關係對映標籤,支援物件關係組建維護
缺點
- SQL語句編寫工作量大,對開發人員有一定要求
- 資料庫移植性差
1.2 MyBatis主要組成
- MyBatis的核心物件
- SqlSessionFactoryBuilder(構造器)
- SqlSessionFactory(工廠)
- SqlSession(類似於JDBC的Connection)
- SqlMapper(對映器)
- SqlSessionFactoryBuilder(構造器)
- 配置檔案
1.3 持久化與ORM
1.3.1 持久化
1.3.2 ORM(Object Relational Mapping)
編寫程式的時候,以面向物件的方式處理資料
儲存資料的時候,卻以關係型資料庫的方式儲存
ORM解決方案包含下面四個部分
- 在持久化物件上執行基本的增、刪、改、查操作
- 對持久化物件提供一種查詢語言或者API
- 物件關係對映工具
- 提供與事務物件互動、執行檢查、延遲載入以及其他優化功能
2. 簡單框架搭建
注:不是最優化方案,只是一個方便學習的例項。
- 下載mybatis-3.2.x.jar包並匯入工程
- 編寫MyBatis核心配置檔案
- 建立實體類-POJO
- DAO層-SQL對映檔案(XxxMapper.xml)
- 建立測試類
2.1 核心配置檔案配置
核心檔案
<?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元素的子元素進行配置(不常用) -->
<properties resource="datasource.properties"></properties>
<!-- 設定選項,用於設定和改變MyBatis 執行中的行為 -->
<settings>
<!-- 日誌配置 -->
<setting name="logImpl" value="LOG4J" />
<!-- 設定查詢資料庫超時時間 (預設值:Not Set (null)) -->
<setting name="defaultStatementTimeout" value="25000" />
<!-- 指定 MyBatis 是否以及如何自動將列映 射到欄位/屬性。 PARTIAL(預設): 只是自動對映簡單、非巢狀 的結果集。 FULL:
將會自動對映任何複雜的(巢狀 或非巢狀)的結果集 -->
<setting name="autoMappingBehavior" value="FULL" />
<!-- 除了需求外,以下屬性一般無需特意配置 -->
<!-- 全域性性地啟用或禁用所有在mapper配置檔案中配置的快取。(預設值:true) -->
<setting name="cacheEnabled" value="true" />
<!-- 全域性性地啟用或禁用延遲載入。當禁用時,所有關聯的配置都會立即載入。(預設值:true) -->
<setting name="lazyLoadingEnabled" value="true" />
<!-- 允許或禁止從單一的語句返回多個結果集(預設值:true) -->
<setting name="multipleResultSetsEnabled" value="true" />
<!-- 使用列的標籤而不是列的名稱(預設值:true) -->
<setting name="useColumnLabel" value="true" />
<!-- 允許JDBC自動生成主鍵(預設值:false) -->
<setting name="useGeneratedKeys" value="false" />
<!-- 是否啟用位元組碼增強機制 -->
<setting name="enhancementEnabled" value="false" />
<!-- 配置預設的執行器(executor)。 SIMPLE(預設):簡單的執行器。 REUSE :重用prepared statements的
執行器。 BATCH:重用 statements並且進行批量 更新的執行器。 -->
<setting name="defaultExecutorType" value="SIMPLE" />
</settings>
<!-- 實體類型別名配置,減少輸入多餘的完整類名 -->
<typeAliases>
<!-- <typeAlias alias="Student" type="cn.kgc.pojo.Student"/> 別名匹配,比較繁瑣,不推薦使用 -->
<!-- 包名匹配 -->
<package name="cn.cs.pojo" />
</typeAliases>
<!-- 不常用配置,本例項沒有配置 -->
<!--typeHandlers:重寫型別處理器(type handlers)後,在此配置對映 -->
<!-- objectFactory:重寫 ObjectFactory後,在此配置對映 -->
<!-- 外掛配置:需要時配置 -->
<plugins>
<!-- 分頁外掛配置 -->
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<property name="helperDialect" value="mysql" />
</plugin>
</plugins>
<!-- 執行環境配置。可以配置多個執行環境,但是每個SqlSessionFactory 例項只能選擇一個執行環境。 -->
<environments default="development">
<environment id="development">
<!-- 事物管理器 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 資料來源 -->
<dataSource type="POOLED">
<!-- 簡單資料來源配置,詳細配置請自行百度 -->
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
<!-- SQL對映類配置,減少輸入多餘的完整類名 -->
<mappers>
<!-- <mapper resource="cn/kgc/dao/StudentMapper.xml"/> 全名稱匹配,不推薦使用 -->
<!-- 包名匹配 -->
<package name="cn.cs.dao" />
</mappers>
</configuration>
database.properties資料庫配置
driverClassName=com.mysql.jdbc.Driver
#在和mysql傳遞資料的過程中,使用unicode編碼格式,並且字符集設定為utf-8
url=jdbc:mysql://127.0.0.1:3306/mydb?useUnicode=true&characterEncoding=utf-8
username=root
password=root
補充:
屬效能夠被可動態替換(即使用佔位符)的屬性值引用 如:${driver},引用properties配置檔案鍵後的值
2.2 實體類和對映檔案
sql對映檔案
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd" >
<mapper namespace="cn.kgc.dao.StudentMapper">
<select id="getStudents" resultType="Student">
select * from student
</select>
<update id="updateStu" parameterType="Student">
update student set sName=#{sName} where id = #{id}
</update>
<delete id="addStu" parameterType="Student">
insert into student(sName,age,addres) values(#{sName},#{age},#{addres})
</delete>
<insert id="delstu">
delete from student where id = #{id}
</insert>
</mapper>
實體類
public class Student {
private int id;
private String sName;
private int age;
private String addres;
public Student() {
super();
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getsName() {
return sName;
}
public void setsName(String sName) {
this.sName = sName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddres() {
return addres;
}
public void setAddres(String addres) {
this.addres = addres;
}
@Override
public String toString() {
return "Strudent [id=" + id + ", sName=" + sName + ", age=" + age + ", addres=" + addres + "]";
}
}
- 實體類POJO,按照資料庫中對應表的結構編寫
- 對映檔案按照給定模板編寫
- 根元素mapper,指定namespace
- 當屬性名與列名不一致時,定義resultMap進行對映
- 定義CRUD標籤(select、insert、delete、update),編寫SQL語句
- 每個標籤指定id用於查詢;parameterType屬性指定引數型別;resultMap指定返回值型別
2.3. 核心物件的建立
2.3.1 SqlSessionFactoryBuilder
用過即丟,其生命週期只存在於方法體內
可重用其來建立多個 SqlSessionFactory 例項
負責構建SqlSessionFactory,並提供多個build方法的過載
2.3.2 SqlSessionFactory
SqlSessionFactory是每個MyBatis應用的核心
作用:建立SqlSession例項
作用域:Application
生命週期與應用的生命週期相同
單例:存在於整個應用執行時,並且同時只存在一個物件例項
2.3.3 SqlSession
包含了執行SQL所需的所有方法
對應一次資料庫會話,會話結束必須關閉
執行緒級別,不能共享
MybatisUtils工具類
public class MybatisUtils {
private static SqlSessionFactory factory;
// 在static裡,factory只會被建立一次
static {
try {
// 獲取config.xml的輸入流
InputStream is = Resources.getResourceAsStream("config.xml");
//工廠建造器build()方法建立sqlSession 工廠
factory = new SqlSessionFactoryBuilder().build(is);
} catch (IOException e) {
e.printStackTrace();
}
}
// 建立sqlsession
public static SqlSession createSqlSession() {
return factory.openSession(true); // true: 自動提交事物
}
// 釋放資源
public static void close(SqlSession sqlSession) {
if (null != sqlSession) {
sqlSession.close();
}
}
}
2.3.4 SqlSession的兩種使用方式
StudentMapper介面
public interface StudentMapper {
//1.查詢學生表的記錄數
public int count();
}
通過SqlSession例項直接執行對映的SQL語句
@Test
public void test1() throws IOException {
SqlSession se=null;
se=MybatisUtils.createSqlSession();
//通過SqlSession例項直接執行對映的SQL語句
int count=se.selectOne("cn.kgc.dao.StudentMapper.count");
System.out.println(count);
MybatisUtils.close(se);
}
基於Mapper介面方式操作資料
@Test
public void test2() throws IOException {
SqlSession se=MybatisUtils.createSqlSession();
//基於Mapper介面方式操作資料
int count= se.getMapper(StudentMapper.class).count();
System.out.println(count);
MybatisUtils.close(se);
}
注意:方式2要求Mapper介面的名稱必須和對映檔案中mapper元素的namespace屬性完全一致,方式1則無此要求;另外Mapper介面中的方法名需和對映檔案中相應元素的id屬性對應
3. 對映檔案詳解
3.1 select元素詳解
3.2 Insert、 update、 delete 元素詳解
3.3 Sql 元素
3.4 引數( Parameters )
3.5 resultMap 元素
3.5.1 高階結果對映
3.5.2 一對一
3.5.3 一對多
3.6 Cache 元素
3.7 cache-ref 元素
動態SQL