QuickDAO通过对Spring JDBC, MyBatis, sql2o等orm框架进行简单封装,实现增删改查方法的抽象和复用,有效消除DAO层的样板代码。此外,QuickDAO还基于Elasticsearch提供了相同API的数据访问实现,可以将同一套Java DSL翻译为ES的query和aggregation。
https://yangziwen.github.io/quick-dao
- 引入项目依赖
<!-- 使用Spring JDBC的情形(推荐) -->
<dependency>
<groupId>io.github.yangziwen</groupId>
<artifactId>quick-dao-spring-jdbc</artifactId>
<version>0.0.23</version>
</dependency>
<!-- 使用MyBatis的情形(需注意SqlSession的线程安全) -->
<!-- 建议配合使用org.mybatis.spring.SqlSessionTemplate -->
<dependency>
<groupId>io.github.yangziwen</groupId>
<artifactId>quick-dao-mybatis</artifactId>
<version>0.0.23</version>
</dependency>
<!-- 使用sql2o的情形(适合快速开发demo) -->
<dependency>
<groupId>io.github.yangziwen</groupId>
<artifactId>quick-dao-sql2o</artifactId>
<version>0.0.23</version>
</dependency>
<!-- 使用Elasticsearch的情形(需要ES服务端为7.x版本) -->
<dependency>
<groupId>io.github.yangziwen</groupId>
<artifactId>quick-dao-elasticsearch</artifactId>
<version>0.0.23</version>
</dependency>- 定义数据的实体类
数据库的表名、字段名默认由实体类的类名、字段名按驼峰法转下划线法获得,也可基于JPA注解显式指定
@Data
@Table(name = "user")
public class User {
@Id
@Column
@GeneratedValue
private Long id;
@Column
private String username;
@Column
private String email;
@Column
private Integer age;
}- 数据访问类继承BaseRepository接口的实现类(以Spring JDBC为例)
public class UserRepository extends BaseSpringJdbcRepository<User> {
public UserRepository(DataSource dataSource) {
super(new JdbcTemplate(dataSource));
}
// UserRepository已继承了针对User对象的增删改查(包括分页)方法
}- 在数据访问类中实现个性化的查询方法
public List<User> listByAgeRange(int minAge, int maxAge) {
Criteria criteria = new Criteria()
.and("age").ge(minAge)
.and("age").le(maxAge);
return list(criteria);
}- 使用类型安全的方式构造查询条件
public List<User> listByAgeRange(int minAge, int maxAge) {
Criteria criteria = new TypedCriteria<>(User.class)
.and(User::getAge).ge(minAge)
.and(User::getAge).le(maxAge);
return list(criteria);
}-
对于ES的实体类,有两点需要特别注意:
- 使用
@Id注解修饰的字段会被映射为ES文档的_id; - 需要精确匹配(如
eq、in)或用于group by、order by的text字段,需要额外使用@NestedKeyword注解声明,QuickDAO会自动追加.keyword后缀,指向mapping中该字段的keyword子字段(本身是keyword类型的字段无需此注解)。
- 使用
-
更多例子,可参考使用手册以及 quick-dao-example 中的单元测试
