1、什么是JPA?
JPA全称Java Persistence API,是一组用于将数据存入数据库的类和方法的集合。JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。
2、JPA与Hibernate之间的关系
JPA是一种规范,旨在规范、简化Java对象的持久化工作。
JPA是开源API,各企业经营商Oracle, Redhat, Eclipse等,提供各种有特色的JPA产品,其中包括: Hiberate, Eclipselink, Toplink, Spring Data JPA等等。Hibernate就是JPA Provider中很强的一个。JPA和Hibernate之间的关系,可以简单的理解为JPA是标准接口,Hibernate是实现。
3、结合JPA实现增删改查
下面以图书管理实现增删改查,新建book对象
@Entity
@Table(name="t_book")
public class Book {
@Id
@GeneratedValue
private Integer bookid;
@Column(length=50)
private String bookname;
@Column(length=30)
private String author;
public Integer getBookid() {
return bookid;
}
public void setBookid(Integer bookid) {
this.bookid = bookid;
}
public String getBookname() {
return bookname;
}
public void setBookname(String bookname) {
this.bookname = bookname;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
}
public interface BookDao extends JpaRepository<Book, Integer>,JpaSpecificationExecutor<Book>{
}
BookController
@Controller
@RequestMapping("/book")
public class BookController {
@Resource
private BookDao bookDao;
@RequestMapping("/booklist")
public ModelAndView bookList() {
ModelAndView model = new ModelAndView();
model.addObject("booklist",bookDao.findAll());
model.setViewName("booklist");
return model;
}
/**
* 带条件的动态查询
* @return
*/
@RequestMapping("/listDynamicQuery")
public ModelAndView listDynamicQuery(Book book) {
ModelAndView model = new ModelAndView();
bookDao.findAll(new Specification<Book>() {
@Override
public Predicate toPredicate(Root<Book> root, CriteriaQuery<?> query,CriteriaBuilder cb) {
Predicate predicate = cb.conjunction();
if (book!=null) {
if (book.getBookname()!=null&&!"".equals(book.getBookname())) {
predicate.getExpressions().add(cb.like(root.get("bookname"), "%"+book.getBookname()+"%"));
}
if (book.getAuthor()!=null&&!"".equals(book.getAuthor())) {
predicate.getExpressions().add(cb.like(root.get("author"), "%"+book.getAuthor()+"%"));
}
}
return null;
}
});
model.addObject("booklist",bookDao.findAll());
model.setViewName("booklist");
return model;
}
@Transactional
@RequestMapping(value="/addbook",method=RequestMethod.POST)
public String addBook(Book book) {
bookDao.save(book);
return "forward:/book/booklist";
}
@RequestMapping("/preUpdate/{bookid}")
public ModelAndView preUpdate(@PathVariable("bookid") Integer bookid) {
ModelAndView model = new ModelAndView();
model.addObject("book", bookDao.getOne(bookid));
model.setViewName("bookupdate");
return model;
}
@PostMapping(value="/updatebook")
public String updateBook(Book book) {
bookDao.save(book);
return "forward:/book/booklist";
}
@GetMapping("/delbook")
public String delBook(Integer bookid) {
bookDao.delete(bookid);
return "forward:/book/booklist";
}
}
application.yml配置文件
server:
port: 80
context-path: /
spring:
datasource:
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/test
username: root
password: root
jpa:
hibernate:
ddl-auto: update
show-sql: true
booklist.ftl
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>图书管理</title>
</head>
<body>
<a href="/addbook.html">新增</a><br/>
<form method="post" action="/book/listDynamicQuery">
图书名称:<input type="text" name="bookname"/><br/>
图书作者:<input type="text" name="bookname"/><br/>
<input type="submint" value="查询"/>
</form>
<table>
<tr>
<th>序号</th>
<th>图书名称</th>
<th>图书作者</th>
<th>操作</th>
</tr>
<#list booklist as book>
<tr>
<td>${book.bookid}</td>
<td>${book.bookname}</td>
<td>${book.author}</td>
<td>
<a href="/book/preUpdate?${book.bookid}">修改</a>
<a href="/book/delbook?${book.bookid}">删除</a>
</td>
</tr>
</#list>
</table>
</body>
</html>
新增书籍页面 addbook.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>新增书籍</title>
</head>
<body>
<form action="/book/addbook" method="post">
图书名称:<input type="text" name="bookname"/><br/>
图书作者:<input type="text" name="author"/><br/>
<input type="submit" value="保存"/>
</form>
</body>
</html>
编辑书籍页面 bookupdate.ftl
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>新增书籍</title>
</head>
<body>
<form action="book/addbook" method="post">
<input type="hidden" name="bookid" value="${book.bookid}"/>
图书名称:<input type="text" name="bookname"/><br/>
图书作者:<input type="text" name="author"/><br/>
<input type="submit" value="保存"/>
</form>
</body>
</html>