前 言 : \textcolor{blue}{前言:} 前言:
💥gitee中MyBatis學習原始碼💥所用到的代碼都可以在這里找到
注解開發以及Lombok使用
- 八、注解開發
- 1. 面向介面編程
- 2. 注解開發
- 2.1 注解在介面上實作
- 2.2 mybatis-config核心組態檔
- 2.3 測驗
- 2.4 注意點
- Mybatis詳細的執行流程
- 3. 注解開發CRUD
- 3.1 在工具類創建的時候實作自動提交事務
- 3.2 撰寫介面增加注解
- 3.3 測驗類
- 3.4 關于@Param()注解
- 九、Lombok
- 簡介
- 使用步驟:
- 優缺點
- 總結
八、注解開發
1. 面向介面編程
再開發中,我們一般不用面向物件編程,很多時候都會選擇面向介面編程
根本原因:解耦(最重要),可拓展,提高復用,分層開發中,上層不用管具體的實作,大家都遵守共同的標準,使得開發變得容易,規范性好,
在一個面向物件的系統中,系統的各種功能是由許多的不同物件協作完成的,在這種情況下,各個物件內部是如何實作自己的,對系統設計人員來講就不那么重要了,
而各個物件之間的協作關系則成為系統設計的關鍵,小到不同類之間的通信,大到各模塊之間的互動,在系統設計之初都是要著重考慮的,這也是系統設計的主要作業內容,面向介面編程就是指按照這種思想來編程,
- 關于介面的理解:
- 介面從更深層次的理解,應是定義(規范,約束)與實作(名實分離的原則)的分離
- 介面的本身反映了系統設計人員對系統的抽象理解,
- 介面應有兩類:
- 第一類是對一個個體的抽象,他可對應為一個抽象體(abstract class)
- 第二類是對一個個體某一方面的抽象,即形成一個抽象面(interface)
- 一個個體有可能有多個抽象面,抽象體與抽象面是由區別的,
- 三個面向區別
- 面向物件是指,我們考慮問題時,以物件為單位,考慮它的屬性及方法,
- 面向程序是指,我們考慮問題時,以一個具體的流程(事務程序)為單位,考慮它的實作,
- 介面設計與非介面設計是針對復用技術而言的,與面向物件(程序)不是一個問題,更多的體現就是對系統整體的架構,
2. 注解開發

對于像 BlogMapper 這樣的映射器類來說,還有另一種方法來完成陳述句映射, 它們映射的陳述句可以不用 XML 來配置,而可以使用 Java 注解來配置,比如,上面的 XML 示例可以被替換成如下的配置:
package org.mybatis.example;
public interface BlogMapper {
@Select("SELECT * FROM blog WHERE id = #{id}")
Blog selectBlog(int id);
}
使用注解來映射簡單陳述句會使代碼顯得更加簡潔,但對于稍微復雜一點的陳述句,Java 注解不僅力不從心,還會讓你本就復雜的 SQL 陳述句更加混亂不堪, 因此,如果你需要做一些很復雜的操作,最好用 XML 來映射陳述句,
選擇何種方式來配置映射,以及認為是否應該要統一映射陳述句定義的形式,完全取決于你和你的團隊, 換句話說,永遠不要拘泥于一種方式,你可以很輕松的在基于注解和 XML 的陳述句映射方式間自由移植和切換,
2.1 注解在介面上實作
import org.apache.ibatis.annotations.Select;
import pojo.User;
import java.util.List;
public interface UserMapper {
@Select("select * from user")
List<User> getUsers();
}
2.2 mybatis-config核心組態檔
系結介面
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--核心組態檔-->
<configuration>
<!--引入外部組態檔-->
<properties resource="db.properties"/>
<settings>
<!--標準的日志工廠實作-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!--可以給物體類起別名-->
<typeAliases>
<package name="com.hxl.pojo"/>
</typeAliases>
<environments default="development">
<environment id="development">
<!--事務管理-->
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!--系結介面-->
<mappers>
<mapper class="dao.UserMapper"/>
</mappers>
</configuration>
2.3 測驗
@Test
public void test(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
//底層主要應用反射
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.getUsers();
for (User user : users) {
System.out.println(user);
}
sqlSession.close();
}

此時我們會發現,這個password為null,這是因為如果注解開發只能是簡單的,復雜的還是需要xml進行
2.4 注意點
-
本質:反射機制實作
-
底層:動態代理

Mybatis詳細的執行流程

3. 注解開發CRUD
3.1 在工具類創建的時候實作自動提交事務

