mybatis-知識梳理01

1.Mybatis簡介

mybatis 是一個優秀的基於 java 的持久層框架,它內部封裝了 jdbc,使開發者只需要關注 sql 語句本身,
而不需要花費精力去處理加載驅動、創建連接、創建 statement 等繁雜的過程。
mybatis 通過 xml 或註解的方式將要執行的各種 statement 配置起來,並通過 java 對象和 statement 中
sql 的動態參數進行映射生成最終執行的 sql 語句,最後由 mybatis 框架執行 sql 並將結果映射爲 java 對象並
返回。
採用 ORM 思想解決了實體和數據庫映射的問題,對 jdbc 進行了封裝,屏蔽了 jdbc api 底層訪問細節,使我
們不用與 jdbc api 打交道,就可以完成對數據庫的持久化操作。
爲了我們能夠更好掌握框架運行的內部過程,並且有更好的體驗,下面我們將從自定義 Mybatis 框架開始來
學習框架。此時我們將會體驗框架從無到有的過程體驗,也能夠很好的綜合前面階段所學的基礎。

1.1原始jdbc操作(查詢數據)

在這裏插入圖片描述

1.2原始jdbc操作(插入數據)

在這裏插入圖片描述

1.3 原始jdbc操作的分析

原始jdbc開發存在的問題如下:

①數據庫連接創建、釋放頻繁造成系統資源浪費從而影響系統性能

②sql 語句在代碼中硬編碼,造成代碼不易維護,實際應用 sql 變化的可能較大,sql 變動需要改變java代碼。

③查詢操作時,需要手動將結果集中的數據手動封裝到實體中。插入操作時,需要手動將實體的數據設置到sql語句的佔位符位置

應對上述問題給出的解決方案:

①使用數據庫連接池初始化連接資源

②將sql語句抽取到xml配置文件中

③使用反射、內省等底層技術,自動將實體與表進行屬性與字段的自動映射

1.4 什麼是Mybatis

mybatis 是一個優秀的基於java的持久層框架,它內部封裝了jdbc,使開發者只需要關注sql語句本身,而不需要花費精力去處理加載驅動、創建連接、創建statement等繁雜的過程。

mybatis通過xml或註解的方式將要執行的各種 statement配置起來,並通過java對象和statement中sql的動態參數進行映射生成最終執行的sql語句。

最後mybatis框架執行sql並將結果映射爲java對象並返回。採用ORM思想解決了實體和數據庫映射的問題,對jdbc 進行了封裝,屏蔽了jdbc api 底層訪問細節,使我們不用與jdbc api 打交道,就可以完成對數據庫的持久化操作。

2.Mybatis的快速入門

2.1 MyBatis開發步驟

MyBatis官網地址:http://www.mybatis.org/mybatis-3/

在這裏插入圖片描述

MyBatis開發步驟:

①添加MyBatis的座標

②創建user數據表

③編寫User實體類

④編寫映射文件UserMapper.xml

⑤編寫核心文件SqlMapConfig.xml

⑥編寫測試類

2.2 環境搭建

1)導入MyBatis的座標和其他相關座標

<!--mybatis座標-->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.4.5</version>
</dependency>
<!--mysql驅動座標-->
<dependency>    
    <groupId>mysql</groupId>   
    <artifactId>mysql-connector-java</artifactId>    
    <version>5.1.6</version>    
    <scope>runtime</scope>
</dependency>
<!--單元測試座標-->
<dependency>    
    <groupId>junit</groupId>    
    <artifactId>junit</artifactId>    
    <version>4.12</version>    
    <scope>test</scope>
</dependency>
<!--日誌座標-->
<dependency>    
    <groupId>log4j</groupId>    
    <artifactId>log4j</artifactId>    
    <version>1.2.12</version>
</dependency>
  1. 創建user數據表

在這裏插入圖片描述
3) 編寫User實體

