MyBatis入門學習——環境搭建
在MyBatis官方文件上是這樣說的:
MyBatis 是一款優秀的持久層框架,它支援定製化 SQL、儲存過程以及高階對映。MyBatis 避免了幾乎所有的 JDBC 程式碼和手動設定引數以及獲取結果集。MyBatis 可以使用簡單的 XML 或註解來配置和對映原生資訊,將介面和 Java 的 POJOs(Plain Old Java Objects,普通的 Java物件)對映成資料庫中的記錄。
首先MyBatis是一個框架,那麼什麼是框架?通俗的說框架就是具有特定約束性的工具類.框架就是為解決問題制定的一套約束,在提供功能基礎上進行擴充. 框架中一些不能被封裝的程式碼(變數),需要使用框架者新建一個配置檔案,在檔案中新增變數內容. 配置檔案需要建立在特定位置和特定名稱 通過反射技術例項化配置檔案中的類並獲取到類屬性的值。從而達到解決某類問題的目的,凡是框架都是為了簡便開發而誕生的
MyBatis是一個持久層框架。持久層框架解決的就是資料訪問的問題,那麼MyBatis的功能就是連線資料庫進行CRUD操作,而為了優化CRUD操作還提供了資料庫連線池、事務管理、資料表的對映等一系列功能。其實MyBatis的底層就是對JDBC進行了封裝而已。
學習一個框架的**第一步**就是搭建所需要的環境,這個環境指的就是所需要的Jar包和依賴的配置檔案。下面就是MyBatis所以依賴的包。
MyBatis對配置檔案沒有名稱上的要求,路徑一般全域性配置檔案放在classes根部錄下也就是src或resources下。
我們看一下全域性的MyBatis配置檔案的格式:
<?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 --> <configuration> <!-- default引用的是environment標籤的id,意思是當前是用的環境 --> <environments default="MySql"> <!-- 宣告可以是用的環境,id環境唯一標識 --> <environment id="MySql"> <!-- 事務管理器 type=[JDBC|MANAGED] MyBatis 中有兩種型別的事務管理器 JDBC – 這個配置就是直接使用了JDBC的提交和回滾設定,它依賴於從資料來源得到的連線來管理事務作用域。 MANAGED – 這個配置就是讓容器來管理事務的整個生命週期,或許框架整合時會說這個配置。 --> <transactionManager type="JDBC"></transactionManager> <!-- 資料來源配置 使用標準的 JDBC 資料來源介面來配置 JDBC 連線物件的資源。 有三種內建的資料來源型別(也就是 type=[UNPOOLED|POOLED|JNDI]) UNPOOLED:不使用連線池每次請求都會建立新的資料連線物件 POOLED:使用連線池方式 JNDI:使用JNDI方式 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/test" /> <property name="username" value="root" /> <property name="password" value="123456" /> </dataSource> </environment> </environments> <!-- 對映器 MyBatis 的行為已經由上述元素配置完了,我們現在就要定義 SQL 對映語句了。 但是首先我們需要告訴 MyBatis 到哪裡去找到這些語句。 Java 在自動查詢這方面沒有提供一個很好的方法,所以最佳的方式是告訴 MyBatis 到哪裡去找對映檔案。 --> <mappers> <!-- 使用相對於類路徑的資源引用 --> <mapper resource="org/mybatis/builder/AuthorMapper.xml"/> <!-- 使用完全限定資源定位符(URL)基本不會使用 --> <mapper url="file:///var/mappers/AuthorMapper.xml"/> <!-- 使用對映器介面實現類的完全限定類名 --> <mapper class="org.mybatis.builder.AuthorMapper"/> <!-- 將包內的對映器介面實現全部註冊為對映器 --> <package name="org.mybatis.builder"/> </mappers> </configuration>
MyBatis 的真正強大在於它的對映語句,也是它的魔力所在。由於它的異常強大,對映器的 XML 檔案就顯得相對簡單。如果拿它跟具有相同功能的 JDBC 程式碼進行對比,你會立即發現省掉了將近 95% 的程式碼。MyBatis 就是針對 SQL 構建的,並且比普通的方法做的更好。
SQL 對映檔案有很少的幾個頂級元素(按照它們應該被定義的順序):
- cache – 給定名稱空間的快取配置。
- cache-ref – 其他名稱空間快取配置的引用。
- resultMap – 是最複雜也是最強大的元素,用來描述如何從資料庫結果集中來載入物件。
- sql – 可被其他語句引用的可重用語句塊。
- insert – 對映插入語句
- update – 對映更新語句
- delete – 對映刪除語句
- select – 對映查詢語句
接下來我們看一下mapper對映器配置檔案的格式:
<?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">
<!--
對映器 namespace名稱空間 用於語句隔離
-->
<mapper namespace="org.mybatis.example.AuthorMapper">
<!--
select 查詢
id 在名稱空間中唯一的識別符號,可以被用來引用這條語句。
parameterType 引數型別
resultType 返回值型別
-->
<select id="selectAuthor" parameterType="int" resultType="hashmap">
SELECT * FROM Author WHERE ID = #{id}
</select>
<!--
insert 插入
id 在名稱空間中唯一的識別符號,可以被用來引用這條語句。
parameterType 引數型別
-->
<insert id="insertAuthor" parameterType="org.mybatis.example.Author">
insert into Author (id,username,password,email,bio)
values (#{id},#{username},#{password},#{email},#{bio})
</insert>
<!--
update 修改
id 在名稱空間中唯一的識別符號,可以被用來引用這條語句。
parameterType 引數型別
-->
<update id="updateAuthor" parameterType="org.mybatis.example.Author">
update Author set
username = #{username},
password = #{password},
email = #{email},
bio = #{bio}
where id = #{id}
</update>
<!--
delete 刪除
id 在名稱空間中唯一的識別符號,可以被用來引用這條語句。
parameterType 引數型別
-->
<delete id="deleteAuthor" parameterType="int">
delete from Author where id = #{id}
</delete>
</mapper>
環境搭建好後我們怎麼使用呢?
public class TestMybatis {
public static void main(String[] args) throws IOException {
//載入全域性配置檔案
InputStream is = Resources.getResourceAsStream("Mybatis.xml");
//建立SqlSessionFactory
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//獲取SqlSession
SqlSession sqlSession = factory.openSession();
Map<String,Integer> map = new HashMap<>();
map.put("id", 1);
//執行SQL獲取結果
List<Author> list = sqlSession.selectList("org.mybatis.example.AuthorMapper.selectAuthor", map);
//關閉SqlSession
sqlSession.close();
}
}
每個基於 MyBatis 的應用都是以一個 SqlSessionFactory 的例項為中心的。SqlSessionFactory是SqlSession的工廠,而SqlSession就相當於JDBC中的執行器一樣,它可以執行SQL並返回結果。而 SqlSessionFactory 則是通過我們剛剛配置的全域性配置檔案MyBatis.xml建立的。