spring-data-mybatis-mini
spring data jdbc mybatis-mini 實現
https://github.com/VonChange/spring-data-mybatis-mini
== Getting Started
做減法 只是對spring jdbc的一層簡單封裝
- 類似於mybatis plus 增加增刪改(沒有刪除) 批量更新插入等基礎方法
- 底層是spring jdbc 無緩存 但寫法是常用的mybatis模版寫法 無學習曲線
- 拋棄繁瑣的xml 所有sql 寫在markdown文件裏 便於書寫和閱讀
默認位置sql包下repository接口名.md @ConfigLocation 可自定義位置 - 自定義更新 update/save/insert/delete 開頭方法是更新操作
- 支持分頁 分頁參數必須是第一個參數
- 對於 " > “,” < “,” >= “,” <= “,” <> "無需轉義(兩邊需有空格 我會自動替換轉義)
- 提供if判斷和in查詢簡寫方式(偷懶 >-<)
- 註解屬於spring data jpa 體系的
- {@sql XX} XX markdown文件XX名的sql片段
- 查詢返回實體 不需要必須是DO 如果沒特殊規範
也可直接返回VO層實體(拋棄繁瑣的DO->DTO->VO 偷懶輕噴) - 支持批量更新(jdbc鏈接參數需加入rewriteBatchedStatements=true&allowMultiQueries=true)
- 支持mysql 本來也支持oracle的 但不打算再支持
== 其他特性 無特殊需要可不用關心
- 分頁 可自定義同名+Count的sql 優化分頁
- 支持讀寫分離
根據業務邏輯添加@ReadDataSource在方法名上 默認配置多數據源隨機取 - 多數源也能實現但在微服務化潮流裏儘量保證同一數據源(不提供說明支持方法)
- 讀寫分離 參數mybatis-mini.isReadExcludePrimary 默認不排除主庫 設置成true
除主庫外讀
== 與mybatis 和 mybatis-plus jpa 比較
- sql寫在markdown文件裏 寫起來舒服 便於閱讀
- 無需resultType resultMap 複雜指定(mybatis xml囉嗦的配置) 只需定義方法名
- 不允許查詢sql放到@Select 和 @Query上 jpa複雜sql不容易書寫還亂(雖然也能實現)
保持mybatis風格寫在文件裏 便於維護 - 無緩存 無根據方法名生成sql(需要你思考 不透明) 無條件構造器(EntityWrapper)
類似的雞肋功能 查詢就該是sql 純純的jdbc - 使用簡單 約定大於配置 默認配置基本都滿足
== 使用步驟
- 添加依賴
- @EnableMybatisMini
- extends BaseRepository<UserBaseDO, Long> 或 extends
BaseQueryRepository(只查詢) - 使用例子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查詢 識別 {@開頭
- {@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>
- {@and user_name <> userName} 等於
<if test="null!=userName and ''!=userName"> and user_name <>
#{userName} </if>
- in 查詢List實體下的屬性 {@and id in userList:id}