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依赖:
springboot对Jpa的支持
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:实体类示例:
springboot对Jpa的支持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);
    }

}

springboot对Jpa的支持

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

5-2:这个查询单个getone方法是使用不了的,已经过时了;
springboot对Jpa的支持
会报以下错误:
springboot对Jpa的支持
5-2:应该使用以下方法:findById().get();
springboot对Jpa的支持
注:修改和删除都是公用一个方法:save

相关文章: