1.MyBatis注解開發
1.1.Lombok的基本使用
Lombok是SpringBoot2.1.X版本與IDEA官方支援的一個插件,它是為簡化POJO類中繁雜重複代碼:geter/setter/toString/hashcode/equals等,提供了一種
全注解的方式來簡化我們日常項目中的代碼,如今在SpringBoot與微服務項目中,Lombok是一款非常流行的插件,使用了解它可以提高我們日常的開發效率。
Lombok的使用非常簡單:
①首先需要在IDEA的Settings-Plugins中去下載下傳并安裝Lombok的應用插件:
②在Maven項目中引入Lombok的依賴包:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
<scope>provided</scope>
</dependency>
Lombok的scope=provided,說明它隻在編譯階段生效,不需要打入包中。事實正是如此,Lombok在編譯期将帶Lombok注解的Java檔案正确編譯為完整的Class檔案。
③在IDEA中設定開啟對Lombok的注解Anno支援:
開啟該項是為了讓Lombok注解在編譯階段起到作用。
④在項目中的POJO類中使用Lombok的注解開發:
日常項目中比較常用的高頻率注解:
- @Data:作用于類上,是以下注解的集合:@ToString @EqualsAndHashCode @Getter @Setter @RequiredArgsConstructor;
- @NoArgsConstructor:生成無參構造器;
- @AllArgsConstructor:生成全參構造器;
- @Log:作用于類上,生成日志變量。針對不同的日志實作産品,有不同的注解
1.2.Mybatis常用注解
- @Select:實作查詢
- @Insert:實作插入
- @Update:實作更新
- @Delete:實作删除
- @Result:實作結果集封裝
- @Results:可以與@Result連用,封裝多個結果集
- @One:一對一關系結果封裝
- @Many:多對一、多對多結果封裝
1.3.簡單增删改查
非常簡單,直接上Mapper注解查詢:
public interface CustomerMapper {
@Select("select id, name, age, password, birthday from customer")
List<Customer> selectCustomers();
@Insert("insert into customer values (#{id}, #{name}, #{age}, #{password}, #{birthday})")
int insert(Customer customer);
@Update("update customer set name = #{name}, password = #{password} where id = #{id}")
int update(Customer customer);
@Delete("delete from customer where id = #{id}")
int delete(int id);
@Select("select * from customer where id = #{id}")
Customer findOneById(int id);
}
需要注意的是需要在mybatis-config.xml配置檔案中添加對應Mapper所在的類配置:
<mappers>
<mapper class="com.fengye.mapper.CustomerMapper"></mapper>
</mappers>
1.4.一對一關聯查詢
表關系模型:
顧客與訂單号的關系:一個顧客對應多個訂單,一個訂單從屬于一個顧客。
設計查詢思路:從一方出發,查詢商品訂單同時,根據目前的uid查詢出目前訂單對應的顧客。
對應Mapper接口及相應配置:
public interface OrderMapper {
/**
* 一對一:訂單對應一個客戶
* @return
*/
@Select("select * from orders")
@Results(value = {
@Result(column = "id", property = "id", id = true),
@Result(column = "ordertime", property = "orderTime"),
@Result(column = "total", property = "total"),
@Result(column = "price", property = "price"),
@Result(property = "customer", one = @One(select = "com.fengye.mapper.CustomerMapper.findOneById"), column = "uid")
})
List<Orders> selectAll();
@Select("select * from orders where uid = #{uid}")
List<Orders> findByUid(@Param("uid") int id);
}
public interface CustomerMapper {
@Select("select * from customer where id = #{id}")
Customer findOneById(int id);
}
因為使用到了兩個Mapper接口中的方法,是以需要引入對應的兩個Mapper接口類:
<mappers>
<mapper class="com.fengye.mapper.CustomerMapper"></mapper>
<mapper class="com.fengye.mapper.OrderMapper"></mapper>
</mappers>
1.5.一對多關聯查詢
相反,對應一個顧客的訂單可能是多個,那麼從顧客角度分析,顧客與訂單的關系就是一對多關系。
相應的查詢設計思路:
封裝對應的Mapper注解查詢接口如下:
public interface CustomerMapper {
@Select("select * from customer")
@Results({
@Result(property = "id", column = "id", id = true),
@Result(property = "name", column = "name"),
@Result(property = "age", column = "age"),
@Result(property = "password", column = "password"),
@Result(property = "birthday", column = "birthday"),
@Result(property = "ordersList", many = @Many(select = "com.fengye.mapper.OrderMapper.findByUid"),
column = "id", javaType = List.class)
})
List<Customer> selectAllList();
}
public interface OrderMapper {
@Select("select * from orders where uid = #{uid}")
List<Orders> findByUid(@Param("uid") int id);
}
1.6.多對多關聯查詢
多對多最經典的還是使用者與角色的關系,一個使用者對應多個角色,一個角色可以對應多個使用者。
查詢設計思路:
可以從角色入手,也可以從使用者入手,在設計POJO時對應在多方肯定有一個集合的屬性字段,假設從使用者角度出發,設計查詢語句如下:
對應的Mapper接口層注解封裝如下:
public interface UserMapper {
/**
* 查詢出所有使用者及其對應的角色
* @return
*/
@Select("select * from sys_user")
@Results({
@Result(property = "id", column = "id", id = true),
@Result(property = "username", column = "username"),
@Result(property = "password", column = "password"),
@Result(property = "birthday", column = "birthday"),
@Result(property = "roleList", many = @Many(select = "com.fengye.mapper.RoleMapper.findRoleListByUid"),
column = "id", javaType = List.class)
})
List<User> findAllUserRole();
}
public interface RoleMapper {
@Select("select * from sys_role r, sys_user_role ur where r.id = ur.roleId and ur.userId = #{uid}")
List<Role> findRoleListByUid(@Param("uid") int uid);
}
注解開發優缺點:
注解開發相對于傳統的xml可以在實際項目中一定程度的減少大量的xml配置,針對于基礎簡單的sql語句非常實用;
但是注解開發并不能完全替代xml,比如動态sql使用<if>條件查詢等複雜sql的場景,最好還是使用xml。
本部落格寫作參考文檔:
https://www.jianshu.com/p/2543c71a8e45 《Lombok的基本使用》
https://www.bilibili.com/video/BV1XV411e7hm?p=30 《Mybatis注解開發》
示例代碼已上傳至Github位址:
https://github.com/devyf/MyBatisReview/tree/master/fengye_mybatis_annotation