常见的数据访问的写法大概有以下几种:
- Native SQL
- JPQL
- Criteria API
- Spring Data JPA
- 其他框架(jooq、MyBatis等)
Native SQL
List<User> results = entityManager
.createNativeQuery("select * from user where name = :name", User.class)
.setParameter("name", "tony56")
.getResultList();
Native SQL 算是最简单,也最直观的使用方法了。EntityManger是JSR标准里面提供的,所以不需要依托任何框架就可以使用。
JPQL
List<User> results = entityManager
.createQuery("from User where name = :name", User.class)
.setParameter("name", "tony56")
.getResultList();
JPQL跟Native SQL相比,其实也是大同小异。只是把select部分省略了。
Criteria API
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<User> query = cb.createQuery(User.class);
Root<User> root = query.from(User.class);
query.where(cb.equal(root.get("name"), "tony56"));
List<User> results = entityManager
.createQuery(query)
.getResultList();
Criteria API 其实功能很强大,但是就是写起来太复杂。理解起来也比较费劲。在项目中实际使用的其实很少。
Spring Data JPA
Spring框架中提供的一个功能。用法很简单。只需要继承JpaRepository,并且加上 @Repository 的注释就OK。然后可以按照命名规则去定义方法了。
其实一般的小项目,
@Repository
interface UserRepository : JpaRepository<User, Int> {
fun findByEmail(email: String): User?
@Query("select u from User u where u.name like %:name% order by u.id asc")
fun findByName(name: String): List<User>
}