public class User {    
	private int id;    
	private String username;    
	private String password;
    //省略get個set方法
}

4)編寫UserMapper映射文件

<?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="userMapper">    
	<select id="findAll" resultType="com.qf.domain.User">        
		select * from User    
	</select>
</mapper>
  1. 編寫MyBatis核心文件
<!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:///test"/>                
				<property name="username" value="root"/>
				<property name="password" value="root"/>            
			</dataSource>        
		</environment>    
	</environments>    
	
	<mappers> 
		<mapper resource="com/qf/mapper/UserMapper.xml"/> 
	</mappers>
</configuration>

2.3 編寫測試代碼

//加載核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//獲得sqlSession工廠對象
SqlSessionFactory sqlSessionFactory = new            
                           SqlSessionFactoryBuilder().build(resourceAsStream);
//獲得sqlSession對象
SqlSession sqlSession = sqlSessionFactory.openSession();
//執行sql語句
List<User> userList = sqlSession.selectList("userMapper.findAll");
//打印結果
System.out.println(userList);
//釋放資源
sqlSession.close();

2.4 知識小結

MyBatis開發步驟:

①添加MyBatis的座標

②創建user數據表

③編寫User實體類

④編寫映射文件UserMapper.xml

⑤編寫核心文件SqlMapConfig.xml

⑥編寫測試類

3. MyBatis的映射文件概述

在這裏插入圖片描述

4. MyBatis的增刪改查操作

4.1 MyBatis的插入數據操作

1)編寫UserMapper映射文件

<mapper namespace="userMapper">    
	<insert id="add" parameterType="com.qf.domain.User">        
		insert into user values(#{id},#{username},#{password})    
	</insert>
</mapper>

2)編寫插入實體User的代碼

InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new 
                        SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
int insert = sqlSession.insert("userMapper.add", user);
System.out.println(insert);
//提交事務
sqlSession.commit();
sqlSession.close();

3)插入操作注意問題

• 插入語句使用insert標籤

• 在映射文件中使用parameterType屬性指定要插入的數據類型

•Sql語句中使用#{實體屬性名}方式引用實體中的屬性值

•插入操作使用的API是sqlSession.insert(“命名空間.id”,實體對象);

•插入操作涉及數據庫數據變化,所以要使用sqlSession對象顯示的提交事務,即sqlSession.commit()

4.2 MyBatis的修改數據操作

1)編寫UserMapper映射文件

<mapper namespace="userMapper">
    <update id="update" parameterType="com.qf.domain.User">
        update user set username=#{username},password=#{password} where id=#{id}
    </update>
</mapper>

2)編寫修改實體User的代碼

InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
int update = sqlSession.update("userMapper.update", user);
System.out.println(update);
sqlSession.commit();
sqlSession.close();

3)修改操作注意問題

• 修改語句使用update標籤

• 修改操作使用的API是sqlSession.update(“命名空間.id”,實體對象);

4.3 MyBatis的刪除數據操作

1)編寫UserMapper映射文件

<mapper namespace="userMapper">
    <delete id="delete" parameterType="java.lang.Integer">
        delete from user where id=#{id}
    </delete>
</mapper>

2)編寫刪除數據的代碼

InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
int delete = sqlSession.delete("userMapper.delete",3);
System.out.println(delete);
sqlSession.commit();
sqlSession.close();

3)刪除操作注意問題

• 刪除語句使用delete標籤

•Sql語句中使用#{任意字符串}方式引用傳遞的單個參數

•刪除操作使用的API是sqlSession.delete(“命名空間.id”,Object);

4.4 知識小結

增刪改查映射配置與API:
查詢數據: List<User> userList = sqlSession.selectList("userMapper.findAll");
    <select id="findAll" resultType="com.qf.domain.User">
        select * from User
    </select>
