【java框架】MyBatis(7)–MyBatis註解開發

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。

 

本博客寫作參考文檔:

//www.jianshu.com/p/2543c71a8e45  《Lombok的基本使用》

//www.bilibili.com/video/BV1XV411e7hm?p=30  《Mybatis註解開發》

 

示例代碼已上傳至Github地址:

//github.com/devyf/MyBatisReview/tree/master/fengye_mybatis_annotation

Tags: