MyBatis筆記(四)

1. 面向接口編程

  • 在真正的開發中,不少時候咱們會選擇面向接口編程
  • 根本緣由 : 解耦 , 可拓展 , 提升複用 , 分層開發中 , 上層不用管具體的實現 , 你們都遵照共同的標準 , 使得開發變得容易 , 規範性更好
  • 在一個面向對象的系統中,系統的各類功能是由許許多多的不一樣對象協做完成的。在這種狀況下,各個對象內部是如何實現本身的,對系統設計人員來說就不那麼重要了
  • 而各個對象之間的協做關係則成爲系統設計的關鍵。小到不一樣類之間的通訊,大到各模塊之間的交互,在系統設計之初都是要着重考慮的,這也是系統設計的主要工做內容。面向接口編程就是指按照這種思想來編程

關於接口的理解:java

  • 接口從更深層次的理解,應是定義(規範,約束)與實現(名實分離的原則)的分離
  • 接口的自己反映了系統設計人員對系統的抽象理解
  • 接口應有兩類:
    • 第一類是對一個個體的抽象,它可對應爲一個抽象體(abstract class)
    • 第二類是對一個個體某一方面的抽象,即造成一個抽象面(interface)
  • 一個體有可能有多個抽象面。抽象體與抽象面是有區別的

三個面向區別:sql

  • 面向對象是指,咱們考慮問題時,以對象爲單位,考慮它的屬性及方法
  • 面向過程是指,咱們考慮問題時,以一個具體的流程(事務過程)爲單位,考慮它的實現
  • 接口設計與非接口設計是針對複用技術而言的,與面向對象(過程)不是一個問題.更多的體現就是對系統總體的架構

2. 利用註解開發

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

  • sql 類型主要分紅 :mybatis

    • @select()
    • @update()
    • @Insert()
    • @delete()
  • 注意:利用註解開發就不須要mapper.xml映射文件了架構

  • 步驟以下:app

    1. 在接口中添加註解jvm

      //查詢所有用戶
      @Select("select id,name,pwd password from user")
      public List<User> getAllUser();
    2. 在MyBatis的核心配置文件中注入工具

      <!--使用class綁定接口-->
      <mappers>
          <mapper class="top.linzeliang.mapper.UserMapper"/>
      </mappers>
    3. 進行測試測試

  • 利用Debug查看本質設計

    image-20210412080249779

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

    image-20210412082421960

  • MyBatis詳細執行流程

    image-20210412082548263

3. 註解的增刪改查

  • 注意:增刪改要記得對事務進行處理

改造咱們MyBatis工具類的getSession()方法,重載實現

//獲取SqlSession鏈接
public static SqlSession getSession(){
    return getSession(true); //事務自動提交
}

public static SqlSession getSession(boolean flag){
    // 默認爲false
    return sqlSessionFactory.openSession(flag);
}

查詢:

  1. 編寫接口方法註解

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

增長:

  1. 編寫接口方法註解

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

修改:

  1. 編寫接口方法註解

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

刪除:

  1. 編寫接口方法註解

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

4. 關於@Param

@Param註解用於給方法參數起一個名字:

  • 在方法只接收一個參數的狀況下,能夠不使用@Param
  • 在方法接收多個參數的狀況下,建議必定要用@Param註解給參數命名
  • 若是參數是JavaBean,則不能使用@Param
  • 不使用@Param註解時,參數只能有一個,而且是JavaBean

5. #{} 與 ${} 的區別

  • {}的作喲弄個主要是替換預編譯語句(PrepareStatement)中的佔位符(推薦使用)

    INSERT INTO user (name) VALUES (#{name});
    INSERT INTO user (name) VALUES (?);
  • ${}的做用是直接進行字符串替換(會致使SQL注入)

    INSERT INTO user (name) VALUES ('${name}');
    INSERT INTO user (name) VALUES ('zhangsan');
相關文章
相關標籤/搜索