MyBatis04:使用註解開發

回顧上一章:MyBatis03:ResultMap及分頁

面向接口編程

  • 大家之前都學過面向對象編程,也學習過接口,但在真正的開發中,很多時候我們會選擇面向接口編程

  • 根本原因 :  解耦 , 可拓展 , 提高複用 , 分層開發中 , 上層不用管具體的實現 , 大家都遵守共同的標準 , 使得開發變得容易 , 規範性更好

  • 在一個面向對象的系統中,系統的各種功能是由許許多多的不同對象協作完成的。在這種情況下,各個對象內部是如何實現自己的,對系統設計人員來講就不那麼重要了;

  • 而各個對象之間的協作關係則成爲系統設計的關鍵。小到不同類之間的通信,大到各模塊之間的交互,在系統設計之初都是要着重考慮的,這也是系統設計的主要工作內容。面向接口編程就是指按照這種思想來編程。

 

關於接口的理解

  • 接口從更深層次的理解,應是定義(規範,約束)與實現(名實分離的原則)的分離。

  • 接口的本身反映了系統設計人員對系統的抽象理解。

  • 接口應有兩類:

    • 第一類是對一個個體的抽象,它可對應爲一個抽象體(abstract class);

    • 第二類是對一個個體某一方面的抽象,即形成一個抽象面(interface);

  • 一個體有可能有多個抽象面。抽象體與抽象面是有區別的。

 

三個面向區別

  • 面向對象是指,我們考慮問題時,以對象爲單位,考慮它的屬性及方法 .

  • 面向過程是指,我們考慮問題時,以一個具體的流程(事務過程)爲單位,考慮它的實現 .

  • 接口設計與非接口設計是針對複用技術而言的,與面向對象(過程)不是一個問題.更多的體現就是對系統整體的架構

     

利用註解開發

  • mybatis最初配置信息是基於 XML ,映射語句(SQL)也是定義在 XML 中的。而到MyBatis 3提供了新的基於註解的配置。不幸的是,Java 註解的的表達力和靈活性十分有限。最強大的 MyBatis 映射並不能用註解來構建

  • sql 類型主要分成 :

    • @select ()

    • @update ()

    • @Insert ()

    • @delete ()

 

注意:利用註解開發就不需要mapper.xml映射文件了 .

1、我們在我們的接口中添加註解

//查詢全部用戶
@Select("select id,name,pwd password from user")
public List<User> getAllUser();

2、在mybatis的核心配置文件中注入

<!--使用class綁定接口-->
<mappers>
   <mapper class="com.kuang.mapper.UserMapper"/>
</mappers>

3、我們去進行測試

@Test
public void testGetAllUser() {
   SqlSession session = MybatisUtils.getSession();
   //本質上利用了jvm的動態代理機制
   UserMapper mapper = session.getMapper(UserMapper.class);

   List<User> users = mapper.getAllUser();
   for (User user : users){
       System.out.println(user);
  }

   session.close();
}

4、利用Debug查看本質

5、本質上利用了jvm的動態代理機制

6、Mybatis詳細的執行流程

註解增刪改

改造MybatisUtils工具類的getSession( ) 方法,重載實現。

  
  //獲取SqlSession連接
  public static SqlSession getSession(){
      return getSession(true); //事務自動提交
  }
 
  public static SqlSession getSession(boolean flag){
      return sqlSessionFactory.openSession(flag);
  }

【注意】確保實體類和數據庫字段對應

查詢:

1、編寫接口方法註解

//根據id查詢用戶
@Select("select * from user where id = #{id}")
User selectUserById(@Param("id") int id);

2、測試

@Test
public void testSelectUserById() {
   SqlSession session = MybatisUtils.getSession();
   UserMapper mapper = session.getMapper(UserMapper.class);

   User user = mapper.selectUserById(1);
   System.out.println(user);

   session.close();
}

新增:

1、編寫接口方法註解

//添加一個用戶
@Insert("insert into user (id,name,pwd) values (#{id},#{name},#{pwd})")
int addUser(User user);

2、測試

@Test
public void testAddUser() {
   SqlSession session = MybatisUtils.getSession();
   UserMapper mapper = session.getMapper(UserMapper.class);

   User user = new User(6, "秦疆", "123456");
   mapper.addUser(user);

   session.close();
}

修改:

1、編寫接口方法註解

//修改一個用戶
@Update("update user set name=#{name},pwd=#{pwd} where id = #{id}")
int updateUser(User user);

2、測試

@Test
public void testUpdateUser() {
   SqlSession session = MybatisUtils.getSession();
   UserMapper mapper = session.getMapper(UserMapper.class);

   User user = new User(6, "秦疆", "zxcvbn");
   mapper.updateUser(user);

   session.close();
}

刪除:

1、編寫接口方法註解

//根據id刪除用
@Delete("delete from user where id = #{id}")
int deleteUser(@Param("id")int id);

2、測試

@Test
public void testDeleteUser() {
   SqlSession session = MybatisUtils.getSession();
   UserMapper mapper = session.getMapper(UserMapper.class);

   mapper.deleteUser(6);
   
   session.close();
}

【注意點:增刪改一定記得對事務的處理】

 

關於@Param

@Param註解用於給方法參數起一個名字。以下是總結的使用原則:

  • 在方法只接受一個參數的情況下,可以不使用@Param。

  • 在方法接受多個參數的情況下,建議一定要使用@Param註解給參數命名。

  • 如果參數是 JavaBean , 則不能使用@Param。

  • 不使用@Param註解時,參數只能有一個,並且是Javabean。

#與$的區別

  • #{} 的作用主要是替換預編譯語句(PrepareStatement)中的佔位符? 【推薦使用】

    INSERT INTO user (name) VALUES (#{name});
    INSERT INTO user (name) VALUES (?);

     

  • ${} 的作用是直接進行字符串替換

    INSERT INTO user (name) VALUES ('${name}');
    INSERT INTO user (name) VALUES ('kuangshen');

     

使用註解和配置文件協同開發,纔是MyBatis的最佳實踐!

 

使用註解開發可以提高我們的開發效率,可以合理使用哦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章