回顧上一章: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的最佳實踐!
使用註解開發可以提高我們的開發效率,可以合理使用哦!