MyBatis是啥子东西?是一个DAO层的框架
文章目錄
- 一、MyBatis 介紹
- 二、入門 MyBatis
- 三、源碼示例
- 第一站:查
- 第二站:增
- 第三站:刪
- 第四站:改
- 四、更多使用說明
- 映射文件
- 核心配置文件
- 相應API方法
一、MyBatis 介紹
MyBatis 是一個優秀的基于 Java 的持久層框架(是一個DAO層的框架),它內部封裝了 JDBC,使開發者只需要關注 sql 語句本身,而不需要花費精力去處理加載驅動、創建連接、創建 statement 等繁雜的過程。
MyBatis 通過 xml 或注解的方式將要執行的各種 statement 配置起來,并通過 Java 對象和 statement 中 sql 的動態參數進行映射生成最終執行的 sql 語句。最后 MyBatis 框架執行 sql 并將結果映射為 Java 對象并返回。
MyBatis 的過去: MyBatis本是apache的一個開源項目iBatis,2010年這個項目由apache software foundation遷移到了google code ,并且改名為MyBatis。2013年11月遷移到Github。
名字由來:iBATIS一詞來源于“internet”和“abatis”的組合,是一個基于Java的持久層框架。iBATIS提供的持久層框架包括SQL Maps和Data Access Objects(DAOs)。
當前,最新版本是MyBatis 3.5.9,其發布時間是2021年12月26日。
優點: 采用 ORM 思想解決了實體和數據庫映射的問題,對 JDBC 進行了封裝,屏蔽了 JDBC API 底層訪問細節,使我們不用與 JDBC API 打交道,就可以完成對數據庫的持久化操作。
二、入門 MyBatis
前面的介紹我們提到了DAO層、JDBC、sql語句本身、映射等。下面來簡單說說使用 MyBatis 的六大步驟:
① 添加 MyBatis 的坐標
② 創建 user 數據表
③ 編寫 User 實體類
④ 編寫映射文件 UserMapper.xml
⑤ 編寫核心配置文件 SqlMapConfig.xml
⑥ 編寫 DAO 層,使用動態代理實現
第①步中的“坐標”就相當于是在引入jar包,假設我們是用 Maven 進行的開發,那么可以在 pox.xml 文件中寫你需要的 MyBatis 依賴,示例如下:
<dependencies>……<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.6</version></dependency>…… </dependencies>第②、③步創建數據表和實體類不用多說。
第④步提到了映射文件:UserMapper.xml,該文件的名字一般由實體類+Mapper組成,文件里面是sql語句,相當于 DAO 層接口的實現類。但這個文件的存放位置有點講究,它在resource目錄下的某個包里,這個包名必須跟實體類的包名同步,舉例說明,實體類 User.java 放在 com.***.domain 下,那么映射文件 UserMapper.xml 的包名得是 com.***.mapper 。映射文件中的sql語句的參數不再用?做占位符了,寫法變為 #{實體類屬性名} 。
第⑤步是編寫核心配置文件:SqlMapConfig.xml,里面是數據庫連接的四要素、事務管理器等。它直接放在resource目錄下即可。
第⑥步編寫DAO層接口,并使用動態代理的方式編寫測試類,有四個點需要注意:1、映射文件中的namespace與接口類的全限定名相同;2、接口類中的方法名要和映射文件中定義的每個sql的id值相同;3、接口類中的方法的輸入參數類型要和映射文件中定義的每個sql的parameterType的類型相同;4、接口類中的方法的輸出參數類型要和mapper.xml中定義的每個sql的resultType的類型相同。
三、源碼示例
源碼只舉例第④、⑥步的代碼,其他幾步就不多說了!
第④步 核心配置文件 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><!-- 通過properties標簽加載外部properties文件 --><properties resource="jdbc.properties"></properties><!-- 自定義別名 --><typeAliases><typeAlias type="com.***.domain.User" alias="user"></typeAlias></typeAliases><!--數據源環境--><environments default="developement"><environment id="developement"><transactionManager type="JDBC"></transactionManager><dataSource type="POOLED"><property name="driver" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><!-- 加載映射文件 --><mappers> <mapper resource="com/***/mapper/UserMapper.xml"/> </mappers> </configuration>jdbc.properties 源碼:
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/你的數據庫名 jdbc.username=登錄名 jdbc.password=登錄密碼第一站:查
編寫映射文件 UserMapper.xml (映射文件相當于DAO層接口的實現類):
<?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="com.***.dao.UserMapper"> <!--查詢所有--><select id="findAll" resultType="user"> select * from User </select><!--根據id進行查詢--><select id="findById" resultType="user" parameterType="int">select * from user where id=#{id}</select> </mapper>如果使用動態代理實現,那么 DAO 層的接口類 UserMapper.java 源碼如下:
package com.***.dao;import com.***.domain.User; import java.io.IOException; import java.util.List;public interface UserMapper {public List<User> findAll() throws IOException;public User findById(int id); }編寫測試類,使用代理開發方式調用 DAO 層:
//加載核心配置文件 InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); //獲得sqlSession工廠對象 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); //獲得sqlSession對象 SqlSession sqlSession = sqlSessionFactory.openSession(); //獲得MyBatis框架生成的UserMapper接口的實現類 UserMapper mapper = sqlSession.getMapper(UserMapper.class); //查詢所有 List<User> all = mapper.findAll(); System.out.println(all);//根據id進行查詢 User user = mapper.findById(1); System.out.println(user); sqlSession.close();第二站:增
編寫映射文件 UserMapper.xml :
<mapper namespace="com.***.dao.UserMapper"> <!--插入操作--><insert id="add" parameterType="user"> insert into user values(#{id},#{username},#{password}) </insert> </mapper>DAO 層接口類 UserMapper.java 的源碼增加內容如下:
public void add(User user);編寫測試類,使用代理開發方式調用 DAO 層:
//模擬user對象 User user = new User(); user.setId(2); user.setUsername("lucy"); user.setPassword("1234");InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(); //獲得MyBatis框架生成的UserMapper接口的實現類 UserMapper mapper = sqlSession.getMapper(UserMapper.class); //增 mapper.add(); sqlSession.commit(); sqlSession.close();第三站:刪
編寫映射文件 UserMapper.xml :
<mapper namespace="com.***.dao.UserMapper"><!--刪除操作--><delete id="delete" parameterType="int">delete from user where id=#{id}</delete> </mapper>DAO 層接口類 UserMapper.java 的源碼增加內容如下:
public void delete(int id);編寫測試類,使用代理開發方式調用 DAO 層:
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(); //獲得MyBatis框架生成的UserMapper接口的實現類 UserMapper mapper = sqlSession.getMapper(UserMapper.class); //增 mapper.delete(2); sqlSession.commit(); sqlSession.close();第四站:改
編寫映射文件 UserMapper.xml :
<mapper namespace="com.***.dao.UserMapper"><!--修改操作--><update id="update" parameterType="user">update user set username=#{username},password=#{password} where id=#{id}</update> </mapper>DAO 層接口類 UserMapper.java 的源碼增加內容如下:
public void update(User user);編寫測試類,使用代理開發方式調用 DAO 層:
//模擬user對象 User user = new User(); user.setId(2); user.setUsername("kang"); user.setPassword("kang");InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(); //獲得MyBatis框架生成的UserMapper接口的實現類 UserMapper mapper = sqlSession.getMapper(UserMapper.class); //增 mapper.update(user); sqlSession.commit(); sqlSession.close();四、更多使用說明
映射文件
映射文件如 UserMapper.xml 中各部分代碼說明:
優化映射文件:使用動態sql語句
動態sql語句的實現常用 <if> 判斷或者 <foreach> 循環標簽。用 <if> 實現不同條件下的查詢,UserMapper.xml 源碼示例:
<?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="com.***.dao.UserMapper"> <!-- 不同條件下的查詢 --><select id="findByCondition" parameterType="user" resultType="user">select * from user<where><if test="id!=0">and id=#{id}</if><if test="username!=null">and username=#{username}</if><if test="password!=null">and password=#{password}</if></where></select> </mapper>用 <foreach> 實現同一條件下多種情況的查詢,UserMapper.xml 源碼示例:
<?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="com.***.dao.UserMapper"> <!-- 同一條件下多種情況的查詢 --><select id="findByIds" parameterType="list" resultType="user">select * from user<where><foreach collection="list" open="id in(" close=")" item="id" separator=",">#{id}</foreach></where></select> </mapper><foreach> 標簽用于遍歷集合,它的屬性含義如下:
-
collection:代表要遍歷的集合元素,注意編寫時不要寫#{}
-
open:代表語句的開始部分
-
close:代表結束部分
-
item:代表遍歷集合的每個元素,生成的變量名
-
sperator:代表分隔符
核心配置文件
文件中使用的所有標簽如下圖所示。標簽在文件中的先后就是圖片上的順序(如 mapper 不能放在 environments 標簽之前)。
| properties 屬性 | 實際開發中,習慣將數據源的配置信息單獨抽取成一個properties文件(如jdbc.properties文件),該標簽可以加載額外配置的properties文件。 |
| typeAliases 類型別名 | |
| environments 環境 | 其中,事務管理器(transactionManager)類型有兩種: - JDBC,這個配置就是直接使用了JDBC 的提交和回滾設置,它依賴于從數據源得到的連接來管理事務作用域。 - MANAGED,這個配置幾乎沒做什么。它從來不提交或回滾一個連接,而是讓容器來管理事務的整個生命周期(比如 JEE 應用服務器的上下文)。默認情況下它會關閉連接,然而一些容器并不希望這樣,因此需要將 closeConnection 屬性設置為 false 來阻止它默認的關閉行為。 數據源(dataSource)類型有三種: - UNPOOLED,這個數據源的實現只是每次被請求時打開和關閉連接。 - POOLED,這種數據源的實現利用“池”的概念將 JDBC 連接對象組織起來。 - JNDI,這個數據源的實現是為了能在如 EJB 或應用服務器這類容器中使用,容器可以集中或在外部配置數據源,然后放置一個 JNDI 上下文的引用。 |
| mapper 映射器 | 該標簽的作用是加載映射的。加載方式有四種,常用第一種。 1. 使用相對于類路徑的資源引用,例如?<mapper resource="org/mybatis/builder/AuthorMapper.xml"/> 2. 使用完全限定資源定位符(URL),例如?<mapper url="file:///var/mappers/AuthorMapper.xml"/> 3. 使用映射器接口實現類的完全限定類名,例如?<mapper class="org.mybatis.builder.AuthorMapper"/> 4. 將包內的映射器接口實現全部注冊為映射器,例如?<package name="org.mybatis.builder"/> |
相應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 中加載資源文件。
SqlSessionFactory 有多個個方法創建SqlSession 實例。常用的有如下兩個:
| openSession() | 會默認開啟一個事務,但事務不會自動提交,也就意味著需要手動提交該事務,更新操作數據才會持久化到數據庫中。 |
| openSession(boolean autoCommit) | 參數為是否自動提交,如果設置為true,那么不需要手動提交事務。 |
SqlSession 實例在 MyBatis 中是非常強大的一個類。在這里你會看到所有執行語句、提交或回滾事務和獲取映射器實例的方法。
| T selectOne(String statement, Object parameter) |
| List 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() |
總結
以上是生活随笔為你收集整理的MyBatis是啥子东西?是一个DAO层的框架的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【bzoj4084】【sdoi2015】
- 下一篇: 暑期实训第二周周一周二总结