1. 程式人生 > 實用技巧 >【01-Mybatis快速入門】

【01-Mybatis快速入門】

1.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資料表

  1. 編寫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.itheima.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/itheima/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.itheima.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.itheima.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.itheima.domain.User">
        select * from User
    </select>
新增資料: sqlSession.insert("userMapper.add", user);
    <insert id="add" parameterType="com.itheima.domain.User">
        insert into user values(#{id},#{username},#{password})
    </insert>
修改資料: sqlSession.update("userMapper.update", user);
    <update id="update" parameterType="com.itheima.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檔案

4)typeAliases標籤

類型別名是為Java 型別設定一個短的名字。原來的型別名稱配置如下

配置typeAliases,為com.itheima.domain.User定義別名為user

上面我們是自定義的別名,mybatis框架已經為我們設定好的一些常用的型別的別名

5.3 知識小結

核心配置檔案常用配置:

properties標籤:該標籤可以載入外部的properties檔案

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

typeAliases標籤:設定類型別名

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

mappers標籤:載入對映配置

<mapper resource="com/itheima/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()