Mybatis快速入門
作者:季沐測試筆記
原文地址:https://www.cnblogs.com/testero/p/15423051.html
部落格主頁:https://www.cnblogs.com/testero
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>
- 建立user資料表
- 編寫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>
- 編寫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()