­

Mybatis第二篇| CRUD,這才是程式設計師入門第一課

原創| kuls 首發: JAVAandPython君

目錄

1.Mybatis第一篇|我的第一個Mybatis程式

前言

增刪改查(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!