添加數據: sqlSession.insert("userMapper.add", user);
    <insert id="add" parameterType="com.qf.domain.User">
        insert into user values(#{id},#{username},#{password})
    </insert>
修改數據: sqlSession.update("userMapper.update", user);
    <update id="update" parameterType="com.qf.domain.User">
        update user set username=#{username},password=#{password} where id=#{id}
    </update>
刪除數據:sqlSession.delete("userMapper.delete",3);
    <delete id="delete" parameterType="java.lang.Integer">
        delete from user where id=#{id}
    </delete>

5. MyBatis核心配置文件概述

5.1 MyBatis核心配置文件層級關係

在這裏插入圖片描述

5.2 MyBatis常用配置解析

1)environments標籤

數據庫環境的配置,支持多環境配置

在這裏插入圖片描述

其中,事務管理器(transactionManager)類型有兩種:

•JDBC:這個配置就是直接使用了JDBC 的提交和回滾設置,它依賴於從數據源得到的連接來管理事務作用域。

•MANAGED:這個配置幾乎沒做什麼。它從來不提交或回滾一個連接,而是讓容器來管理事務的整個生命週期(比如 JEE 應用服務器的上下文)。 默認情況下它會關閉連接,然而一些容器並不希望這樣,因此需要將 closeConnection 屬性設置爲 false 來阻止它默認的關閉行爲。

其中,數據源(dataSource)類型有三種:

•UNPOOLED:這個數據源的實現只是每次被請求時打開和關閉連接。

•POOLED:這種數據源的實現利用“池”的概念將 JDBC 連接對象組織起來。

•JNDI:這個數據源的實現是爲了能在如 EJB 或應用服務器這類容器中使用,容器可以集中或在外部配置數據源,然後放置一個 JNDI 上下文的引用。

2)mapper標籤

該標籤的作用是加載映射的,加載方式有如下幾種:

•使用相對於類路徑的資源引用,例如:

•使用完全限定資源定位符(URL),例如:

•使用映射器接口實現類的完全限定類名,例如:

•將包內的映射器接口實現全部註冊爲映射器,例如:

3)Properties標籤

實際開發中,習慣將數據源的配置信息單獨抽取成一個properties文件,該標籤可以加載額外配置的properties文件

在這裏插入圖片描述

5.3 知識小結

核心配置文件常用配置:

properties標籤:該標籤可以加載外部的properties文件

<properties resource="jdbc.properties"></properties>

typeAliases標籤:設置類型別名

<typeAlias type="com.qf.domain.User" alias="user"></typeAlias>

mappers標籤:加載映射配置

<mapper resource="com/qf/mapper/UserMapping.xml"></mapper>

environments標籤:數據源環境配置標籤

在這裏插入圖片描述

6.MyBatis相應API

6.1 SqlSession工廠構建器SqlSessionFactoryBuilder

常用API:SqlSessionFactory build(InputStream inputStream)

通過加載mybatis的核心文件的輸入流的形式構建一個SqlSessionFactory對象

String resource = "org/mybatis/builder/mybatis-config.xml"; 
InputStream inputStream = Resources.getResourceAsStream(resource); 
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); 
SqlSessionFactory factory = builder.build(inputStream);

其中, Resources 工具類,這個類在 org.apache.ibatis.io 包中。Resources 類幫助你從類路徑下、文件系統或一個 web URL 中加載資源文件。

6.2 SqlSession工廠對象SqlSessionFactory

SqlSessionFactory 有多個個方法創建SqlSession 實例。常用的有如下兩個:

在這裏插入圖片描述

6.3 SqlSession會話對象

SqlSession 實例在 MyBatis 中是非常強大的一個類。在這裏你會看到所有執行語句、提交或回滾事務和獲取映射器實例的方法。

執行語句的方法主要有:

<T> T selectOne(String statement, Object parameter) 
<E> List<E> selectList(String statement, Object parameter) 
int insert(String statement, Object parameter) 
int update(String statement, Object parameter) 
int delete(String statement, Object parameter)

操作事務的方法主要有:

void commit()  
void rollback() 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章