SpringBoot系列(四)SpringBoot 之 Spring Data Jpa 支持
本系列博客将学习开发SpringBoot,快速开发项目
SpringBoot系列 (四):SpringBoot 之 Spring Data Jpa 支持
文档结构
- Spring Data Jpa 简介
- Spring Data Jpa 基本 crud 实现
- 自定义查询@Query
- 动态查询 Specification 使用
一、 Spring Data Jpa 简介
Spring-Data-Jpa
JPA(Java Persistence API)定义了一系列对象持久化的标准,
目前实现这一规范的产品有Hibernate、TopLink等。
Spring Data JPA 框架,主要针对的就是 Spring 唯一没有简化到的业务逻辑代码,至此,开发者连仅剩的实现持久层业务逻辑的工作都省了,唯一要做的,就只是声明持久层的接口,其他都交给 Spring Data JPA 来帮你完成!
下面我们来演示下SpringBoot下 Spring-Data-Jpa的使用
本贴就简单演示下 配置 以及自动生成表
首先第一步,引入jpa和mysql驱动支持
还是前面的方式 进入pom.xml,alt+/ 进入编辑视图
选择jpa和mysql
然后自动会引入
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
接下来配置application.properties
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/db_book
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形式)
二、Spring Data Jpa 基本 crud 实现
1、在application.yml中添加:
msyql:
jdbcName: com.mysql.jdbc.Driver
dbUrl: jdbc:mysql://localhost:3306/db_diary
userName: root
password: 123456
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/db_book
username: root
password: 123456
jpa:
hibernate.ddl-auto: update
show-sql: true
2、创建实体类:
@Entity
@Table(name="t_book")
public class Book {
@Id
@GeneratedValue
private Integer id;
@Column(length=100)
private String name;
@Column(length=50)
private String author;
//省略get、set方法
3、dao层
package com.tofree.dao;
import org.springframework.data.jpa.repository.JpaRepository;
import com.tofree.entity.Book;
public interface BookDao extends JpaRepository<Book, Integer>{
}
4、controller层
package com.tofree.controller;
import javax.annotation.Resource;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import com.tofree.dao.BookDao;
import com.tofree.entity.Book;
/**
* 图书控制器
* @author tofree
*
*/
@Controller
@RequestMapping("/book")
public class BookController {
@Resource
private BookDao bookDao;
/**
* 查询所有图书
* @return
*/
@RequestMapping("/list")
public ModelAndView list(){
ModelAndView mav=new ModelAndView();
mav.addObject("bookList", bookDao.findAll());
mav.setViewName("bookList");
return mav;
}
/**
* 添加图书
* @param book
* @return
*/
@RequestMapping(value="/add",method=RequestMethod.POST)
public String add(Book book){
bookDao.save(book);
return "forward:/book/list";
}
/**
* 根据id查询book实体
* @param id
* @return
*/
@RequestMapping("/preUpdate/{id}")
public ModelAndView preUpdate(@PathVariable("id")Integer id){
ModelAndView mav=new ModelAndView();
mav.addObject("book", bookDao.getOne(id));
mav.setViewName("bookUpdate");
return mav;
}
/**
* 修改图书
* @param book
* @return
*/
@PostMapping(value="/update")
public String update(Book book){
bookDao.save(book);
return "forward:/book/list";
}
@GetMapping("/delete")
public String delete(Integer id){
bookDao.delete(id);
return "forward:/book/list";
}
}
注意:save()有id就修改,没有就添加
三、自定义查询@Query
自定义查询的实现方式有两种:
1. Hql语言,Hibernate的sql: @Query(“select b from Book b where b.name like %?1%”)
2. 本地sql(推荐使用): @Query(value=”select * from t_book order by RAND() limit ?1”,nativeQuery=true)
dao层:
package com.tofree.dao;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import com.tofree.entity.Book;
public interface BookDao extends JpaRepository<Book, Integer>{
@Query("select b from Book b where b.name like %?1%")
public List<Book> findByName(String name);
@Query(value="select * from t_book order by RAND() limit ?1",nativeQuery=true)
public List<Book> randomList(Integer n);
}
controller层:
@ResponseBody
@GetMapping("/queryByName")
public List<Book> queryByName(){
return bookDao.findByName("编程");
}
@ResponseBody
@RequestMapping("/randomList")
public List<Book> randomList(){
return bookDao.randomList(2);
}
四、 动态查询 Specification 使用
在项目里搜索条件往往是多个的,比如有时候根据name搜索,有时根据作者搜索,此时可以使用:动态查询 Specification
步骤:
1. 在dao层添加JpaSpecificationExecutor接口
2. 在controller层实现方法
dao层:
package com.tofree.dao;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import com.tofree.entity.Book;
public interface BookDao extends JpaRepository<Book, Integer>,JpaSpecificationExecutor<Book>{
}
controller层:
/**
* 根据条件动态查询
* @param book
* @return
*/
@RequestMapping("/list2")
public ModelAndView list2(Book book){
ModelAndView mav=new ModelAndView();
List<Book> bookList=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.getName()!=null && !"".equals(book.getName())){
predicate.getExpressions().add(cb.like(root.get("name"), "%"+book.getName()+"%"));
}
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;
}
注意:predicate.getExpressions().add(cb.like(root.get(“name”), “%”+book.getName()+”%”)); 模糊查询使用like,等于使用equal
上一篇: P2P端口映射UPnP功能和使用详解
下一篇: Cisco网络教材:路由器基础介绍(一)
推荐阅读
-
springboot使用spring-data-jpa操作MySQL数据库
-
详解Spring Data JPA系列之投影(Projection)的用法
-
详解Spring Data JPA系列之投影(Projection)的用法
-
javaweb各种框架组合案例(六):springboot+spring data jpa(hibernate)+restful
-
Springboot整合Spring Data Jpa
-
Spring系列之——springboot解析resources.application.properties文件
-
spring-boot-2.0.3不一样系列之番外篇 - springboot事件机制,绝对有值得你看的地方
-
Spring Data 系列之JPA(二)
-
Spring Data 系列之JPA(一)
-
springboot+spring data jpa实现新增及批量新增方式