springboot对Jpa的支持

本文详细介绍了SpringBoot如何支持JPA,包括JPA的基本概念、主要技术组成,以及在SpringBoot项目中的配置和使用步骤。通过示例展示了实体类、DAO层、Service层的实现,并特别提醒了查询单个实体时的注意事项,避免使用已过时的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、Jpa简介:

JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。

2、JPA包括以下3方面的技术:

  1. ORM映射元数据
    JPA支持XML和JDK5.0注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中;
  2. API
    用来操作实体对象,执行CRUD操作,框架在后台替代我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来。
  3. 查询语言
    这是持久化操作中很重要的一个方面,通过面向对象而非面向数据

3、springboot中使用Jpa

3-1:构建项目时勾选jpa,或者直接导入pom依赖:
在这里插入图片描述
pom依赖:

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

3-2:application.yml文件配置:

spring:
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true

附:hibernate也是基于jpa实现的;

4、使用jpa完成自动建表功能:
4-1:实体类示例:
在这里插入图片描述4-2:运行生成后,数据库会产生两个表,一个是***hibernate_sequence***和你自己生成的表(例如:t_springboot_book):
hibernate_sequence是用来生成生成id的,存放id,
注:如果一个数据库生成多个数据表,也会同时共用一个hibernate_sequence表;

4-3:dao层:
只要继承JpaRespository,通常所用的增删改查方法都有:
参数一:操作的实体类
参数二:实体类对应数据表的主键;
例如:

public interface BookDao extends JpaRepository<Book,Integer>{
    
}

4-4:service层:

public interface BookService {

//增加和修改共用一个方法
    public Book save(Book book);

//删除的方法
    public void deleteById(Integer bid);

//查询的方法,包括复杂的查询
    public List<Book> list(Book book);

//查询单个的方法
    public Book getBook(Integer bid);


}

4-5:impl层:

@Service
public class BookServiceImpl implements BookService {

    @Autowired
    private BookDao bookDao;

    @Override
    public Book save(Book book) {
        return bookDao.save(book);
    }

    @Override
    public void deleteById(Integer bid) {
        bookDao.deleteById(bid);
    }

    @Override
    public List<Book> list(Book book) {
        return bookDao.findAll(new Specification<Book>() {
            @Override
            public Predicate toPredicate(Root<Book> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
                Predicate predicate =criteriaBuilder.conjunction();
                if(book != null && book.getBname()!=null||"".equals(book.getBname())){
                   predicate.getExpressions().add(criteriaBuilder.like(root.get("bname"),"%"+book.getBname()+"%"));
                }
                return predicate;
            }
        });
    }

    @Override
    public Book getBook(Integer bid) {
        return bookDao.findById(bid).get();
    }
}

4-6:关于高级复杂查询;
必须继承接口:paSpecificationExecutor

 *  要使用高级查询必须继承
 * org.springframework.data.jpa.repository.JpaSpecificationExecutor<T>接口
 */
public interface JpaDao extends JpaRepository<Book, Integer>, JpaSpecificationExecutor<Book> {
}
 @Override
    public List<Book> list(Book book) {
        return bookDao.findAll(new Specification<Book>() {
            @Override
            public Predicate toPredicate(Root<Book> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
                Predicate predicate =criteriaBuilder.conjunction();
                if(book != null && book.getBname()!=null||"".equals(book.getBname())){
                   predicate.getExpressions().add(criteriaBuilder.like(root.get("bname"),"%"+book.getBname()+"%"));
                }
                return predicate;
            }
        });
    }

4-7:controller层:

@RestController
public class BookController {

    @Autowired
    private BookService bookService;

    @RequestMapping("/book/list")
    public List<Book> list(Book book){
        return bookService.list(book);
    }


    @RequestMapping("/book/add")
    public Book add(Book book){
        return bookService.save(book);
    }

    @RequestMapping("/book/edit")
    public Book edit(Book book){
        return bookService.save(book);
    }

    @RequestMapping("/book/del")
    public String del(Integer bid){
        bookService.deleteById(bid);
        return "删除成功!";
    }

    @RequestMapping("/book/getBook")
    public Book getBook(Integer bid){
        return bookService.getBook(bid);
    }

}

在这里插入图片描述

5、关于查询单个的那些坑:

5-2:这个查询单个getone方法是使用不了的,已经过时了;
在这里插入图片描述
会报以下错误:
在这里插入图片描述
5-2:应该使用以下方法:findById().get();
在这里插入图片描述
注:修改和删除都是公用一个方法:save

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值