IDEA建立MyBatis——初始
一、為什麼需要框架技術
1.框架技術
是一個應用程式的半成品
提供可重用的公共結構
按一定規則組織的一組元件
2.分析優勢
不用再考慮公共問題
專心在業務實現上
結構統一,易於學習、維護
新手也可寫出好程式
二、MyBatis
1.半自動化的ORM實現
2.DAO層
3.動態SQL
4.小巧靈活、簡單易學
1.持久化與ORM
持久化是程式資料在瞬時狀態和持久狀態間轉換的過程
01.ORM(Object Relational Mapping)
編寫程式的時候,以面向物件的方式處理資料
儲存資料的時候,卻以關係型資料庫的方式儲存
02.ORM解決方案包含下面四個部分
在持久化物件上執行基本的增、刪、改、查操作
對持久化物件提供一種查詢語言或者API
物件關係對映工具
提供與事務物件互動、執行檢查、延遲載入以及其他優化功能
2.MyBatis簡介
*MyBatis前身是iBatis,本是Apache的一個開源的專案
*官方網站
http://mybatis.org
*ORM框架
實體類和SQL語句之間建立對映關係
*特點
基於SQL語法,簡單易學
能瞭解底層封裝過程
SQL語句封裝在配置檔案中,便於統一管理與維護,降低程式的耦合度
方便程式程式碼除錯
3.搭建MyBatis開發環境
使用MyBatis的開發步驟
a.下載mybatis-3.2.2.jar包並匯入工程
b.編寫MyBatis核心配置檔案(configuration.xml)
c.建立實體類-POJO
d.DAO層-SQL對映檔案(mapper.xml)
e.建立測試類
讀取核心配置檔案mybatis-config.xml
建立SqlSessionFactory物件,讀取配置檔案
建立SqlSession物件
呼叫mapper檔案進行資料操作
專案結構如圖所示:
pom.xml
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.31</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.2</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.5</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
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="database.properties"></properties>
<typeAliases>
<package name="cn.happy.entity"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${database.driver}" />
<property name="url" value="${database.url}" />
<property name="username" value="${database.username}" />
<property name="password" value="${database.password}" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="cn/happy/dao/department.xml"></mapper>
</mappers>
</configuration>
database.properties 資料庫接連的相關配置
database.driver=com.mysql.jdbc.Driver
database.url=jdbc:mysql://localhost:3306/empdb
database.username=root
database.password=
department.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="cn.happy.dao.DeptDao">
<!--可以重用的SQL塊,也可以被其他語句引用-->
<sql id="columns">
id,name
</sql>
<!--用來描述資料庫結果集和物件的對應關係-->
<!-- 1.查詢所有部門-->
<select id="getAllDept" resultType="Department">
select <include refid="columns"></include> from department
</select>
</mapper>
DepartmentTest 部門測試類
@Test
public void deptTest() throws IOException {
String resource="mybatis-config.xml";
InputStream stream= Resources.getResourceAsStream(resource);
//獲得會話工廠
SqlSessionFactory sf=new SqlSessionFactoryBuilder().build(stream);
//會話
SqlSession session=sf.openSession();
//01.弱型別 通過名稱空間唯一鎖定要執行的sql
// List<Department> list = session.selectList("cn.happy.dao.getAllDept");
//02.強型別
DeptDao dao = session.getMapper(DeptDao.class);
List<Department> list = dao.getAllDept();
for (Department item:list){
System.out.println(item.getName());
}
session.close();
}
實現思路:
1、 mybatis配置 mybatis-config.xml,此檔案作為mybatis的全域性配置檔案,配置了mybatis的執行環境等資訊。 mapper.xml檔案即sql對映檔案,檔案中配置了操作資料庫的sql語句。此檔案需要在mybatis-config.xml中載入。
2、 通過mybatis環境等配置資訊構造SqlSessionFactory即會話工廠 3、 由會話工廠建立sqlSession即會話,操作資料庫需要通過sqlSession進行。 4、 mybatis底層自定義了Executor執行器介面操作資料庫,Executor介面有兩個實現,一個是基本執行器、一個是快取執行器。 5、 Mapped Statement也是mybatis一個底層封裝物件,它包裝了mybatis配置資訊及sql對映資訊等。mapper.xml檔案中一個sql對應一個Mapped Statement物件,sql的id即是Mapped statement的id。 6、 Mapped Statement對sql執行輸入引數進行定義,包括HashMap、基本型別、pojo,Executor通過Mapped Statement在執行sql前將輸入的Java物件對映至sql中,輸入引數對映就是jdbc程式設計中對preparedStatement設定引數。 7、 Mapped Statement對sql執行輸出結果進行定義,包括HashMap、基本型別、pojo,Executor通過Mapped Statement在執行sql後將輸出結果對映至java物件中,輸出結果對映過程相當於jdbc程式設計中對結果的解析處理過程。
輸出對映(返回的結果集可以有哪些型別)
1)基本型別
2)pojo型別
3)List型別
3.MyBatis框架優缺點
優點
與JDBC相比,減少了50%以上的程式碼量
最簡單的持久化框架,小巧並簡單易學
SQL程式碼從程式程式碼中徹底分離,可重用
提供XML標籤,支援編寫動態SQL
提供對映標籤,支援物件與資料庫的ORM欄位對映
缺點
SQL語句編寫工作量大,對開發人員有一定要求
資料庫移植性差
MyBatis專注於SQL本身,是一個足夠靈活的DAO層解決方案,適用於效能要求較高或者需求多變的網際網路專案
4.MyBatis基本要素
01.MyBatis的核心物件 SqlSessionFactoryBuilder 、 SqlSessionFactory 、SqlSession
02.mybatis-config.xml 系統核心配置檔案
03.mapper.xml SQL對映檔案
核心物件:
1.SqlSessionFactoryBuilder
用過即丟,其生命週期只存在於方法體內
可重用其來建立多個 SqlSessionFactory 例項
負責構建SqlSessionFactory,並提供多個build方法的過載
2.SqlSessionFactory
SqlSessionFactory是每個MyBatis應用的核心
作用:建立SqlSession例項
作用域:Application
生命週期與應用的生命週期相同
單例
存在於整個應用執行時,並且同時只存在一個物件例項
3.SqlSession
包含了執行SQL所需的所有方法
對應一次資料庫會話,會話結束必須關閉
執行緒級別,不能共享
注意:在SqlSession裡可以執行多次SQL語句,但一旦關閉了SqlSession就需要重新建立
SqlSession的兩種使用方式
01.通過SqlSession例項直接執行對映的SQL語句
02.基於Mapper介面方式操作資料
mybatis-config.xml 系統核心配置檔案
a.配置properties元素的兩種方式
1.通過外部指定的方式(database.properties),實現動態配置
2.直接配置為xml,實現動態配置
b.Setting元素
用來修改MyBatis執行時的行為方式
主要是MyBatis的一些全域性配置屬性的設定
c:typeAliases元素
類型別名
僅僅只關聯XML配置,簡寫冗長的Java類名
//方式一
<typeAliases>
<typeAlias alias="User" type="cn.smbms.pojo.User"/>
</typeAliases>
//方式二:
<typeAliases>
<package name ="cn.smbms.pojo" />
</typeAliases>
d:environments元素
表示配置MyBatis的多套執行環境,將SQL對映到多個不同的資料庫上
子元素節點:environment,但是必須指定其中一個為預設執行環境(通過default指定)
transactionManager-事務管理器
dataSource
dataSource元素使用基本的JDBC資料來源介面來配置JDBC連線物件的資源
有三種內建的資料來源型別
e:mappers元素
5.MyBatis與Hibernate的區別