1.利用 JPA 特有的接口方法实现单表操作
从上一篇环境搭建的文章中可以发现,只是继承了两个接口,就简单的实现了查询操作。这是因为继承的 JpaRepository 中已经为我们封装了很多方法,底层则是一些jdbc操作。
package com.chen.service;
import com.chen.dao.UserDao;
import com.chen.domain.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import javax.transaction.Transactional;
import java.util.List;
@Service
@Transactional
public class UserService {
@Autowired
private UserDao userDao;
/**
* 查询所有数据
* @return
*/
public List<User> findAll(){
return userDao.findAll();
}
/**
* 保存用户
* @param user
*/
public void saveUser(User user){
userDao.save(user);
}
/**
* 根据ID查询用户
* @param id
* @return
*/
public User findUserById(Long id){
User user = userDao.findById(id).orElse(null);
return user;
}
/**
* 根据多个id查询多个用户
* @param ids
* @return
*/
public List<User> findAllUserById(Iterable<Long> ids){
return userDao.findAllById(ids);
}
/**
* 查询所有用户
* @return
*/
public List<User> findAllUser(){
return userDao.findAll();
}
/**
* 根据Id倒序查询所有用户
* @return
*/
public List<User> findAllUserAndSort(){
Sort.Order order=new Sort.Order(Sort.Direction.DESC, "userId");
return userDao.findAll(Sort.by(order));
}
/**
* 根据Id删除用户
* @param id
*/
public void deleteUserById(Long id){
userDao.deleteById(id);
}
/**
* 根据判断是否存在该用户
* @param id
* @return
*/
public boolean isExitUser(Long id){
boolean b = userDao.existsById(id);
return b;
}
}
上面只是我查看JPA源码后写出来的部分增删改查接口,更多接口可以自己查看JPA源码。当然,因为我用的JPA版本比较高,部分接口名称与我写出来的可能会有所区别。不过,通过接口名称一般都可以“见其名知其意”。
2.利用方法名规则实现单表查询
所谓的方法名规则,就是通过 findBy+字段名(首字母大写)实现单表查询。同理,也可以利用 And 和 Or 实现多字段查询。模糊查询也可使用Like命名规则,除此之外,还有以下几种:
package com.chen.dao;
import com.chen.domain.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import java.util.List;
public interface UserDao extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {
User findByUserId(Long userId);
User findByUserName(String userName);
User findByAge(Integer age);
User findByUserIdAndUserName(Long userId, String userName);
List<User> findByUserIdOrUserName(Long userId, String userName);
List<User> findByUserNameLike(String userName);
}
3.使用JPQL语句进行单表操作
JPA的JPQL语句有点类似Hibernate的HQL语句,使用时需添加注解@Query,注意映射的表名应该是实体类的类名。如果出现报错等情况,很有可能是表名映射错误造成的,此时检查实体类是否含有@Entity和@Table注解,同时检查在启动类是否配置了实体类和JPA接口扫描器。如果操作涉及添加,删除,更新操作,还需添加注解@Modifying。对于占位符,除了使用 冒号加参数名 的方式,还有 问号加索引 的形式,且索引应从1开始,如 ?1 , ?2
@Query(value = "from User where age = :age")
List<User> findByUserAge(@Param("age") Integer age);
@Modifying
@Query(value = "update User set userName= :userName where userId= :userId")
int updateUser(@Param("userName") String userName,@Param("userId")Long userId);
4.使用原生SQL语句进行单表操作
JPA也支持SQL语句查询,用法跟JPQL语句一样,不同的是,需要将@Query的操作形式nativeQuery改为true
@Query(value = "select * from test_user",nativeQuery = true)
List<User> selectAll();