MyBatis框架總結一(快速入門)
MyBatis框架總結
1.框架概述
1.1 什麼是框架
- 框架是一個半成品,對於Java語言來說,框架就是封裝了別人的程式碼。在框架的基礎上我們在進一步開發,雖是一種拿來主義,但開發效率較高。
1.2 框架解決什麼問題
- 解決的是技術整合問題。軟體開發環境和規模都很大,不可能任何一個專案的程式碼都從零開始,此時就需要一個非常優秀的框架把基礎技術整合完畢,我們在他的基礎上進一步開發。提高效能,易擴充套件,易維護,最終提高整個團隊的開發效率。
1.3 怎麼使用框架
Java的框架是具有一些共性:
- 匯入jar包
- 框架執行細節定義,也就是編寫配置檔案(xml)
- 呼叫框架中的api
1.4 原生JDBC案例的問題
- 頻繁連線,釋放資料庫資源,降低系統性能
- SQL語句硬編碼,難以維護
- 引數和佔位符對應問題
- 結果集解析複雜,列名硬編碼
1.5 MyBatis框架概述
-
Mybatis是一個優秀的持久層框架(Dao層框架),它是對JDBC的封裝,使得開發者只需要關注Sql語句(業務)本身即可,無需開發者處理載入驅動、獲取連線、建立Statement等繁瑣的過程。
-
Mybatis最大的特點是把Sql語句寫在XML配置檔案當中。而且Mybatis執行完Sql語句之後可以以物件形式返回(POJO/POJO集合等)。
-
Mybatis是一個實現了ORM思想的持久層框架。
-
ORM:Object/Relation Mapping 物件/關係對映。
-
ORM思想:將資料庫中的關係資料表對映為JAVA中的物件,把對資料表的操作轉換為對物件的操作,實現面向物件程式設計。因此ORM的目的是使得開發人員以面向物件的思想來操作資料庫。
比如:原來insert操作使用的是SQL語句"insert into…",如果使用實現了ORM思想的持久層框架,就可以在Java程式中直接呼叫api,比如insert(User),達到操作物件即操作資料庫的效果。Hibernate框架是一個全自動的ORM持久層框架,只需要編寫POJO,在xml中定義好Pojo屬性和資料表字段的對映/對應關係,就可以在java中實現類似 insert(User)的操作。Sql語句都不用寫。但是因為效能等問題,市場佔有率越來越低
Mybatis框架是一個半自動的ORM持久層框架,也可以在Java中實現類似 insert(User)的操作最終操作資料庫,但是需要我們自己寫Sql語句。Mybatis是目前比較流行的Dao層框架。
2. MyBatis框架快速上手
步驟:
- 匯入MyBatis框架jar包
- 配置檔案
- SqlSessionFactoryBuilder,傳入位元組輸入流,構建工廠
- SqlSessionFactory,建立SqlSession
- SqlSession執行selectList方法查詢資料
2.1 jar包
需要匯入的jar包如下所示
2.2 配置檔案
在src目錄下匯入配置檔案:SqlMapConfig.xml,UserMapper.xml,配置檔案內容如下
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">
<configuration>
<!--
environments:執行環境,可以配置多個
default="development"預設,值=development開發環境
environment執行環境,配置一個
id="development" id唯一性的屬性 開發環境
id = "produce" 生產環境
id = "test" 測試環境
-->
<environments default="development">
<environment id="development">
<!--
transactionManager:事務管理配置
type="JDBC" 使用的是最原始的JDBC的事務處理機制
-->
<transactionManager type="JDBC" />
<!--
dataSource 配置資料來源
type="POOLED"使用連線池
Mybatis自帶連線池 type="UNPOOLED"不用自帶的連線池
-->
<dataSource type="POOLED">
<!--
配置的是資料庫連線的四大資訊
-->
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis?characterEncoding=utf8" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<!--
配置的是對映關係 ORM Java物件和資料表、
-->
<mappers>
<!--
單獨的對映關係
resource資源,對映檔案的路徑
UserMapper.xml 配置的是資料表User的SQL語句
-->
<mapper resource="UserMapper.xml" />
</mappers>
</configuration>
重點要配置的地方有兩處:
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis?characterEncoding=utf8" />
這裡的/mybatis
指的是資料庫中表的名稱,必須有相應的表。
<mappers>
<mapper resource="UserMapper.xml" />
</mappers>
最後定義的對映關係,表示對映的xml檔案叫做UserMapper.xml
,如果是其他xml檔案,就將名字更改或新增新的對映。
UserMapper.xml
UserMapper中定義SQL語句和對映關係,以查詢user表中全部資料為例
<?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名稱空間,屬性值要求唯一,
整個的SQL語句配置檔案
-->
<mapper namespace="test">
<!--
select標籤,配置的是查詢語句
id屬性:和介面中方法名對應,屬性值在當前檔案中具有唯一性,此處的id="queryList"
框架執行SQL語句: namespace.queryList
resultType:查詢的結果集,是pojo物件
標籤體是SQL語句
-->
<select id="queryList" resultType="com.sz.pojo.User">
select * from user
</select>
<!--
配置主鍵查詢的SQL語句,標籤select
id 具有唯一性,查詢是有結果集的
標籤中屬性resultType:配置結果集的型別
SQL語句有引數
標籤中屬性 parameterType:SQL語句的引數型別
-->
<select id="queryUserById" resultType="com.sz.pojo.User" parameterType="Integer">
<!--
SQL語句,引數不能寫問號
取引數 #{引數名}
引數名,如果只有一個引數,基本型別及其包裝類和String 任意
-->
select * from user where id = #{id}
</select>
</mapper>
2.3 pojo物件
User
package com.sz.pojo;
import java.util.Date;
public class User {
private int id;
private String username;
private String sex;
private Date birthday;
private String address;
public User() {
}
public User(int id, String username, String sex, Date birthday, String address) {
this.id = id;
this.username = username;
this.sex = sex;
this.birthday = birthday;
this.address = address;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getBirthday(Date date) {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", sex='" + sex + '\'' +
", birthday=" + birthday +
", address='" + address + '\'' +
'}';
}
}
2.4 測試
package com.sz.mybatis;
import com.sz.pojo.User;
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.InputStream;
import java.util.List;
/**
* Mybatis框架的快速入門
* SQL語句,連線資訊,寫在配置檔案中
* SqlMapConfig.xml配置的是連線資訊
* UserMapper.xml配置的資料表user的SQL語句
*/
public class Quickstart {
/**
* 需求:查詢user表,資料儲存到List集合中
* 實現步驟:
* 1:建立物件 SqlSessionFactoryBuilder
* 工廠的構建者物件,作用:建立SQLSession物件工廠
* 讀取配置檔案
*
* 2:SqlSessionFactory工廠的建立
* SqlSession介面實現類物件
*
* 3:SqlSession介面實現類物件
* 呼叫方法 select查詢資料表
* 4:輸出查詢結果
*
* 5:釋放資源
*
*/
@Test
public void myBatisQuickStart(){
//1:建立物件 SqlSessionFactoryBuilder
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//使用sqlSessionFactoryBuilder方法build(),建立SqlSessionFactory物件
// build方法讀取配置檔案,返回SqlSessionFactory物件,需要傳遞流物件,流物件繫結資料庫配置檔案
InputStream inputStream = Quickstart.class.getClassLoader().getResourceAsStream("SqlMapConfig.xml");
// 2:SqlSessionFactory工廠的建立
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
// 工廠物件,獲取SqlSession介面實現類物件,工廠物件的方法openSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//3:SqlSession介面實現類物件,呼叫方法 select查詢資料表
// selectList方法的引數不是SQL語句,namespace+"."+id鎖定SQL語句 test.queryList
List<User> users = sqlSession.selectList("test.queryList");
for (User user:users){
System.out.println(user);
}
// 釋放資源
sqlSession.close();
}
}
2.5 快速入門中的不足
需要手動填寫對映關係:
List<User> users = sqlSession.selectList("test.queryList");