SpringData 基于SpringBoot快速入门 (4)

方法三到方法五主要介绍的是 @Query 注解的使用。
1 传参方式
索引参数:?n ,n从1开始,表示第一个参数。方法传入的参数的照顺序和个数要和 n 保持一致。
命名参数::key ,传参必须有 @Param("key") 注解修饰
2 原生的sql
@Query 注解支持本地查询,即用原生的sql语句。如:@Query(value="xxxx", nativeQuery=true)
3 Modifying
若直接执行修改操作,SpringDataJPA 会提示错误信息 Executing an update/delete query 。是因为Spring Data 默认所有的查询均声明为只读事务。
所以我们要在Service层添加 @Transactional 注解。

SpringDataJPA 核心知识Repository接口
Repository: 空接口,标识作用,表明任何继承它的均为Repository接口类
CrudRepository: 继承 Repository,实现了一组 CRUD 相关的方法 
PagingAndSortingRepository: 继承 CrudRepository,实现了一组分页排序相关的方法
JpaRepository: 继承 PagingAndSortingRepository,实现一组 JPA 规范相关的方法
JpaSpecificationExecutor: 不属于Repository体系,实现一组 JPA Criteria 查询相关的方法 
PagingAndSortingRepository 和 JpaSpecificationExecutor 基本满足企业中大部分的需求。也可以自定义Repository,只需继承 JpaRepository 即可具备了通用的数据访问控制层的能力。
进入各自接口类中,使用快捷键 Ctrl + o 即可查看当前类的所有方法,所以这里就不贴出来了。

JpaSpecificationExecutor


PagingAndSortingRepository


CrudRepository

 

Service层

创建UserService 并加上注解 @Transactional

import javax.transaction.Transactional; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.itdragon.common.ItdragonResult; import com.itdragon.pojo.User; import com.itdragon.repository.UserRepository; @Service @Transactional public class UserService { @Autowired private UserRepository userRepository; public ItdragonResult registerUser(User user) { // 检查用户名是否注册,一般在前端验证的时候处理,因为注册不存在高并发的情况,这里再加一层查询是不影响性能的 if (null != userRepository.findByAccount(user.getAccount())) { return ItdragonResult.build(400, ""); } userRepository.save(user); // 注册成功后选择发送邮件激活。现在一般都是短信验证码 return ItdragonResult.build(200, ""); } public ItdragonResult editUserEmail(String email) { // 通过Session 获取用户信息, 这里假装从Session中获取了用户的id,后面讲解SOA面向服务架构中的单点登录系统时,修改此处代码 FIXME long id = 3L; // 添加一些验证,比如短信验证 userRepository.updateUserEmail(id, email); return ItdragonResult.ok(); } } 单元测试

SpringBoot 的单元测试,需要用到 @RunWith 和 @SpringBootTest注解,代码注释中有详细介绍。

import java.util.List; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort.Direction; import org.springframework.data.domain.Sort.Order; import org.springframework.data.jpa.domain.Specification; import org.springframework.test.context.junit4.SpringRunner; import com.itdragon.StartApplication; import com.itdragon.common.ItdragonUtils; import com.itdragon.pojo.User; import com.itdragon.repository.UserRepository; import com.itdragon.service.UserService; /** * @RunWith 它是一个运行器 * @RunWith(SpringRunner.class) 表示让测试运行于Spring测试环境,不用启动spring容器即可使用Spring环境 * @SpringBootTest(classes=StartApplication.class) 表示将StartApplication.class纳入到测试环境中,若不加这个则提示bean找不到。 * * @author itdragon * */ @RunWith(SpringRunner.class) @SpringBootTest(classes=StartApplication.class) public class SpringbootStudyApplicationTests { @Autowired private UserService userService; @Autowired private UserRepository userRepository; @Test public void contextLoads() { } @Test // 测试注册,新增数据 public void registerUser() { User user = new User(); user.setAccount("gitLiu"); user.setUserName("ITDragonGit"); user.setEmail("itdragon@git.com"); user.setIphone("12349857999"); user.setPlainPassword("adminroot"); user.setPlatform("github"); user.setCreatedDate(ItdragonUtils.getCurrentDateTime()); user.setUpdatedDate(ItdragonUtils.getCurrentDateTime()); ItdragonUtils.entryptPassword(user); userService.registerUser(user); } @Test // 测试SpringData 关键字 public void findByEmailEndingWithAndCreatedDateLessThan() { List<User> users = userRepository.findByEmailEndingWithAndCreatedDateLessThan("qq.com", ItdragonUtils.getCurrentDateTime()); System.out.println(users.toString()); } @Test // 测试SpringData @Query 注解和传多个参数 public void getActiveUserCount() { long activeUserCount = userRepository.getActiveUserCount("weixin", ItdragonUtils.getCurrentDateTime()); System.out.println(activeUserCount); } @Test // 测试SpringData @Query 注解,传多个参数 和 like 查询 public void findByEmailAndIhpneLike() { List<User> users = userRepository.findByEmailAndIhpneLike("163.com", "6666"); System.out.println(users.toString()); } @Test // 测试SpringData @Query 注解 和 @Modifying 注解 public void updateUserEmail() { /** * org.springframework.dao.InvalidDataAccessApiUsageException:Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query * userRepository.updateUserEmail(3L, "update@email.com"); */ userService.editUserEmail("update@email.com"); } @Test // 测试SpringData PagingAndSortingRepository 接口 public void testPagingAndSortingRepository() { int page = 1; // 从0开始,第二页 int size = 3; // 每页三天数据 PageRequest pageable = new PageRequest(page, size, new Sort(new Order(Direction.ASC, "id"))); Page<User> users = userRepository.findAll(pageable); System.out.println(users.getContent().toString()); // 当前数据库中有5条数据,正常情况可以打印两条数据,id分别为4,5 (先排序,后分页) } @Test // 测试SpringData JpaSpecificationExecutor 接口 public void testJpaSpecificationExecutor(){ int pageNo = 1; int pageSize = 3; PageRequest pageable = new PageRequest(pageNo, pageSize); Specification<User> specification = new Specification<User>() { @Override public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder cb) { Predicate predicate = cb.gt(root.get("id"), 1); // 查询id 大于 1的数据 return predicate; } }; Page<User> users = userRepository.findAll(specification, pageable); System.out.println(users.getContent().toString()); // 当前数据库中有5条数据,正常情况可以打印一条数据,id为5 } } 可能存在的问题 项目启动时提示 Unknown character set: 'utf8mb4'

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zygsjx.html