spring boot系列(五)spring boot 配置spring data jpa (查询方法)
接着上面spring boot系列(四)spring boot 配置spring data jpa 保存修改方法继续做查询的测试:
1 创建UserInfo实体类,代码和https://www.cnblogs.com/kxm87/p/9273555.html中的一样。
2 创建数据库操作类相当于dao层,主要创建一个接口UserRepository,继承JpaRepository接口即可。本代码中主要都是自定义方法。
使用findXX 或者countXX(这两个不用编写sql,jpa会自动生成) 或者@Query 编写JPQL语句 或者原生语句
package com.cfj.ceshi.jpa.repository; import java.util.List; import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param; import com.cfj.ceshi.jpa.domain.UserInfo; public interface UserRepository extends JpaRepository<UserInfo, Integer> { List<UserInfo> findByUserNameNotNull(); //不为空 List<UserInfo> findByUserNameIsNull(); //为空 /**
* 按照姓名=?查询
* 最终转成sql语句为:select userinfo0_.id as id1_0_, userinfo0_.age as age2_0_,
* userinfo0_.user_name as user_nam3_0_ from user_info userinfo0_
* where userinfo0_.user_name=?
* @param name
* @return
*/
UserInfo findByUserName(String name);//用名字直接查询 /**
* 按照 name = ? and age = ? 查询
* 最终转成sql语句为:select userinfo0_.id as id1_0_, userinfo0_.age as age2_0_,
* userinfo0_.user_name as user_nam3_0_ from user_info userinfo0_
* where userinfo0_.user_name=? and userinfo0_.age=?
* @param name
* @param age
* @return
*/
UserInfo findByUserNameAndAge(String name,String age);//and /**
* 按照 id between ? and ? 查询
* 最终解析sql语句为:select userinfo0_.id as id1_0_, userinfo0_.age as age2_0_,
* userinfo0_.user_name as user_nam3_0_ from user_info userinfo0_
* where userinfo0_.id between ? and ?
* @param idStrat
* @param idEnd
* @return
*/
List<UserInfo> findByIdBetween(Integer idStrat,Integer idEnd); /**
* 按照年龄统计行数
* 最终解析sql语句为:select count(userinfo0_.id) as col_0_0_ from user_info userinfo0_ where userinfo0_.age=?
* @param age
* @return
*/
Integer countByAge(String age); /**
* 目的是类似 user_name like '%dd%'这种查询 所以必须用Containing
* 这样会把%%包含在里面 如果直接是like 则不包含%
* @param name
* @return
*/
List<UserInfo> findByUserNameContaining(String name); /**
* 按照username in ()
* 最终解析sql语句为:select userinfo0_.id as id1_0_, userinfo0_.age as age2_0_,
* userinfo0_.user_name as user_nam3_0_ from user_info userinfo0_
* where userinfo0_.user_name in (? , ?) * @return
*/
List<UserInfo> findByUserNameIn(List<String> list); /**
* 使用JPA sql查询 注意 1 对应userName 2 对应age ?号中的数字和参数表中从左向右顺序一一对应
* @param userName
* @param age
* @return
*/
@Query(value = "select u from UserInfo u where u.userName=?1 and u.age = ?2")
UserInfo getUserInfo(String userName,String age); /**
* 使用JPA sql查询 注意 1 对应userName 2 对应age ?号中的数字和参数表中从左向右顺序一一对应
* 返回name
* @param userName
* @param age
* @return
*/
@Query(value = "select u.userName from UserInfo u where u.userName=?1 and u.age = ?2")
String getUserInfoTwo(String userName,String age); /**
* 使用原生sql查询
* @param userName
* @param age
* @return
*/
@Query(value = "select * from user_info u where u.user_name=?1 and u.age = ?2" ,nativeQuery = true)
UserInfo getUserInfoThree(String userName,String age); /**
* 用参数方式
* @param userName
* @param age
* @return
*/
@Query(value = "select u.userName from UserInfo u where u.userName=:name and u.age = :age")
String getUserInfoFour(@Param("name")String userName,@Param("age")String age); /**
* jpa sql
* @param age
* @param userName
* @return
*/
@Modifying
@Query(value = "update UserInfo u set u.age = ?1 where u.userName = ?2")
Integer updateUserInfo(String age,String userName); /**
* 原生sql
* @param age
* @param userName
* @return
*/
@Modifying
@Query(value = "update user_info set age = ?1 where user_name = ?2",nativeQuery = true)
Integer updateUserInfoOne(String age,String userName); /**
* 删除方法
* @param userName
* @return
*/
@Modifying
@Query(value = "delete from UserInfo u where u.userName = ?1")
Integer deleteUserInfo(String userName); }
3 创建service接口和它的实现类,代码如下:
package com.cfj.ceshi.jpa.service;
import java.util.List;
import com.cfj.ceshi.jpa.domain.UserInfo;
public interface UserService {
public Integer save(UserInfo user);
public void delete(Integer id);
List<UserInfo> findByUserNameNotNull();
List<UserInfo> findByUserNameIsNull();
UserInfo findByUserName(String name);//用名字直接查询
UserInfo findByUserNameAndAge(String name,String age);//and
List<UserInfo> findByUserIdBetween(Integer idStrat,Integer idEnd);
Integer countByAge(String age);
List<UserInfo> findByUserNameContaining(String name);
List<UserInfo> findByUserNameIn(List<String> list);
UserInfo getUserInfo(String userName,String age);
String getUserInfoTwo(String userName,String age);
UserInfo getUserInfoThree(String userName,String age);
String getUserInfoFour(String userName,String age);
Integer updateUserInfo(String age,String userName);
Integer updateUserInfoOne(String age,String userName);
Integer deleteUserInfo(String userName);
UserInfo findOne(Integer id);
List<UserInfo> findAll();
}
package com.cfj.ceshi.jpa.service.impl; import java.util.List; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import com.cfj.ceshi.jpa.domain.UserInfo;
import com.cfj.ceshi.jpa.repository.UserRepository;
import com.cfj.ceshi.jpa.service.UserService; @Service
@Transactional
public class UserServiceImpl implements UserService{ @Autowired
private UserRepository userRepository; @Override
public Integer save(UserInfo user) {
return userRepository.save(user).getId();
} @Override
public void delete(Integer id) {
userRepository.delete(id);
} @Override
public List<UserInfo> findByUserNameNotNull() {
return userRepository.findByUserNameNotNull();
} @Override
public List<UserInfo> findByUserNameIsNull() {
return userRepository.findByUserNameIsNull();
} @Override
public UserInfo findByUserName(String name) {
return userRepository.findByUserName(name);
} @Override
public UserInfo findByUserNameAndAge(String name, String age) {
return userRepository.findByUserNameAndAge(name, age);
} @Override
public List<UserInfo> findByUserIdBetween(Integer idStrat, Integer idEnd) {
return userRepository.findByIdBetween(idStrat, idEnd);
} @Override
public Integer countByAge(String age) {
return userRepository.countByAge(age);
} @Override
public List<UserInfo> findByUserNameContaining(String name) {
return userRepository.findByUserNameContaining(name);
} @Override
public List<UserInfo> findByUserNameIn(List<String> list) {
return userRepository.findByUserNameIn(list);
} @Override
public UserInfo getUserInfo(String userName, String age) {
return userRepository.getUserInfo(userName, age);
} @Override
public String getUserInfoTwo(String userName, String age) {
return userRepository.getUserInfoTwo(userName, age);
} @Override
public UserInfo getUserInfoThree(String userName, String age) {
return userRepository.getUserInfoThree(userName, age);
} @Override
public String getUserInfoFour(String userName, String age) {
return userRepository.getUserInfoFour(userName, age);
} @Override
public Integer updateUserInfo(String age, String userName) {
return userRepository.updateUserInfo(age, userName);
} @Override
public Integer updateUserInfoOne(String age, String userName) {
return userRepository.updateUserInfoOne(age, userName);
} @Override
public Integer deleteUserInfo(String userName) {
return userRepository.deleteUserInfo(userName);
} @Override
public UserInfo findOne(Integer id) {
return userRepository.findOne(id);
} @Override
public List<UserInfo> findAll() {
return userRepository.findAll();
} }
有删除或者修改的时候 service层一定要加上事务控制@Transactional,否则就会报错:Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query
4 创建控制类(controller)在spring boot 里面用web包表示,代码如下:
package com.cfj.ceshi.jpa.web; import java.util.ArrayList;
import java.util.List; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import com.cfj.ceshi.jpa.domain.UserInfo;
import com.cfj.ceshi.jpa.service.UserService; @RestController
@RequestMapping("/userquery")
public class UserQueryWeb { @Autowired
private UserService userService; @RequestMapping("/checknull")
public String getUserInfoOne() {
String result = "id集合:[";
//List<UserInfo> list = userService.findByUserNameNotNull(); List<UserInfo> list = userService.findByUserNameIsNull(); for (int i = 0; i< list.size(); i++) {
UserInfo u = new UserInfo();
u = list.get(i);
result += u.getId().toString()+",";
}
result = result+"]";
return result; } /**
* 按照姓名=?查询
* 最终转成sql语句为:select userinfo0_.id as id1_0_, userinfo0_.age as age2_0_,
* userinfo0_.user_name as user_nam3_0_ from user_info userinfo0_
* where userinfo0_.user_name=?
* @param name
* @return
*/
@RequestMapping("/getByName")
public String getUserInfoByName(String name) {
return userService.findByUserName(name).toString(); } /**
* 按照 name = ? and age = ? 查询
* 最终转成sql语句为:select userinfo0_.id as id1_0_, userinfo0_.age as age2_0_,
* userinfo0_.user_name as user_nam3_0_ from user_info userinfo0_
* where userinfo0_.user_name=? and userinfo0_.age=?
* @param name
* @param age
* @return
*/
@RequestMapping("/getByNameAndAge")
public String getUserInfoByName(String name,String age) {
return userService.findByUserNameAndAge(name, age).toString(); } /**
* 按照 id between ? and ? 查询
* 最终解析sql语句为:select userinfo0_.id as id1_0_, userinfo0_.age as age2_0_,
* userinfo0_.user_name as user_nam3_0_ from user_info userinfo0_
* where userinfo0_.id between ? and ?
* @param idStrat
* @param idEnd
* @return
*/
@RequestMapping("/getByIdBetween")
public String getUserInfoTwo(Integer idStrat, Integer idEnd) { String result = "id集合:[";
List<UserInfo> list = userService.findByUserIdBetween(idStrat, idEnd); for (int i = 0; i< list.size(); i++) {
UserInfo u = new UserInfo();
u = list.get(i);
result += u.getId().toString()+",";
}
result = result+"]";
return result; }
/**
* 按照年龄统计行数
* 最终解析sql语句为:select count(userinfo0_.id) as col_0_0_ from user_info userinfo0_ where userinfo0_.age=?
* @param age
* @return
*/
@RequestMapping("/getByCount")
public Integer getCount(String age) {
return userService.countByAge(age); } /**
* 目的是类似 user_name like '%dd%'这种查询 所以必须用Containing
* 这样会把%%包含在里面 如果直接是like 则不包含%
* @param name
* @return
*/
@RequestMapping("/getByUserNameLike")
public String getUserNameLike(String name) { String result = "id集合:[";
List<UserInfo> list = userService.findByUserNameContaining(name); for (int i = 0; i< list.size(); i++) {
UserInfo u = new UserInfo();
u = list.get(i);
result += u.getId().toString()+",";
}
result = result+"]";
return result; } /**
* 按照username in ()
* 最终解析sql语句为:select userinfo0_.id as id1_0_, userinfo0_.age as age2_0_,
* userinfo0_.user_name as user_nam3_0_ from user_info userinfo0_
* where userinfo0_.user_name in (? , ?) * @return
*/
@RequestMapping("/getByUserNameIn")
public String getUserNameIn() { String result = "id集合:[";
List<String> arrylist = new ArrayList<String>();
arrylist.add("w");
arrylist.add("ww");
List<UserInfo> list = userService.findByUserNameIn(arrylist); for (int i = 0; i< list.size(); i++) {
UserInfo u = new UserInfo();
u = list.get(i);
result += u.getId().toString()+",";
}
result = result+"]";
return result; } /*以下使用@Query查询*/ //使用JPA sql查询 注意 1 对应userName 2 对应age ?号中的数字和参数表中从左向右顺序一一对应
@RequestMapping("/testquery")
public String getUserNameByNameAndAge() { return userService.getUserInfo("rrr", "333").toString(); } //使用JPA sql查询 注意 1 对应userName 2 对应age ?号中的数字和参数表中从左向右顺序一一对应 返回name
@RequestMapping("/testquerytwo")
public String getUserNameByNameAndAgeTwo(String name,String age) { return userService.getUserInfoTwo(name, age); } // 使用原生sql查询
@RequestMapping("/testquerythree")
public String getUserNameByNameAndAgeThree() { return userService.getUserInfo("rrr", "333").toString(); } //使用参数方式 @Param("name")
@RequestMapping("/testqueryfour")
public String getUserNameByNameAndAgeFour(String name,String age) { return userService.getUserInfoFour(name, age); } //jpa sql 更新
@RequestMapping("/updateUserInfo")
public String updateUserInfo(String age,String name) { return userService.updateUserInfo(age, name).toString(); } //原生sql 更新
@RequestMapping("/updateUserInfoOne")
public String updateUserInfoOne(String age,String name) { return userService.updateUserInfoOne(age, name).toString(); }
//删除
@RequestMapping("/deleteUserInfo")
public String deleteUserInfo(String name) { return userService.deleteUserInfo(name).toString(); } //按照id查询 使用spring data jpa接口中的findOne方法
@RequestMapping("/getOne")
public String getOne(Integer id) {
return userService.findOne(id).toString();
} //按照id查询 使用spring data jpa接口中的findAll方法
@RequestMapping("/getAll")
public String getAll() {
String result = "id集合:[";
List<UserInfo> list = userService.findAll(); for (int i = 0; i< list.size(); i++) {
UserInfo u = new UserInfo();
u = list.get(i);
result += u.getId().toString()+",";
}
result = result+"]";
return result;
} }
5 使用postman工具测试
以上都是查询方法,所有用postman方法测试的时候,使用GET方式,然后选择URL栏旁边的Params设置传参,如下图:

