一、前言
前些时间一直在学习Spring Boot整合Mybatis,现在给大家分享一下我学习JPA的经验,如果发现此文有什么问题或者改正的地方,欢迎大家在博客下面留言.
二、项目搭建
2.1 创建项目
新建一个Spring Initializr项目
创建项目的文件结构以及jdk的版本
此demo选择的JDK版本为1.8
选择项目所需要的依赖
完成项目创建
2.2 数据库准备
创建数据库
create database 'bookstudy_jpa' default character set utf8;
因为使用JPA的方式,在此故不需要创建表,表的创建在项目启动时,会根据实体类自动生成.
2.3 项目构建
2.3.1 创建实体类
package book.study.springboot_jpa.entity; import lombok.Data; import javax.persistence.*; @Data @Entity(name = "t_book") public class Book { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; @Column(name = "book_name",nullable = false) private String name; private String author; private String price; @Transient private String description; }
- @Entity 表示该类是一个实体类,在项目启动时会根据该类自动生成一个表
- @Id 表示该属性是一个主键,@GeneratedValue 表示该主键自动生成,strategy表示生成策略
- @Column 定制生成字段的属性,name表示该属性对应在表中字段的名字.默认为实体类的属性
- @Transient 表示在生成数据表时,该属性别忽略,不生成对应的字段
2.3.2 创建BookDao接口
public interface BookDao extends JpaRepository<Book, Integer> { List<Book> getBookByAuthorStartingWith(String author); List<Book> getBookByPriceGreaterThan(Float price); @Query(value = "select * from t_book where id = (select max(id) from t_book)", nativeQuery = true) Book getMaxIdBook(); List<Book> getBookByAuthor(String author); List<Book> getBookByName(String name); }
- BookDao继承JpaRepository.JpaRepository提供许多基本数据操作方法.
- 在JPA中,主要方法符合既定规范,Spring Data就能分析开发者的意图. 既定规范可以去官网附录C下查看,也可以参看其他博主的博文
2.3.3 创建BookService类
@Service public class BookService { @Autowired private BookDao bookDao; public void addBook(Book book) { bookDao.save(book); } public Page<Book> getBookByPage(Pageable pageable) { return bookDao.findAll(pageable); } public List<Book> getBookByAuthorStartingWith(String author) { return bookDao.getBookByAuthorStartingWith(author); } public List<Book> getBookByPriceGreaterThan(Float price) { return bookDao.getBookByPriceGreaterThan(price); } public Book getMaxIdBook() { return bookDao.getMaxIdBook(); } public List<Book> getBookByAuthor(String author) { return bookDao.getBookByAuthor(author); } public List<Book> getBookByName(String name) { return bookDao.getBookByName(name); } }
- 在addBook()方法下的save()借口由JpaRepository提供
- 在getBookByPage()方法下,返回值Page
带有分页常用数据.
2.3.4 创建BookController
@RestController public class BookController { @Autowired private BookService bookService; @GetMapping("/save") public void save() { Book book = new Book(); book.setAuthor("author"); book.setName("bookName"); book.setPrice(23F); bookService.addBook(book); System.out.println("addBook:"+book.toString()); } @GetMapping("/search") public void search() { List<Book> bs1 = bookService.getBookByName("bookName"); System.out.println("getBookByName:" + bs1); } @GetMapping("/findAll") public void findAll() { PageRequest pageRequest = PageRequest.of(0, 3); Page<Book> page = bookService.getBookByPage(pageRequest); System.out.println("总页数:"+page.getTotalPages()); System.out.println("总记录数:"+page.getTotalElements()); System.out.println("查询结果:"+page.getContent()); System.out.println("当前页数:"+(page.getNumber()+1)); System.out.println("当前页记录数"+page.getNumberOfElements()); System.out.println("每页记录数:"+page.getSize()); } }
2.3.5 修改配置文件
spring: datasource: type: com.alibaba.druid.pool.DruidDataSource url: jdbc:mysql://localhost:3306/bookstudy_jpa?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false username: root password: password jpa: show-sql: true database: mysql hibernate: ddl-auto: update properties: hibernate:
三、运行效果
- http://localhost:8080/save
- http://localhost:8080/findAll
- http://localhost:8080/search
四、参考资料
《Spring Boot + Vue 全栈开发实战》王松 著
JPA官方文档的Appendix C: Repository query keywords目录下有相关命名规范