Spring-Data-Jpa JPA(Java Persistence API)定义了一系列对象持久化的标准,目前实现这一规范的产品有Hibernate、TopLink等。
Spring Data JPA 框架,主要针对的就是 Spring 唯一没有简化到的业务逻辑代码,至此,开发者连仅剩的实现持久层业务逻辑的工作都省了,唯一要做的,就只是声明持久层的接口,其他都交给 Spring Data JPA 来帮你完成!
我这里使用的数据库是mysql,引入对应的依赖
<dependency> <groupId>org.mybatis.spring.bootgroupId> <artifactId>mybatis-spring-boot-starterartifactId> <version>1.3.0version> dependency> <dependency> <groupId>mysqlgroupId> <artifactId>mysql-connector-javaartifactId> dependency> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-data-jpaartifactId> dependency>
接下来配置application.properties
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/db_book?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf8&useSSL=true spring.datasource.username=root spring.datasource.password=123456 spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true
上面是配置数据源
下面是配置比如ddl-auto 学过hibernate的都知道 我们一般用update 更新操作
show-sql 是显示sql语句
注意:上面我们会发现 这种properties形式的配置有点冗余,后面一一帖我们改成主流的yml形式
上面配置完 我们要在数据库里新建一个db_book
使用Spring-Data-Jpa来实现CRUD操作,视图层采用Freemarker
1.新建一个Book实体
package com.jd.entity; //新建一个entity import javax.persistence.*; //声明一个实体,用的是Java规范下的注解 name="t_book") //映射的表名称 (public class Book { /** * id,唯一不重复 * 声明主键 * 声明主键的生成策略 */ private Integer id; length=100) //对应数据库的字段,长度为100,类型为varchar ( private String bookName; length = 100) ( private String author; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } 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; } }
2.这里我们先把application.properties修改成application.yml 主流格式
在 spring boot 中,有两种配置文件,一种是application.properties,另一种是application.yml,两种都可以配置spring boot 项目中的一些变量的定义,参数的设置等,yml 文件在写的时候层次感强,而且少写了代码。所以现在很多人都使用yml配置文件。
可以参考:https://www.cnblogs.com/baoyi/p/SpringBoot_YML.html
application.yml
server: port: 8080 servlet: helloworld: hello spring boot spring: datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/db_book?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf8&useSSL=true username: root password: system jpa: hibernate: ddl-auto: update show-sql: true
**yml格式有个注意点 冒号后面一定要加个空格 ,并且注意层次关系!!!!
3.图书Dao接口,要求实现JpaRepository,和JpaSpecificationExecutor接口
import com.jd.entity.Book; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.Query; import java.util.List; /** * jpa里面已经帮我们封装了一些基本的增删改查的方法,如果需要自定义可以像我这样写在下面 */ public interface BookDao extends JpaRepository<Book,Integer>, JpaSpecificationExecutor<Book> { /** * 使用SQL查询 * @param name ?1 ==>指的是方法中的第一个参数 * @return */ "select b from Book b where b.bookName like %?1%") ( public List<Book> findByName(String name); /** * 使用SQL查询 * @param n * @return随机查询一条数据 */ value="select * from t_book order by RAND() limit ?1",nativeQuery=true) ( public List<Book> randomList(Integer n); }
4.BookController,我们这里就不编写Service了,直接在这里操作Dao实现CRUD,当然真实企业开发不会这样做。
package com.jd.controller; import com.jd.dao.BookDao; import com.jd.entity.Book; import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; import javax.annotation.Resource; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; import java.util.List; /** * Created by ${HeJD} on 2018/6/27. */ "/book") (public class BookController { private BookDao bookDao; /** * 查询所有图书 * @return */ "/list") ( public ModelAndView list(){ ModelAndView mav=new ModelAndView(); mav.addObject("bookList", bookDao.findAll()); mav.setViewName("bookList"); return mav; } /** * 根据条件动态查询 * @param book * @return */ "/list2") ( public ModelAndView list2(Book book){ ModelAndView mav=new ModelAndView(); List<Book> bookList=bookDao.findAll(new Specification<Book>() { 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 predicate; } }); mav.addObject("bookList", bookList); mav.setViewName("bookList"); return mav; } /** * 添加图书 * @param book * @return */ value="/add",method=RequestMethod.POST) ( public String add(Book book){ bookDao.save(book); return "forward:/book/list"; } /** * 根据id查询book实体 * @param id * @return */ "/preUpdate/{id}") ( public ModelAndView preUpdate( ("id")Integer id){ ModelAndView mav=new ModelAndView(); mav.addObject("book", bookDao.getOne(id)); mav.setViewName("bookUpdate"); return mav; } /** * 修改图书 * @param book * @return */ value="/update") ( public String update(Book book){ bookDao.save(book); return "forward:/book/list"; } /** * 删除图书 * @param id * @return */ "/delete") ( public String delete(Integer id){ bookDao.deleteById(id); return "forward:/book/list"; } /** * 根据名称查询图书 * @return */ "/queryByName") ( public List<Book> queryByName(){ return bookDao.findByName("编程"); } "/randomList") ( public List<Book> randomList(){ return bookDao.randomList(2); } }
这里的@GetMapping(value="xxx") 类似 @RequestMapping(value="xxx",method=RequestMethod.GET)
以及@PostMapping(value="xxx") 类似 @RequestMapping(value="xxx",method=RequestMethod.POST)
5.bookList.ftl 展示数据(templates目录下)
<html> <head> <meta charset="UTF-8"> <title>图书管理title> head> <body> <a href="/bookAdd.html">添加a><br/> <form method="post" action="/book/list2"> 图书名称:<input type="text" name="bookName" /> 图书作者:<input type="text" name="author" /> <input type="submit" value="搜索"/> form> <table> <tr> <th>编号th> <th>图书名称th> <th>图书作者th> <th>操作th> tr> <#list bookList as book> <tr> <td>${book.id}td> <td>${book.bookName}td> <td>${book.author}td> <td> <a href="/book/preUpdate/${book.id}">修改a> <a href="/book/delete?id=${book.id}">删除a> td> tr> #list> table> body> html>
6.bookAdd.html 图书添加页面(这个页面放在webapp下,如果没有这个目录自己新建一个)
<html> <head> <meta charset="UTF-8"> <title>图书添加页面title> head> <body> <form action="book/add" method="post"> 图书名称:<input type="text" name="bookName"/><br/> 图书作者:<input type="text" name="author"/><br/> <input type="submit" value="提交"/> form> body> html>
7.bookUpdate.ftl图书修改页面(templates目录下)
<html> <head> <meta charset="UTF-8"> <title>图书修改title> head> <body> <form action="/book/update" method="post"> <input type="hidden" name="id" value="${book.id}"/> 图书名称:<input type="text" name="bookName" value="${book.bookName}"/><br/> 图书作者:<input type="text" name="author" value="${book.author}"/><br/> <input type="submit" value="提交"/> form> body> html>