public static SqlSession getSqlSession() {
return sqlSessionFactory.openSession(true);
}
3.2 撰寫介面增加注解
public interface UserMapper {
@Select("select * from user")
List<User> getUsers();
//方法如果有多個引數,每個引數前面都需加上@Param注解
@Select("select * from user where id = #{id}")
User getUserById(@Param("id") int id);
//參考物件不需要寫@Param
@Insert("insert into user(id,name,pwd) value(#{id},#{name},#{password})")
int addUser(User user);
@Update("update user set name=#{name},pwd=#{password} where id = #{id}")
int updateUser(User user);
//如果有注解就要從跟著注解里面的走,否則會報錯
@Delete("delete from user where id = #{uid}")
int deleteUser(@Param("uid") int id);
}
3.3 測驗類
public class UserMapperTest {
@Test
public void test(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
//底層主要應用反射
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
/*List<User> users = mapper.getUsers();
for (User user : users) {
System.out.println(user);
}
//查
User userById = mapper.getUserById(1);
System.out.println(userById);
//增
mapper.addUser(new User(4,"老四","123456"));
//更新
mapper.updateUser(new User(4,"hh","1234"));
*/
//刪
mapper.deleteUser(4);
sqlSession.close();
}
}
-
注意點
我們必須要將介面注冊系結到我們的核心組態檔中
<!--系結介面--> <mappers> <!--<mapper resource="com/hxl/dao/*.xml"/>--> <!--如果使用介面,如果有很多mapper只能一個一個來注冊,但是如果使用resource方式可以進行通配--> <mapper class="dao.UserMapper"/> </mappers>
3.4 關于@Param()注解
- 基本型別的引數或者String型別,需要加上
- 參考型別不需要加
- 如果只有一個基本型別的話,可以忽略,但是建議加上
- 在sql中參考的就是在這里@Param()中設定的屬性名
#{}和${}
-
一個預編譯,一個不同的
-
#{}很大程度上可以防止sql注入,而${}無法防止
-
${}一般用于傳入資料庫物件,比如資料庫表名
-
用${}傳入的資料直接顯示在生成的sql中
九、Lombok
簡介
? Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java.
Never write another getter or equals method again, with one annotation your class has a fully featured builder, Automate your logging variables, and much more.
? Project Lombok 是一個 Java 庫,可自動插入您的編輯器并構建工具,為您的 Java 增添趣味,
永遠不要再撰寫另一個 getter 或 equals 方法,通過一個注釋,您的類就有一個功能齊全的構建器,自動化您的日志變數等等,
? Lombok是一款Java開發插件,使得Java開發者可以通過其定義的一些注解來消除業務工程中冗長和繁瑣的代碼,尤其對于簡單的Java模型物件(POJO),在開發環境中使用Lombok插件后,Java開發人員可以節省出重復構建,諸如hashCode和equals這樣的方法以及各種業務物件模型的accessor和ToString等方法的大量時間,對于這些方法,它能夠在編譯源代碼期間自動幫我們生成這些方法,并沒有如反射那樣降低程式的性能,
使用步驟:
-
在IDEA中安裝Lombok,安裝后重啟

-
在專案中匯入Lombok的jar包
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.20</version> <scope>provided</scope> </dependency> -
在物體類上注解
@Getter and @Setter @FieldNameConstants @ToString @EqualsAndHashCode @AllArgsConstructor, @RequiredArgsConstructor and @NoArgsConstructor @Log, @Log4j, @Log4j2, @Slf4j, @XSlf4j, @CommonsLog, @JBossLog, @Flogger, @CustomLog @Data @Builder @SuperBuilder @Singular @Delegate @Value @Accessors @Wither @With @SneakyThrows @val @var experimental @var @UtilityClass再也不用去手寫,直接加個注解就可以,
說明:@Data:無參構造,get、set、toString、hashcode、equals @AllArgsConstructor:有參構造,這里有了有參構造,無參構造就沒有,所以還需要加一個無參構造 @NoArgsConstructor:無參構造,可以注解加也可以在里面加方法

優缺點
優點:
- 能夠通過注解的形式自動生成構造器、getter/setter、equals、hashcode、toString等方法,提高了一定的開發效率
- 讓代碼變得更簡潔,不用過多的去關注相應的方法
- 屬性做修改時,也簡化了維護為這些屬性所生成的getter/setter方法等
缺點:
- 不支持多種引數構造器的多載
- 雖然省去了手動創建getter/setter方法的麻煩,但大大降低了源代碼的可讀性和完整性,降低了閱讀源代碼的舒適度
總結
? Lombok雖然有很多優點,但是它跟類似于一中IDEA插件,專案也需要依賴相應的jar包,Lombok依賴jar包是因為編譯時要用它的注解,為什么說它又類似插件?因為在使用時,eclipse和IDEA都需要安裝相應的插件,在編譯器編譯時通過操作AST(抽象語法樹)改變位元組碼生成,變相的就是說它在改變java語法,
? 它不像spring的依賴注入,或者mybatis的ORM一樣是運行時的特性,而是編譯時的特性,
按需使用
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/356145.html
標籤:其他
