在框架中持久層涉及到`QueryDsl`、`Spring Jdbc`、`Spring Data Jpa`可單獨用,可混合用,或都不用
> Spring Jdbc:適用于報表等...復雜條件下查詢
```
String sql = "select `id`, `name` from `xxx_member` order by `sort` asc limit 20;";
return mJdbcTemplatePlus.queryForMap(sql);
//return mJdbcTemplatePlus.queryForList(sql);
//return mJdbcTemplatePlus.queryForObj(sql, Member.class);
//return mJdbcTemplatePlus.queryForListObj(sql, Member.class);
```
> Spring Data Jpa:適用于日常操作。SDJ是對JPA規范抽象,支持不同實現(如`Hibernate`)支持多種不同查詢方式,更多見[官方文檔](https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.query-creation)
```
public interface MemberRepository extends JpaPlusRepository<Member, Long> {
//1.默認生成所有屬性名查詢
Member findBy屬性名(String status);
//2.內置屬性表達式(如:And、Equals.....)
Member findByUserNameAndPassword(String username,String username);
Member findByUserNameEquals(String username);
//3.內置注解查詢
@Query(value = "select * from xxx_member where status=?1", nativeQuery = true)
List<Member> findByStatus(String status);
@Transactional
@Modifying
@Query(value = "update xxx_member set cros_ct=?1 , push_ct=?2 ", nativeQuery = true)
int rest(Integer cros, Integer push);
//4.內置QueryDsl (這里重點拓展,如下方法已內置在JpaPlusRepository里)
List<Member> findAll(Predicate predicate)
List<Member> findAll(Predicate predicate, Sort sort);
Page<Member> findAll(JPAQuery<Member> query, Pageable pageable)
....
}
```
> QueryDsl:適用于封裝持久操作。面向對象查詢框架,簡潔封裝,與Spring Jpa絕配,更多見[官方文檔](http://www.querydsl.com/static/querydsl/latest/reference/html/index.html)
```
QMember qm = QMember .member;
List<Member> memberList = queryFactory.selectFrom(qm)
.where(qm.name.like('%'+"小明"+'%')
.and(qm.address.contains("武漢"))
.and(qm.status.eq("0"))
.and(qm.age.between(20, 30)))
.fetch();
```
> 其他ORM框架
> * 使用 `jdbc` 推薦 [querydsl](http://www.querydsl.com/)
> * 使用 `mybatis` 推薦 [mybatis plus](https://mp.baomidou.com/)
> * 使用 `hibernate` 推薦 [spring jpa](https://spring.io/projects/spring-data-jpa)