社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
Spring Boot完整教程 | 主页及目录
上一篇我们对Data JPA的用法进行了基本介绍,本篇将对Data JPA API进行进一步说明。
Data JPA在进行方法名解析时,会先把方法名多余的前缀截取掉,比如 find、findBy、read、readBy、get、getBy,然后对剩下部分进行解析。并且如果方法的最后一个参数是 Sort 或者 Pageable 类型,也会提取相关的信息,以便按规则进行排序或者分页查询。在创建查询时,我们通过在方法名中使用属性名称来表达,比如 findById()。框架在解析该方法时,首先剔除 findBy,然后对剩下的属性进行解析。
like查询时,如果需要查询的是其中的字符,同样使用通配符 “%”,如%王%
下面我们尝试一下,先做几条数据
StudentDao中增加根据性别筛选人员的方法
package com.kcsm.training.bootdemo.dao;
import com.kcsm.training.bootdemo.entity.Student;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
import java.util.List;
/**
* 学生信息数据库访问接口
*
* @author lqk
* @date 2019/7/9 15:43
*/
public interface StudentDao extends JpaRepository<Student, String>, JpaSpecificationExecutor<Student> {
/**
* 根据性别查询学习信息
*
* @author lqk
* @param gender [String]性别
* @return java.util.List<com.kcsm.training.bootdemo.entity.Student>
* @date 2019/7/10 9:16
*/
public List<Student> findAllByGender(String gender);
}
实际生产中禁止直接从控制层调dao层!所以我们在StudentService接口加方法,StudentServiceImpl写实现。 代码如下:
StudentService
package com.kcsm.training.bootdemo.service;
import com.kcsm.training.bootdemo.entity.Student;
import java.util.List;
/**
* 学生信息业务接口
*
* @author lqk
* @date 2019/7/9 18:29
*/
public interface StudentService {
/**
* 插入学生信息
*
* @author lqk
* @return com.kcsm.training.bootdemo.entity.Student
* @date 2019/7/10 9:19
*/
public Student insert();
/**
* 查询全部学生信息
*
* @author lqk
* @return java.util.List<com.kcsm.training.bootdemo.entity.Student>
* @date 2019/7/10 9:16
*/
public List<Student> getAll();
/**
* 根据性别查询学习信息
*
* @author lqk
* @param gender [String]性别
* @return java.util.List<com.kcsm.training.bootdemo.entity.Student>
* @date 2019/7/10 9:16
*/
public List<Student> findAllByGender(String gender);
}
StudentServiceImpl
package com.kcsm.training.bootdemo.service.impl;
import com.kcsm.training.bootdemo.dao.StudentDao;
import com.kcsm.training.bootdemo.entity.Student;
import com.kcsm.training.bootdemo.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 学生信息业务接口实现
*
* @author lqk
* @date 2019/7/9 19:52
*/
@Service
public class StudentServiceImpl implements StudentService {
@Autowired
StudentDao studentDao;
@Override
public Student insert(){
Student student = new Student();
student.setName("张三");
return studentDao.save(student);
}
@Override
public List<Student> getAll(){
return studentDao.findAll();
}
@Override
public List<Student> findAllByGender(String gender){
return studentDao.findAllByGender(gender);
}
}
StudentController
package com.kcsm.training.bootdemo.controller;
import com.kcsm.training.bootdemo.dao.StudentDao;
import com.kcsm.training.bootdemo.entity.Student;
import com.kcsm.training.bootdemo.service.StudentService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
/**
* 学生信息控制类
*
* @author lqk
* @date 2019/7/9 20:00
*/
@RestController
public class StudentController {
@Resource(name = "studentServiceImpl")
StudentService studentService;
/**
* 新增一条学生信息
*
* @author lqk
* @return com.kcsm.training.bootdemo.entity.Student
* @date 2019/7/10 9:31
*/
@RequestMapping(value = "v1/student", method = RequestMethod.POST)
public Student insert(){
return studentService.insert();
}
/**
* 返回所有学生信息
*
* @author lqk
* @return java.util.List<com.kcsm.training.bootdemo.entity.Student>
* @date 2019/7/10 9:41
*/
@RequestMapping(value = "v1/student", method = RequestMethod.GET)
public List<Student> getAll(){
return studentService.getAll();
}
/**
* 根据性别查询学习信息
*
* @author lqk
* @param gender [String]性别
* @return java.util.List<com.kcsm.training.bootdemo.entity.Student>
* @date 2019/7/10 9:16
*/
@RequestMapping(value = "v1/jpatest")
public List<Student> findAllByGender(String gender){
return studentService.findAllByGender(gender);
}
}
用Postman发送GET请求测试http://localhost:8080/v1/jpatest?gender=male:
后台打印的SQL:Hibernate: select student0_.ID as ID1_0_, student0_.AGE as AGE2_0_, student0_.GENDER as GENDER3_0_, student0_.NAME as NAME4_0_ from STUDENT student0_ where student0_.GENDER=?
成功返回预期结果!
在声明的方法上面标注@Query注解,即可通过写SQL实现自定义查询语句。正式生产编程中,除非迫不得已,否则不建议使用此方式进行数据查询或持久化操作。建议多用面向对象的思路进行编程,涉及多表关联等太过复杂的查询可以在业务层拼装数据。使用SQL,首先SQL维护起来不方便,其次而且如果大量使用了某个数据库的原生SQL将会造成系统与某一数据库绑定,无法更换数据库,各家数据库部分语法还是略有差异的。
2.2.1 原生SQL
@Query(value = "SELECT * FROM STUDENT WHERE GENDER = :gender",nativeQuery = true)
public List<Student> findAllByGender(@Param("gender") String gender);
其中使用@Param("gender")注入参数,nativeQuery = true代表使用当前数据库原生SQL语句。各家数据库部分语法还是略有差异,在非特殊情况下,不建议大量使用,如果大量使用,换数据库时会很痛苦,甚至整套系统只能使用某一品牌数据库。
或使用如下写法:
@Query(value = "SELECT * FROM STUDENT WHERE GENDER = ?1 AND NAME like %?2%",nativeQuery = true)
public List<Student> findAllByGender( String gender,String namelk);
?1代表方法中的第一个参数,?2代表第二个参数
2.2.2 HQL查询
HQL学习可参考Hibernate 之强大的HQL查询
@Query(value = "select t from Student t where name = ?1")
public List<Student> find( String name);
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!