本项目码云地址:
https://gitee.com/kaixinmao/jpa_lianxi/tree/master/jpa
spring boot系列(五)spring boot 配置spring data jpa (查询方法)的更多相关文章
- Spring Data JPA 查询方法支持的关键字
Table 2.3. Supported keywords inside method names Keyword Sample JPQL snippet And findByLastnameAndF ...
- Spring Boot系列(四):Spring Boot源码解析
一.自动装配原理 之前博文已经讲过,@SpringBootApplication继承了@EnableAutoConfiguration,该注解导入了AutoConfigurationImport Se ...
- Spring Boot 2 (五):Docker Compose + Spring Boot + Nginx + Mysql 实践
Spring Boot 2 (五):Docker Compose + Spring Boot + Nginx + Mysql 实践 Spring Boot + Nginx + Mysql 是实际工作中 ...
- Spring Boot系列(三):Spring Boot整合Mybatis源码解析
一.Mybatis回顾 1.MyBatis介绍 Mybatis是一个半ORM框架,它使用简单的 XML 或注解用于配置和原始映射,将接口和Java的POJOs(普通的Java 对象)映射成数据库中的记 ...
- Spring cloud系列教程第十篇- Spring cloud整合Eureka总结篇
Spring cloud系列教程第十篇- Spring cloud整合Eureka总结篇 本文主要内容: 1:spring cloud整合Eureka总结 本文是由凯哥(凯哥Java:kagejava ...
- 【tmos】spring data jpa 创建方法名进行简单查询
参考链接 spring data jpa 创建方法名进行简单查询:http://www.cnblogs.com/toSeeMyDream/p/6170790.html
- spring data jpa查询部分字段、多余附加字段
spring data jpa查询部分字段 第一种方法:使用 model 查询时转化 首先建立一个 model ,写上自己想要查询的字段,然后写上构造函数,这步很重要,因为spring jpa 转化时 ...
- 【HANA系列】SAP HANA XS使用Data Services查询CDS实体【二】
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA XS使用Dat ...
- 【HANA系列】SAP HANA XS使用Data Services查询CDS实体【一】
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA XS使用Dat ...
随机推荐
- 移动端的文本框获取焦点时导致fixed或absolute定位的按钮被手机键盘顶上去的问题
var win_h = $(window).height();//关键代码 window.addEventListener('resize', function () { if($(window).h ...
- java线程基础巩固---通过实验分析This锁和Class锁的存在
This锁: 关于什么是This锁下面用实现来说明一下它: 那下面用两个线程分别调用这两个方法,如下: 看结果: 可见两个方法是同时输出的,因为m2()方法并未上锁,所以就不存在争锁的问题,那这时给m ...
- Windowsx下Appium环境搭建步骤及问题
1,安装Java jdk配置环境变量 验证方式:cmd >java -version 2,下载Android sdk配置环境变量 验证方式:cmd >adb devices(下载的是zi ...
- cmake 出现undefined reference to xxx 解决办法
cmake没怎么用,主要觉得Clion很好用,但是默认clion使用的是cmake.再说一句clion是linux平台上很好用,个人强推. 当你使用clion的时候,如果使用了thread cstl等 ...
- MySQL 异地 双机房同步之otter
一.背景: 阿里巴巴B2B公司,因为业务的特性,卖家主要集中在国内,买家主要集中在国外,所以衍生出了杭州和美国异地机房的需求, 同时为了提升用户体验,整个机房的架构为双A,两边均可写,由此诞生了ott ...
- 用 D3.js 画一个手机专利关系图, 看看苹果,三星,微软间的专利纠葛
前言 本文灵感来源于Mike Bostock 的一个 demo 页面 原 demo 基于 D3.js v3 开发, 笔者将其使用 D3.js v5 进行重写, 并改为使用 ES6 语法. 源码: gi ...
- JAVA学习第三周
判断某个字符串是否为回文 时间2019年9月23日下午 这个题有很多种写法,其一是用String来存这个字符串,然后调用charAt函数进行字符串的遍历,从两头开始遍历是否相等 其二是用toCharA ...
- jmeter-模板报错-Fatal Error! com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: 2 字节的 UTF-8 序列的字节 2 无效
使用的模板不能有中文!!!!检查模板.
- The Semantics of Constructors(拷贝构造函数之编译背后的行为)
本文是 Inside The C++ Object Model's Chapter 2 的部分读书笔记. 有三种情况,需要拷贝构造函数: 1)object直接为另外一个object的初始值 2)ob ...
- HDU - 5245 概率
JoyfulHDU - 5245 题目大意:有N*M个正方形,进行k次涂色,每次会随机的选两个正方形作为一个矩形区域的顶点,然后把这个区域内的涂色,最后问k次之后,预计被涂了色的正方形有几个(也就是数 ...