spring-data-mybatis-mini

spring-data-mybatis-mini

spring data jdbc mybatis-mini 實現
https://github.com/VonChange/spring-data-mybatis-mini

== Getting Started

做減法 只是對spring jdbc的一層簡單封裝
  1. 類似於mybatis plus 增加增刪改(沒有刪除) 批量更新插入等基礎方法
  2. 底層是spring jdbc 無緩存 但寫法是常用的mybatis模版寫法 無學習曲線
  3. 拋棄繁瑣的xml 所有sql 寫在markdown文件裏 便於書寫和閱讀
    默認位置sql包下repository接口名.md @ConfigLocation 可自定義位置
  4. 自定義更新 update/save/insert/delete 開頭方法是更新操作
  5. 支持分頁 分頁參數必須是第一個參數
  6. 對於 " > “,” < “,” >= “,” <= “,” <> "無需轉義(兩邊需有空格 我會自動替換轉義)
  7. 提供if判斷和in查詢簡寫方式(偷懶 >-<)
  8. 註解屬於spring data jpa 體系的
  9. {@sql XX} XX markdown文件XX名的sql片段
  10. 查詢返回實體 不需要必須是DO 如果沒特殊規範
    也可直接返回VO層實體(拋棄繁瑣的DO->DTO->VO 偷懶輕噴)
  11. 支持批量更新(jdbc鏈接參數需加入rewriteBatchedStatements=true&allowMultiQueries=true)
  12. 支持mysql 本來也支持oracle的 但不打算再支持

== 其他特性 無特殊需要可不用關心

  1. 分頁 可自定義同名+Count的sql 優化分頁
  2. 支持讀寫分離
    根據業務邏輯添加@ReadDataSource在方法名上 默認配置多數據源隨機取
  3. 多數源也能實現但在微服務化潮流裏儘量保證同一數據源(不提供說明支持方法)
  4. 讀寫分離 參數mybatis-mini.isReadExcludePrimary 默認不排除主庫 設置成true
    除主庫外讀

== 與mybatis 和 mybatis-plus jpa 比較

  1. sql寫在markdown文件裏 寫起來舒服 便於閱讀
  2. 無需resultType resultMap 複雜指定(mybatis xml囉嗦的配置) 只需定義方法名
  3. 不允許查詢sql放到@Select 和 @Query上 jpa複雜sql不容易書寫還亂(雖然也能實現)
    保持mybatis風格寫在文件裏 便於維護
  4. 無緩存 無根據方法名生成sql(需要你思考 不透明) 無條件構造器(EntityWrapper)
    類似的雞肋功能 查詢就該是sql 純純的jdbc
  5. 使用簡單 約定大於配置 默認配置基本都滿足

== 使用步驟

  1. 添加依賴
  2. @EnableMybatisMini
  3. extends BaseRepository<UserBaseDO, Long> 或 extends
    BaseQueryRepository(只查詢)
  4. 使用例子demo項目spring-data-mybatis-mini-demo

Here is a quick teaser of an application using Spring Data
Repositories in Java:

=== Maven configuration

Add the Maven dependency:

  <!-- spring boot 2.x 是使用版本2.1.1 1.5.x 使用版本1.8.1 -->
<dependency>
  <groupId>com.vonchange.common</groupId>
  <artifactId>spring-data-mybatis-mini</artifactId>
  <version>2.1.1</version>
</dependency>

<dependency>
       <groupId>org.springframework.data</groupId>
       <artifactId>spring-data-commons</artifactId>
 </dependency>
 <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-jdbc</artifactId>
 </dependency>
<dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.15</version>
</dependency>
import org.springframework.data.mybatis.mini.jdbc.repository.query.ConfigLocation;
import org.springframework.data.mybatis.mini.jdbc.repository.support.BaseRepository;
import org.springframework.data.repository.query.Param;

public interface UserBaseRepository extends BaseRepository<UserBaseDO, Long> {
  @ReadDataSource
  List<UserBaseDO> findList(@Param("userName") String userName,
                          @Param("createTime") Date createTime);
  Page<UserBaseDO> findList(Pageable pageable, @Param("userName") String userName,@Param("createTime") Date createTime);
  String findUserName(@Param("userName") String userName);

  List<UserBaseVO> findListByIds(@Param("userName") String userName,
                           @Param("createTime") Date createTime,@Param("idList")List<Long> idList);

  int updateIsDelete(@Param("isDelete") Integer isDelete,@Param("id") Long id);
  
}

默認sql 包下同名吧UserBaseRepository.md 識別```開頭結尾的 – 定義的同名方法
參見UserBaseRepository.md

實體類 定義ID 和TABLE 名

import javax.persistence.Id;
import javax.persistence.Table;

@Data
@Table(name = "user_base")
public class UserBaseDO {
    @Id
    private Long id;
    private String userName;
    private String  firstPhone;

}

@Service
public class MyService {
  @Resource
  private final UserBaseRepository userBaseRepository;

  public void doWork() {
     List<UserBaseDO> userBaseDOList = userBaseRepository.findList("test",new Date());
 }
}

//添加 EnableMybatisMini 註解 
@EnableMybatisMini
@SpringBootApplication 
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
} 

偷懶簡化 if test 和in查詢 識別 {@開頭

  1. {@and id in idList} 等於
<if test="null!=idList and idList.size>0"> and id in <foreach
collection="idList" index="index" item="item" open="(" separator=","
close=")">#{item}</foreach></if>
  
  1. {@and user_name <> userName} 等於
<if test="null!=userName and ''!=userName"> and user_name <>
#{userName} </if>
  1. in 查詢List實體下的屬性 {@and id in userList:id}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章