Spring Boot教程 | 第三篇:Spring Data JPA用法进阶 - Go语言中文社区

Spring Boot教程 | 第三篇:Spring Data JPA用法进阶


一、介绍

Spring Boot完整教程 | 主页及目录​​​​​​​

上一篇我们对Data JPA的用法进行了基本介绍,本篇将对Data JPA API进行进一步说明。

 

二、用法说明

2.1 方法名解析

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=?

成功返回预期结果!

 

2.2  @Query自定义查询语句

在声明的方法上面标注@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);

 

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/tuoyun6647/article/details/95587881
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