前景提要
请先看看笔者的下列文章:
JPA到Spring data JPA
Spring data家族的模块
Spring MVC及常用注解
SpringBoot整合SpringDataJPA依赖和配置导入
参考引用的文章:
JPQL语句格式
Spring Boot项目文件结构
目录结构是Spring MVC的结构
Controller层:控制层,控制负责具体的业务模块流程的控制,在此层要调用service层的接口来控制业务流程
Entity层:实体层 ,数据库在项目中的类,放实体对象
Repository层也叫做Dao层:持久层,主要与数据库进行交互
Spring data JPA支持的操作
Spring Boot JPA就是一层的封装后的数据库操作方式,使得不需要再写JPA的JPQL的数据库操作语句,使得操作变得非常简单。
在进行操作前
导入pom文件依赖和修改application的配置,请看SpringBoot整合SpringDataJPA依赖和配置导入
查询操作
这里有全部的代码和解析Spring data JPA查询操作完整案例,代码根据JpaRepository接口完成,Repository其他接口也可以完成查询方法
第一步:声明接口
请看Spring Data JPA的Repository接口讲解接口内容,在Repositity里构造一个继承的接口,注意尖括号里写的是<类名,id的数据类型>
public interface UserRepository extends JpaRepository<User, Integer> {
}
第二步:构造查询
查询方式
基本查询也分为两种,一种是spring data默认已经实现,一种是根据查询的方法来自动解析成SQL。
- 自定义的简单查询就是根据方法名来自动生成SQL,主要的语法是findXXBy,readAXXBy,queryXXBy,countXXBy,getXXBy后面跟属性名称
- 具体的关键字,使用方法和生产成SQL,如下表所示。JpaRepository查询方法解析流程请看Spring Data JPA的Repository接口
注意:
- 按照Spring Data的规范,查询方法以find | read | get 开头,涉及查询条件时,条件的属性用条件关键字连接.注意的是:条件属性以首字母大写。而接口也会针对这些用户自命名的方法进行解析,
- 实体类里有什么属性才可以查(操作)什么属性
笔者个人对表的理解和解释
keyword列是SQL语句里的关键字,也就是我们在写SQL语句时候的必须用到的。
JPQL snippet列就是JPA规范下,我们在查数据库是需要写的语句。JPQL对SQL语句进行一次封装,形成自己的语法。
Sample列就是Spring data JPA对JPA的JPQL进一步的封装,变成了一个方法!!!大大简化数据库,我们就不需要再写一串长的语句。你需要查什么,就根据你的实体有什么属性,然后按照步骤做就行。
比如查询操作,要查询Person表matthew chen这个人
SQL写法:select firstname,lastname from Person where lastname = ‘chen’ and firstname = ‘matthew’
JPQL写法:select p from Person p where p.lastname = ?chen and p.firstname = ?matthew
sample:调用findByLastnameAndFirstname
全过程代码和解释请看Spring data JPA查询操作完整案例
第二步:特殊查询操作(分页\排序\使用@Query来指定本地查询等)
第三步:控制层操作
全过程代码和解释请看Spring data JPA查询操作完整案例
增删改查的本质上差不多,搞懂查询,后续的增删改就易上手
删除操作
两种常用方式:第一个直接利用函数;第二个@Modifying + @Query实现JPQL语句实现删除操作
@Repository
interface UserRepository extends Repository<User, Long> {
//删除操作
Long deleteByLastname(String lastname);
List<User> removeByLastname(String lastname);
@Modifying
@Query("delete from User u where user.id = ?1")
void deleteById(Integer id);
}
修改操作
方式一:直接找到要修改的内容,然后改掉就行
方式二:@Modifying + @Query表示进行update操作,JPQL不支持insert操作
@Controller
@RequestMapping(value = "/theuser")
public class UserController {
@RequestMapping(value = "/update")
@ResponseBody
public String update() {
Optional<User> user = userRepository.findById(1);
User newuser=user.get();
System.out.println("旧用户名: "+newuser.getUsername());
newuser.setUsername("409");
userRepository.save(newuser);
System.out.println("新用户名: "+newuser.getUsername());
return "Successfully update!";
}
}
@Modifying
@Query("update usertable set lastname = :lastname")
void updateUser(@Param("lastName")String lastName);
可以参考这个文章
增添操作
@Controller
@RequestMapping(value = "/user")
public class UserController {
@RequestMapping(value = "/insert")
@ResponseBody
public String TestSave() {
User user = new User();
user.setId(1);
user.setPassword(BCrypt.hashpw("0308"));
userRepository.save(user);
return "Successfully insert!";
}
}