1. 程式人生 > 其它 >MyBatis之註解開發

MyBatis之註解開發

MyBatis之註解開發

一、理解介面

1.1 關於介面

  • 從字面上理解,介面應是定義(規範,約束)與實現的分離。、

  • 介面反映了系統設計人員對系統的抽象理解。

  • 介面分為兩類:一類是對個體的抽象,它可對應為一個抽象體(abstract class);另一類是對個體某一方面的抽象,即形成一個抽象面(interface)。

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

1.2 面向介面程式設計

在真正的開發中,一般我們會選擇面向介面程式設計,而非面向物件程式設計,原因如下:

  • 面向介面程式設計能解耦程式 ,提高複用性, 可拓展性強,在分層開發中 ,大家都遵守共同的標準,上層不用管具體的實現。

  • 在面向物件的系統中,系統的各種功能是由許許多多的不同物件協作完成的。在這種情況下,系統設計人員不關心各個物件內部是如何實現的。

  • 系統設計的關鍵是各個物件之間的協作關係。面向介面程式設計就是指按照這種思想來注重各模組之間的互動關係。

1.3 面向物件與過程

  • 面向物件是指以物件為單位,考慮它的屬性及方法 。

  • 面向過程是指以一個具體的事務過程為單位,考慮它的實現 。

  • 面向介面程式設計是針對複用技術而言的,更多體現的是對系統整體架構的考慮。

二、利用註解開發

MyBatis最初配置資訊是基於 XML檔案 ,對映語句(SQL)也是定義在 XML 中的,MyBatis 3提供了新的基於註解的配置。但Java 註解的表達力和靈活性有限,並不能用註解來完全構建強大的 MyBatis 對映。

2.1 註解開發流程:

利用註解開發就不需要mapper.xml對映檔案了 。

SQL型別註解分類:

  • @select()

  • @update()

  • @Insert()

  • @delete()

在Mapper介面檔案中添加註解:

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

在MyBatis的核心配置檔案中注入:

<!--使用class繫結介面-->
<mappers>
<mapper class="com.MyBatis.mapper.Mapper"/>
</mappers>

在類中進行測試:

@Test
public void testGetAllUser() {
SqlSession session = MybatisUtils.getSession();
//本質上利用了jvm的動態代理機制
Mapper mapper = session.getMapper(Mapper.class);
List<User> users = mapper.getAllUser();
for (User user : users){
System.out.println(user);
}
session.close();
}

本質是利用了JVM的動態代理機制:

MyBatis執行流程:

2.2 註解增刪改查

  • 改造MyBatisUtils工具類的getSession( ) 方法,過載實現:

//獲取Sql Session連線
public static SqlSession getSession(){
return getSession(true); //事務自動提交
}

public static SqlSession getSession(boolean flag){
return sqlSessionFactory.openSession(flag);
}
  • 查詢介面方法註解:

//根據id查詢使用者
@Select("select * from user where id = #{id}")
User selectUserById(@Param("id") int id);
@Test
public void testSelectUserById() {
SqlSession session = MybatisUtils.getSession();
Mapper mapper = session.getMapper(Mapper.class);
User user = mapper.selectUserById(1);
System.out.println(user);
session.close();
}
  • 新增介面方法註解:

//新增一個使用者
@Insert("insert into user (id,name,pwd) values (#{id},#{name},#{pwd})")
int addUser(User user);
@Test
public void testAddUser() {
SqlSession session = MybatisUtils.getSession();
Mapper mapper = session.getMapper(Mapper.class);
User user = new User(6, "zhangsan", "123456");
mapper.addUser(user);
session.close();
}
  • 修改介面方法註解:

//修改一個使用者
@Update("update user set name=#{name},pwd=#{pwd} where id = #{id}")
int updateUser(User user);
@Test
public void testUpdateUser() {
SqlSession session = MybatisUtils.getSession();
Mapper mapper = session.getMapper(Mapper.class);
User user = new User(6, "zhaosi", "abcdef");
mapper.updateUser(user);
session.close();
}
  • 刪除介面方法註解:

//根據id刪除用
@Delete("delete from user where id = #{id}")
int deleteUser(@Param("id")int id);
@Test
public void testDeleteUser() {
SqlSession session = MybatisUtils.getSession();
Mapper mapper = session.getMapper(Mapper.class);
mapper.deleteUser(6);
session.close();
}

增刪改一定記得對事務的處理

2.3 關於@Param

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

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

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

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

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

JavaBean:一個遵循特定寫法的Java類,它通常具有如下特點:

  • 這個Java類必須具有一個無參的建構函式

  • 屬性必須私有化。

  • 私有化的屬性必須通過public型別的方法暴露給其它程式,並且方法的命名也必須遵守一定的命名規範。

  • JavaBean在J2EE開發中,通常用於封裝資料,對於遵循寫法的JavaBean元件,其它程式可以通過反射技術例項化JavaBean物件,並且通過反射那些遵守命名規範的方法,從而獲知JavaBean的屬性,進而呼叫其屬性儲存資料。

2.4 #與$的區別

  • #{} 的作用主要是替換預編譯語句中的佔位符“?”

INSERT INTO user (name) VALUES (#{name});
INSERT INTO user (name) VALUES (?);
  • ${} 的作用是直接進行字串替換

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

三、參考資料:

https://blog.csdn.net/keep12moving/article/details/92666633