Mybatis第二篇| CRUD,這才是程式設計師入門第一課
- 2020 年 4 月 2 日
- 筆記
原創| kuls 首發: JAVAandPython君
目錄
前言
增刪改查(CRUD)是程式設計師必會的技能,我們大部分的時間也都是消耗在增刪改查上,當然我們不能只做一個只會CRUD的程式設計師,當我們掌握並且熟練了CRUD後,我們可以對CRUD進行進一步的優化。這篇文章主要講解的是如何通過Mybatis來實現CRUD
。

XML映射器
大家可能會疑惑xml映射器是個啥玩意,其實簡單點說,就是上一篇文章中的UserMapper.xml那玩意,我們來看看文檔里怎麼說的

MyBatis 的真正強大在於它的語句映射,這是它的魔力所在。由於它的異常強大,映射器的 XML 文件就顯得相對簡單。如果拿它跟具有相同功能的 JDBC 程式碼進行對比,你會立即發現省掉了將近 95% 的程式碼。MyBatis 致力於減少使用成本,讓用戶能更專註於 SQL 程式碼。 」
上面就是截取官方文檔上的文字,簡單粗暴點說就是比JDBC牛逼,然後讓我們專註於SQL的程式碼的編寫。
<!--namespace綁定對應的介面--> <mapper namespace="com.kuls.dao.UserMapper"> <select id="getUserList" resultType="com.kuls.pojo.User"> select * from mybatis.user </select> </mapper>
上面的程式碼是我們上篇文章中的UserMapper.xml程式碼,可以看出<select>標籤中我們寫了一個常見的Select語句,相應的update、insert…都是通過相應的標籤來定義的。
官方也給出了一些相應的標籤:

我們接下來一個一個講解:
namespace
首先我們來看下namespace這個屬性,從字面意思上就可以看出是命名空間,也就是說我們需要設置一個此xml文件對應的Mapper介面,這裡我們只需要記住namespace中的包名要和Dao/mapper介面的包名保持一致
select
select我們應該不陌生,下面直接給大家一串程式碼看看Mybatis中的select怎麼寫?
UserMapper.java
public interface UserMapper { //查詢全部用戶 List<User> getUserList(); }
UserMapper.xml
<!--namespace綁定對應的介面--> <mapper namespace="com.kuls.dao.UserMapper"> <select id="getUserList" resultType="com.kuls.pojo.User"> select * from mybatis.user </select> </mapper>
需要注意的是:
- id為
UserMapper介面
中的方法名
resultType
也就是查詢返回結果的類型,很顯然,我們這裡查詢的是所有的用戶,那麼肯定為User類,這裡我們需要把實體類的全部路徑
寫出來(在後面我們會學習更簡單的寫法)- 關於select標籤中的屬性配置,官方文檔中都有說明(下圖),大家看不懂也沒關係,我們後面都會有涉及到。

我們通過測試類可以來測試一下:

@Test public void test(){ //MybatisUtils為我們上篇文章中所編寫的工具類 SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<User> userList = mapper.getUserList(); for (User user : userList) { System.out.println(user); } sqlSession.close(); }

我們還可以通過id來查詢User對象:UserMapper.java
public interface UserMapper { //查詢全部用戶 List<User> getUserList(); //根據id獲取用戶 User getIdUser(int id); }
相應的UserMapper.xml
<select id="getIdUser" resultType="com.kuls.pojo.User" parameterType="int"> select * from mybatis.user where id=#{id} </select>
insert
在UserMapper.java介面中添加一個方法:
//插入一個用戶 int insertUser(User user);
UserMapper.xml
<insert id="insertUser" parameterType="com.kuls.pojo.User"> insert into mybatis.user (id, name, pwd) values (#{id}, #{name}, #{pwd}); </insert>
說明:
- id必須和介面方法同名
- 因為我們介面方法中需要一個User類的參數,所以
parameterType
就代表著我們介面方法中需要參數的類型
最後編寫我們的測試類:
@Test public void insertUser(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); int res = mapper.insertUser(new User(4, "kuls", "123123")); if (res > 0){ System.out.println("插入成功"); } //提交事務!!! sqlSession.commit(); //關閉連接 sqlSession.close(); }
上面的測試類中我們會發現多了一句程式碼:sqlSession.commit();這一句程式碼就是事務的提交,這個跟我們學習JDBC比較類似。
update
同樣是在UserMapper.java中添加一個介面方法:
//更新用戶數據 int upDataUser(User user);
UserMapper.xml
<update id="upDataUser" parameterType="com.kuls.pojo.User"> update mybatis.user set name=#{name}, pwd=#{pwd} where id=#{id}; </update>
相信大家這段程式碼應該能夠看懂了,這裡也就不再多說
測試類:
@Test public void upDataUser(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); int i = mapper.upDataUser(new User(2, "我是劉爽", "123333")); if (i>0){ System.out.println("更新成功"); } sqlSession.commit(); sqlSession.close(); }
delete
在UserMapper.java中添加一個介面方法
//根據id刪除一個用戶 int deleteUser(int id);
UserMapper.xml
<delete id="deleteUser" parameterType="int"> delete from mybatis.user where id=#{id}; </delete>
在insert、delete、update標籤屬性中,官方文檔也給出了說明

通過map來插入數據
通過map來插入數據是什麼意思呢?首先給大家看完程式碼之後進行說明
同樣在UserMapper.java中添加介面方法
//根據map來插入用戶 int insertUser1(HashMap<String,Object> map);
大家看到,我們的參數是一個HashMap,也就是說我們待會需要插入的數據都是通過HashMap傳送過來的。
UserMapper.xml:
<insert id="insertUser1" parameterType="map"> <!--傳遞map 的key 如果我們的實體類或者數據表中的欄位太多,我們可以使用map--> insert into mybatis.user (id, name, pwd) values (#{userid}, #{username}, #{userpwd}); </insert>
大家可以看到上面的parameterType為map類型,這就說明我們需要傳入一個map類型的參數。那麼到底有啥用呢?在注釋中,我也寫了如果我們的實體類或者數據表中的欄位太多,我們可以使用map
我們再來看下我們測試類中是怎麼寫的:
@Test public void insertUser1(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); HashMap<String, Object> map = new HashMap<>(); map.put("userid",5); map.put("username","第五個"); map.put("userpwd","123123123"); int i = mapper.insertUser1(map); if (i>0){ System.out.println("success"); } sqlSession.commit(); sqlSession.close(); }
大家會注意到
insert into mybatis.user (id, name, pwd) values (#{userid}, #{username}, #{userpwd});
HashMap<String, Object> map = new HashMap<>(); map.put("userid",5); map.put("username","第五個"); map.put("userpwd","123123123");
注意:這裡map傳入的鍵名和我們xml中values後面的名稱是相同的,這也說明我們再xml中的insert語句中可以隨意命名,只要map中傳入的鍵值對的鍵名和其相同即可。
這裡需要說明的是在實際開發和大部分開發下,使用Map的情況會比較多,因為這種方法非常的清晰明了,而且在實際開發中的參數都是非常多的,很適合通過Map來傳值。 」
補充知識
這裡補充一個知識,後面我們也會有寫到,但是提前告訴大家,防止大家在寫上面程式碼時候報錯。
其實在上篇文章中有寫到,就是每次我們寫一個介面類也就是UserMapper.java時候,我們都需要進行綁定。

在官方文檔中也有說到

從圖中,我們看到有四種方式來進行綁定映射,我們目前使用的是第三種,也就是class的綁定方式,這些配置會告訴 MyBatis 去哪裡找映射文件。
本文程式碼
完整程式碼:
https://github.com/hellokuls/kuls-mybatis
之後該系列的程式碼和文章
全部放在這個GitHub項目,歡迎大家star!