1、Jpa简介:
JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。
2、JPA包括以下3方面的技术:
- ORM映射元数据
JPA支持XML和JDK5.0注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中; - API
用来操作实体对象,执行CRUD操作,框架在后台替代我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来。 - 查询语言
这是持久化操作中很重要的一个方面,通过面向对象而非面向数据
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