下面的例子是基于 SpringBoot JPA 以及 H2 数据库来实现的, 下面就开始搭建项目吧.
首先看下项目的整体结构:
具体操作步骤:
打开 IDEA, 创建一个新的 Spring Initializr 项目, 填写好 groupID 等信息, 依赖勾选 Web 和 H2, 一路 next:
pom.xml 关键依赖:
- <dependencies>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-Web</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-data-jpa</artifactId>
- </dependency>
- <dependency>
- <groupId>com.h2database</groupId>
- <artifactId>h2</artifactId>
- <scope>runtime</scope>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <scope>test</scope>
- </dependency>
- </dependencies>
新建 controller,domain,service 包, 创建 JPA 实体类 User:
- package com.example.demo.domain;
- import org.springframework.format.annotation.DateTimeFormat;
- import java.io.Serializable;
- import java.time.LocalDate;
- import javax.persistence.*;
- /**
- * @Description: SpringBoot 自动配置会探测到我们使用了 H2 数据库, 它会根据实体类自动创建数据表
- * @author: Alan
- * @Date: 2018/11/30 22:33
- */
- @Entity
- @Table(name = "user")
- public class User implements Serializable{
- private static final long serialVersionUID = 1L;
- @Id
- @GeneratedValue(strategy = GenerationType.IDENTITY)
- private Long id;// 主键
- @Column(nullable = false)
- private String firstName;// 名
- @Column(nullable = false)
- private String lastName;// 姓
- @Column(nullable = false)
- private String idCard;// 身份证
- @Column(nullable = false)
- @DateTimeFormat(pattern = "yyyy-MM-dd")
- private LocalDate dateOfBirth;// 出生日期
- public User() {
- }
- public User(Long id, String firstName, String lastName, String idCard, LocalDate dateOfBirth) {
- this.id = id;
- this.firstName = firstName;
- this.lastName = lastName;
- this.idCard = idCard;
- this.dateOfBirth = dateOfBirth;
- }
- public Long getId() {
- return id;
- }
- public void setId(Long id) {
- this.id = id;
- }
- public String getFirstName() {
- return firstName;
- }
- public void setFirstName(String firstName) {
- this.firstName = firstName;
- }
- public String getLastName() {
- return lastName;
- }
- public void setLastName(String lastName) {
- this.lastName = lastName;
- }
- public String getIdCard() {
- return idCard;
- }
- public void setIdCard(String idCard) {
- this.idCard = idCard;
- }
- public LocalDate getDateOfBirth() {
- return dateOfBirth;
- }
- public void setDateOfBirth(LocalDate dateOfBirth) {
- this.dateOfBirth = dateOfBirth;
- }
- @Override
- public String toString() {
- return "User{" +
- "id=" + id +
- ", firstName='" + firstName + '\'' +
- ", lastName='" + lastName + '\'' +
- ", idCard='" + idCard + '\'' +
- ", dateOfBirth=" + dateOfBirth +
- '}';
- }
- }
说明:
@Entity: 指明了这是一个 entity
@Table: 指定生成的表名
@Id: 标记该 entity 的主键
@GeneratedValue: 提供主键的生成策略
编写配置文件和数据生成语句:
- application.properties:
- # 激活开发环境的的配置文件
- spring.profiles.active=dev
- application-dev.properties:
- # 端口设置
- server.port=8080
- # 开启日志记录 (日志文件会在 10Mb 大小的时候被截断, 产生新的日志文件)
- logging.file=logs/my.log
- spring.h2.console.enabled=true
- spring.jpa.open-in-view=true
- spring.data.jpa.repositories.Bootstrap-mode=default
- logging.level.org.hibernate.SQL=debug
- import.sql:
- INSERT INTO USER (FIRST_NAME, LAST_NAME, ID_CARD, DATE_OF_BIRTH) values ('Steven1', 'Jobs1','630121199206081105', '1998-07-13');
- INSERT INTO USER (FIRST_NAME, LAST_NAME, ID_CARD, DATE_OF_BIRTH) values ('Steven2', 'Jobs2','510181199412105672', '1992-07-13');
- INSERT INTO USER (FIRST_NAME, LAST_NAME, ID_CARD, DATE_OF_BIRTH) values ('Steven3', 'Jobs','610702199009261457', '1991-07-13');
- INSERT INTO USER (FIRST_NAME, LAST_NAME, ID_CARD, DATE_OF_BIRTH) values ('Steven4', 'Jobs','430426198801075355', '1994-07-13');
- INSERT INTO USER (FIRST_NAME, LAST_NAME, ID_CARD, DATE_OF_BIRTH) values ('Steven5', 'Michael','420117199502232760', '1998-07-13');
- INSERT INTO USER (FIRST_NAME, LAST_NAME, ID_CARD, DATE_OF_BIRTH) values ('Steven6', 'Michael','130203199404122670', '1998-07-13');
- INSERT INTO USER (FIRST_NAME, LAST_NAME, ID_CARD, DATE_OF_BIRTH) values ('Steven7', 'Michael','430703197612014630', '1998-07-13');
- INSERT INTO USER (FIRST_NAME, LAST_NAME, ID_CARD, DATE_OF_BIRTH) values ('Steven8', 'Michael','350124197805280264', '1998-07-13');
- INSERT INTO USER (FIRST_NAME, LAST_NAME, ID_CARD, DATE_OF_BIRTH) values ('Steven9', 'Michael','500230197205314628', '1998-08-19');
- JpaRepository
该接口继承了 PagingAndSortingRepository 和 QueryByExampleExecutor 接口, 相比 CrudRepository 接口多了分页和排序功能, 因此 JpaRepository 功能更加全面, 如果你不需要分页和排序功能, 使用 CrudRepository 即可. 这里我们使用 JpaRepository, 其定义如下:
- @NoRepositoryBean
- public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
- UserRepository(相当于 DAO 层, 定义了增删改查的方法):
- package com.example.demo.service;
- import com.example.demo.domain.User;
- import org.springframework.data.domain.Page;
- import org.springframework.data.domain.Pageable;
- import org.springframework.data.domain.Sort;
- 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 java.time.LocalDate;
- import java.util.List;
- /**
- * @Description:
- * @author: Alan
- * @Date: 2018/11/30 22:54
- */
- public interface UserRepository extends JpaRepository<User, Long>{
- /******************************create***************************************/
- @Override
- User save(User user);
- /******************************read***************************************/
- /**
- * Using sort
- * @param lastName
- * @param sort
- * @return
- */
- @Query("select u from User u where u.lastName like ?1%")
- List<User> findByAndSort(String lastName, Sort sort);
- /**
- * Query creation
- * this translates into the following query:
- * select u from User u where u.idCard = ?1
- */
- User findByIdCard(String idCard);
- /**
- * Native Queries
- * The @Query annotation allows for running native queries by setting the nativeQuery flag to true
- * @param idCard
- * @return
- */
- @Query(value = "select * from user where ID_CARD = ?1", nativeQuery = true)
- User findByIdCard2(String idCard);
- /**
- * Using @Query
- * @param idCard
- * @return
- */
- @Query("select u from User u where u.idCard = ?1")
- User findByIdCard3(String idCard);
- /**
- * Declare native count queries for pagination at the query method by using @Query
- * @param lastName
- * @param pageable
- * @return
- */
- @Query(value = "SELECT * FROM User WHERE LAST_NAME = ?1",
- countQuery = "SELECT count(*) FROM User WHERE LAST_NAME = ?1",
- nativeQuery = true)
- Page<User> findByLastNameWithPageable(String lastName, Pageable pageable);
- /**
- * Using Named Parameters
- * @param firstName
- * @param lastName
- * @return
- */
- @Query("select u from User u where u.firstName = :firstName or u.lastName = :lastName")
- List<User> findByFirstNameOrLastName(@Param("firstName") String firstName,
- @Param("lastName") String lastName);
- /**
- * findByDateOfBirth
- * @param date
- * @return
- */
- List<User> findByDateOfBirth(@Param("date") LocalDate date);
- /**
- * find all users
- * @param sort
- * @return
- */
- @Override
- List<User> findAll(Sort sort);
- /****************************update*****************************************/
- /**
- * update a usr by Modifying Queries
- * @param firstName
- * @param idCard
- * @return
- */
- @Modifying
- @Query("update User u set u.firstName = ?1 where u.idCard = ?2")
- int updateUser(String firstName, String idCard);
- /****************************delete*****************************************/
- /**
- * delete a user by idCard
- * @param idCard
- */
- void deleteByIdCard(String idCard);
- /**
- * Using a derived delete query
- * @param idCard
- */
- @Modifying
- @Query("delete from User u where u.idCard = ?1")
- void deleteByIdCard2(String idCard);
- /**
- * delete a user by id
- * @param id
- */
- @Override
- @Modifying
- @Query(value = "delete from user where id = ?1", nativeQuery = true)
- void deleteById(Long id);
- }
- UserService:
- package com.example.demo.service;
- import com.example.demo.domain.User;
- import org.springframework.data.domain.Page;
- import org.springframework.data.domain.Pageable;
- import org.springframework.data.domain.Sort;
- import org.springframework.data.repository.query.Param;
- import java.time.LocalDate;
- import java.util.List;
- /**
- * @Description:
- * @author: Alan
- * @Date: 2018/12/1 11:44
- */
- public interface UserService {
- /****************************create*****************************************/
- User save(User user);
- /****************************read*****************************************/
- List<User> findByAndSort(String lastName, Sort sort);
- User findByIdCard(String idCard);
- User findByIdCard2(String idCard);
- User findByIdCard3(String idCard);
- Page<User> findByLastNameWithPageable(String lastName, Pageable pageable);
- List<User> findByFirstNameOrLastName(String firstName, String lastName);
- List<User> findByDateOfBirth(@Param("date") LocalDate date);
- List<User> findAll(Sort sort);
- /*****************************update****************************************/
- int updateUser(String firstName, String idCard);
- /*****************************delete****************************************/
- void deleteByIdCard(String idCard);
- void deleteByIdCard2(String idCard);
- void deleteById(Long id);
- }
- UserServiceImpl:(UserService 的实现类)
- package com.example.demo.service;
- import com.example.demo.domain.User;
- import org.springframework.data.domain.Page;
- import org.springframework.data.domain.Pageable;
- import org.springframework.data.domain.Sort;
- import org.springframework.data.repository.query.Param;
- import org.springframework.stereotype.Component;
- import org.springframework.transaction.annotation.Transactional;
- import java.time.LocalDate;
- import java.util.List;
- /**
- * @Description:
- * @author: Alan
- * @Date: 2018/12/1 11:44
- */
- @Component("userService")
- @Transactional
- public class UserServiceImpl implements UserService {
- private UserRepository userRepository;
- UserServiceImpl(UserRepository userRepository) {
- this.userRepository = userRepository;
- }
- /**************************create********************************/
- @Override
- public User save(User user) {
- return userRepository.save(user);
- }
- /**************************read********************************/
- @Override
- public List<User> findByAndSort(String lastName, Sort sort) {
- return userRepository.findByAndSort(lastName, sort);
- }
- @Override
- public User findByIdCard(String idCard) {
- return userRepository.findByIdCard(idCard);
- }
- @Override
- public User findByIdCard2(String idCard) {
- return userRepository.findByIdCard2(idCard);
- }
- @Override
- public User findByIdCard3(String idCard) {
- return userRepository.findByIdCard3(idCard);
- }
- @Override
- public Page<User> findByLastNameWithPageable(String lastName, Pageable pageable) {
- return userRepository.findByLastNameWithPageable(lastName, pageable);
- }
- @Override
- public List<User> findByFirstNameOrLastName(String firstName, String lastName) {
- return userRepository.findByFirstNameOrLastName(firstName, lastName);
- }
- @Override
- public List<User> findByDateOfBirth(@Param("date") LocalDate date) {
- return userRepository.findByDateOfBirth(date);
- }
- @Override
- public List<User> findAll(Sort sort) {
- return userRepository.findAll(sort);
- }
- /**************************update********************************/
- @Override
- public int updateUser(String firstName, String idCard) {
- return userRepository.updateUser(firstName, idCard);
- }
- /**************************delete********************************/
- @Override
- public void deleteByIdCard(String idCard) {
- userRepository.deleteByIdCard(idCard);
- }
- @Override
- public void deleteByIdCard2(String idCard) {
- userRepository.deleteByIdCard2(idCard);
- }
- @Override
- public void deleteById(Long id) {
- userRepository.deleteById(id);
- }
- }
- UserController:
- package com.example.demo.controller;
- import com.example.demo.domain.User;
- import com.example.demo.service.UserService;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.data.domain.Page;
- import org.springframework.data.domain.PageRequest;
- import org.springframework.data.domain.Pageable;
- import org.springframework.data.domain.Sort;
- import org.springframework.format.annotation.DateTimeFormat;
- import org.springframework.transaction.annotation.Transactional;
- import org.springframework.Web.bind.annotation.PathVariable;
- import org.springframework.Web.bind.annotation.RequestMapping;
- import org.springframework.Web.bind.annotation.RequestMethod;
- import org.springframework.Web.bind.annotation.RestController;
- import java.time.LocalDate;
- import java.util.List;
- /**
- * @Description:
- * POST - Create a new resource
- * GET - Read a resource
- * PUT - Update an existing resource
- * DELETE - Delete a resource
- * Tomcat by default is not enabled for HTTP PUT command.
- * 只要让地址栏的参数可以传入函数里面, 就能执行修改, 新增, 删除操作, method 用 RequestMethod.GET 即可
- * 用 PUT,POST,DELETE 会报 405 错误, 因为输入到地址栏默认使用 GET 方法
- * 注解 @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) 主要是解决请求日期无法转成 LocalDate 的问题
- * @author: Alan
- * @Date: 2018/12/1 10:38
- */
- @RestController
- public class UserController {
- @Autowired
- private UserService userService;
- /*****************************create*************************************/
- @RequestMapping(value = "/saveUser/{firstName}/{lastName}/{idCard}/{date}",method = RequestMethod.GET)
- @Transactional
- public User saveUser(@PathVariable String firstName,
- @PathVariable String lastName,
- @PathVariable String idCard,
- @PathVariable @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate date) {
- User user = new User();//Id 是自增长的, 不需要传
- user.setFirstName(firstName);
- user.setLastName(lastName);
- user.setIdCard(idCard);
- user.setDateOfBirth(date);
- return userService.save(user);
- }
- /*****************************Read***** ********************************/
- @RequestMapping(value = "/findByAndSort/{lastName}", method = RequestMethod.GET)
- public List<User> findByAndSort(@PathVariable String lastName) {
- Sort sort = new Sort(Sort.Direction.DESC, "firstName");
- return userService.findByAndSort(lastName, sort);
- }
- @RequestMapping(value = "/findByIdCard/{idCard}", method = RequestMethod.GET)
- @Transactional(readOnly = true)
- public User findByIdCard(@PathVariable(name = "idCard") String idCard) {
- return userService.findByIdCard(idCard);
- }
- @RequestMapping(value = "/findByIdCard2/{idCard}", method = RequestMethod.GET)
- @Transactional(readOnly = true)
- public User findByIdCard2(@PathVariable(name = "idCard") String idCard) {
- return userService.findByIdCard2(idCard);
- }
- @RequestMapping(value = "/findByIdCard3/{idCard}", method = RequestMethod.GET)
- @Transactional(readOnly = true)
- public User findByIdCard3(@PathVariable(name = "idCard") String idCard) {
- return userService.findByIdCard3(idCard);
- }
- @RequestMapping(value = "/findByLastNameWithPageable/{lastName}", method = RequestMethod.GET)
- @Transactional(readOnly = true)
- public Page<User> findByLastNameWithPageable(@PathVariable String lastName) {
- Sort sort = new Sort(Sort.Direction.DESC, "id");
- Pageable pageable = new PageRequest(5,2,sort);
- return userService.findByLastNameWithPageable(lastName, pageable);
- }
- @RequestMapping(value = "/findByFirstNameOrLastName/{firstName}/{lastName}", method = RequestMethod.GET)
- public List<User> findByFirstNameOrLastName(@PathVariable String firstName,
- @PathVariable String lastName) {
- return userService.findByFirstNameOrLastName(firstName, lastName);
- }
- @RequestMapping(value = "/findByDateOfBirth/{date}", method = RequestMethod.GET)
- public List<User> findByDateOfBirth(@PathVariable(name = "date")
- @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate date) {
- return userService.findByDateOfBirth(date);
- }
- @RequestMapping(value = "/findAll", method = RequestMethod.GET)
- public List<User> findAll() {
- Sort sort = new Sort(Sort.Direction.ASC, "id");
- return userService.findAll(sort);
- }
- /*****************************update*************************************/
- @RequestMapping(value = "/updateUser/{firstName}/{idCard}", method = RequestMethod.GET)
- public int updateUser(@PathVariable String firstName, @PathVariable String idCard) {
- return userService.updateUser(firstName, idCard);
- }
- /*****************************delete*************************************/
- @RequestMapping(value = "/deleteByIdCard/{idCard}", method = RequestMethod.GET)
- @Transactional
- public String deleteByIdCard(@PathVariable String idCard) {
- userService.deleteByIdCard(idCard);
- return "SUCCESS";
- }
- @RequestMapping(value = "/deleteByIdCard2/{idCard}", method = RequestMethod.GET)
- @Transactional
- public String deleteByIdCard2(@PathVariable String idCard) {
- userService.deleteByIdCard2(idCard);
- return "SUCCESS";
- }
- @RequestMapping(value = "/deleteById/{id}", method = RequestMethod.GET)
- @Transactional
- public String deleteById(@PathVariable Long id) {
- userService.deleteById(id);
- return "SUCCESS";
- }
- }
SpringBoot 主类移植 com 包下, 这样其他类才能被扫描到:
启动 SpringBoot 项目: 点击菜单栏的运行按钮或者运行 main 方法
此时控制台可以看到创建表和插入 sql 语句的日志:
查询所有用户:
浏览器地址栏输入: http://localhost:8080/findAll
可以看到所有的记录:
- [
- {
- "id": 1,
- "firstName": "Steven1",
- "lastName": "Jobs1",
- "idCard": "630121199206081105",
- "dateOfBirth": "1998-07-13"
- },
- {
- "id": 2,
- "firstName": "Steven2",
- "lastName": "Jobs2",
- "idCard": "510181199412105672",
- "dateOfBirth": "1992-07-13"
- },
- {
- "id": 3,
- "firstName": "Steven3",
- "lastName": "Jobs",
- "idCard": "610702199009261457",
- "dateOfBirth": "1991-07-13"
- },
- {
- "id": 4,
- "firstName": "Steven4",
- "lastName": "Jobs",
- "idCard": "430426198801075355",
- "dateOfBirth": "1994-07-13"
- },
- {
- "id": 5,
- "firstName": "Steven5",
- "lastName": "Michael",
- "idCard": "420117199502232760",
- "dateOfBirth": "1998-07-13"
- },
- {
- "id": 6,
- "firstName": "Steven6",
- "lastName": "Michael",
- "idCard": "130203199404122670",
- "dateOfBirth": "1998-07-13"
- },
- {
- "id": 7,
- "firstName": "Steven7",
- "lastName": "Michael",
- "idCard": "430703197612014630",
- "dateOfBirth": "1998-07-13"
- },
- {
- "id": 8,
- "firstName": "Steven8",
- "lastName": "Michael",
- "idCard": "350124197805280264",
- "dateOfBirth": "1998-07-13"
- },
- {
- "id": 9,
- "firstName": "Steven9",
- "lastName": "Michael",
- "idCard": "500230197205314628",
- "dateOfBirth": "1998-08-19"
- }
- ]
- View Code
新增一个 user:
http://localhost:8080/saveUser/java/springboot/330987193709193205/1937-09-19
页面会输出新插入的 user:
此时再 findAll, 会发现多了新插入的 id 为 10 的记录:
- [
- {
- "id": 1,
- "firstName": "Steven1",
- "lastName": "Jobs1",
- "idCard": "630121199206081105",
- "dateOfBirth": "1998-07-13"
- },
- {
- "id": 2,
- "firstName": "Steven2",
- "lastName": "Jobs2",
- "idCard": "510181199412105672",
- "dateOfBirth": "1992-07-13"
- },
- {
- "id": 3,
- "firstName": "Steven3",
- "lastName": "Jobs",
- "idCard": "610702199009261457",
- "dateOfBirth": "1991-07-13"
- },
- {
- "id": 4,
- "firstName": "Steven4",
- "lastName": "Jobs",
- "idCard": "430426198801075355",
- "dateOfBirth": "1994-07-13"
- },
- {
- "id": 5,
- "firstName": "Steven5",
- "lastName": "Michael",
- "idCard": "420117199502232760",
- "dateOfBirth": "1998-07-13"
- },
- {
- "id": 6,
- "firstName": "Steven6",
- "lastName": "Michael",
- "idCard": "130203199404122670",
- "dateOfBirth": "1998-07-13"
- },
- {
- "id": 7,
- "firstName": "Steven7",
- "lastName": "Michael",
- "idCard": "430703197612014630",
- "dateOfBirth": "1998-07-13"
- },
- {
- "id": 8,
- "firstName": "Steven8",
- "lastName": "Michael",
- "idCard": "350124197805280264",
- "dateOfBirth": "1998-07-13"
- },
- {
- "id": 9,
- "firstName": "Steven9",
- "lastName": "Michael",
- "idCard": "500230197205314628",
- "dateOfBirth": "1998-08-19"
- },
- {
- "id": 10,
- "firstName": "java",
- "lastName": "springboot",
- "idCard": "330987193709193205",
- "dateOfBirth": "1937-09-19"
- }
- ]
- View Code
更新一个 user:
将刚插入的 id 为 10 的用户的 firstName 修改成 java666:
http://localhost:8080/updateUser/java666/330987193709193205
页面返回 1, 表示修改成功.
输入: http://localhost:8080/findByIdCard/330987193709193205
可以看到身份证为 330987193709193205 的 firstName 确实被修改了:
删除一个 user:
输入: http://localhost:8080/deleteById/1
页面显示:
这样 id 为 1 的 user 就被删除了, 再输入 http://localhost:8080/findAll,id 为 1 的 user 已不存在:
- [
- {
- "id": 2,
- "firstName": "Steven2",
- "lastName": "Jobs2",
- "idCard": "510181199412105672",
- "dateOfBirth": "1992-07-13"
- },
- {
- "id": 3,
- "firstName": "Steven3",
- "lastName": "Jobs",
- "idCard": "610702199009261457",
- "dateOfBirth": "1991-07-13"
- },
- {
- "id": 4,
- "firstName": "Steven4",
- "lastName": "Jobs",
- "idCard": "430426198801075355",
- "dateOfBirth": "1994-07-13"
- },
- {
- "id": 5,
- "firstName": "Steven5",
- "lastName": "Michael",
- "idCard": "420117199502232760",
- "dateOfBirth": "1998-07-13"
- },
- {
- "id": 6,
- "firstName": "Steven6",
- "lastName": "Michael",
- "idCard": "130203199404122670",
- "dateOfBirth": "1998-07-13"
- },
- {
- "id": 7,
- "firstName": "Steven7",
- "lastName": "Michael",
- "idCard": "430703197612014630",
- "dateOfBirth": "1998-07-13"
- },
- {
- "id": 8,
- "firstName": "Steven8",
- "lastName": "Michael",
- "idCard": "350124197805280264",
- "dateOfBirth": "1998-07-13"
- },
- {
- "id": 9,
- "firstName": "Steven9",
- "lastName": "Michael",
- "idCard": "500230197205314628",
- "dateOfBirth": "1998-08-19"
- },
- {
- "id": 10,
- "firstName": "java666",
- "lastName": "springboot",
- "idCard": "330987193709193205",
- "dateOfBirth": "1937-09-19"
- }
- ]
- View Code
分页查询:
输入: http://localhost:8080/findByLastNameWithPageable/Michale
页面显示: lastName 为 Michale 的共有 5 条记录, page 设置: 每页 2 个, 共 5 页
输出结果与程序一致:
附录:
注解说明:
@Entity: 指明了这是一个 entity
@Table: 指定生成的表名
@Id: 标记该 entity 的主键
@GeneratedValue: 提供主键的生成策略
@Component: 声明为一个组件
@Transactional: 声明为事务
@Autowired: 自动注入
@Query: 查询操作
@Modifying: 修改操作
@PathVariable: 将 URL 中的请求参数绑定到控制器的入参上
@Override: 重写
@Param: 声明属性
语句说明:
1, 使用 SpEL 表达式
- @Query("select u from User u where u.idCard = ?1")
- User findByIdCard3(String idCard);
2, 使用原生 SQL(需添加 nativeQuery=true)
- @Query(value = "select * from user where ID_CARD = ?1", nativeQuery = true)
- User findByIdCard2(String idCard);
3, 使用属性表达式 (Property Expressions)
- User findByIdCard(String idCard);
- (注: 上面的方法, JPA 会转换成等价的查询语句: select * from User u where u.idCard = ?1)
官方文档上的 JPA 标准 API:
Keyword | Sample | JPQL snippet |
---|---|---|
And | findByLastnameAndFirstname | … where x.lastname = ?1 and x.firstname = ?2 |
Or | findByLastnameOrFirstname | … where x.lastname = ?1 or x.firstname = ?2 |
Is,Equals | findByFirstname,findByFirstnameIs,findByFirstnameEquals | … where x.firstname = ?1 |
Between | findByStartDateBetween | … where x.startDate between ?1 and ?2 |
LessThan | findByAgeLessThan | … where x.age < ?1 |
LessThanEqual | findByAgeLessThanEqual | … where x.age <= ?1 |
GreaterThan | findByAgeGreaterThan | … where x.age > ?1 |
GreaterThanEqual | findByAgeGreaterThanEqual | … where x.age >= ?1 |
After | findByStartDateAfter | … where x.startDate > ?1 |
Before | findByStartDateBefore | … where x.startDate < ?1 |
IsNull | findByAgeIsNull | … where x.age is null |
IsNotNull,NotNull | findByAge(Is)NotNull | … where x.age not null |
Like | findByFirstnameLike | … where x.firstname like ?1 |
NotLike | findByFirstnameNotLike | … where x.firstname not like ?1 |
StartingWith | findByFirstnameStartingWith | … where x.firstname like ?1(parameter bound with appended %) |
EndingWith | findByFirstnameEndingWith | … where x.firstname like ?1(parameter bound with prepended %) |
Containing | findByFirstnameContaining | … where x.firstname like ?1(parameter bound wrapped in %) |
OrderBy | findByAgeOrderByLastnameDesc | … where x.age = ?1 order by x.lastname desc |
Not | findByLastnameNot | … where x.lastname <> ?1 |
In | findByAgeIn(Collection<Age> ages) | … where x.age in ?1 |
NotIn | findByAgeNotIn(Collection<Age> ages) | … where x.age not in ?1 |
True | findByActiveTrue() | … where x.active = true |
False | findByActiveFalse() | … where x.active = false |
IgnoreCase | findByFirstnameIgnoreCase | … where UPPER(x.firstame) = UPPER(?1) |
4, 使用命名参数 (: 参数名 +@Param)
- @Query("select u from User u where u.firstName = :firstName or u.lastName = :lastName")
- List<User> findByFirstNameOrLastName(@Param("firstName") String firstName,
- @Param("lastName") String lastName);
H2 数据库控制台:
地址栏输入 http://localhost:8080/h2-console / 进入 H2 控制台
程序运行流程图 (调用关系):
以上就是 SpringBoot JPA 增删改查的简单应用, 当然你也可以将数据库换成 MySQL.
官方参考文档:
来源: https://www.cnblogs.com/stm32stm32/p/10052810.html