一、SpringDataJpa简介
二、SpringDataJpa基本crud实现
1.新建个boot项目SpringDataJpa,在pom.xml新加 jpa 和mysql支持
2.新建个数据库db_book ,表t_book
3.新建个entity/Book.java
package com.guo.entity; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; @Entity // 实体 @Table(name="t_book") // 表 public class Book { @Id // 组件 @GeneratedValue //表 自增 private Integer bookid; @Column(length=100) // 对应字符串 长度100(自定义) private String bookname; @Column(length=50) private String author; private Integer price; @Column(length=100) private String press; 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 Integer getPrice() { return price; } public void setPrice(Integer price) { this.price = price; } public String getPress() { return press; } public void setPress(String press) { this.press = press; } }
4.配置数据源,不用application.properties改成yml格式
server: port: 80 servlet.context-path: / 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
6.新建个dao/BookDao.java
package com.guo.dao; import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.Query; import com.guo.entity.Book; //<>中Book对应实体类,Integer,主键什么类型就是什么 public interface BookDao extends JpaRepository<Book,Integer>,JpaSpecificationExecutor<Book> { }
7.新建个controller/BookController.java
package com.guo.controller; import java.util.List; import javax.annotation.Resource; import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Controller; import org.springframework.web.servlet.ModelAndView; import com.guo.dao.BookDao; import com.guo.entity.Book; /** * @author guoguo7533 * */ @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; } }
8.转发 新建个bookList.ftl
<!DOCTYPE html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <a href="/bookAdd.html">添加</a> <table> <tr> <th>编号</th> <th>书名</th> <th>作者</th> <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>${book.price}</td> <td>${book.press}</td> <td> <a href="/book/preUpdate/${book.bookid}">修改</a> <a href="/book/delete?id=${book.bookid}">删除</a> </td> </tr> </#list> </table> </body> </html>
9.结果显示
三、自定义查询@Query
1.现在bookDao接口 中添加
//SQL查询 @Query("select b from Book b where b.bookname like %?1%") //?1表示第一个参数 即String bookname public List<Book> findByName(String bookname); //本地查询 如果用到数据库的函数 如随机函数 //nativeQuery=true 表本地查询开启 默认是false @Query(value="select * from t_book order by RAND() limit ?1",nativeQuery=true) public List<Book> randomList(Integer n); //n 表示随机查询的条数
2.在controller 中加入
//按书名模糊查询 @ResponseBody @GetMapping("/queryByName") public List<Book> queryByName(){ return bookDao.findByName("算法"); } // 指定查询条数 随机查询 @ResponseBody @GetMapping("/randomList") public List<Book> randomList(){ return bookDao.randomList(2); }
3.结果
四、动态查询Specification使用
比如说 搜索 ,有两个条件框,一个是按名称,一个是按分类,但用户只填了一个,那就需动态判断
1.首先BookDao要继承个接口,接口可以多继承
,JpaSpecificationExecutor<Book>
2.controller层
// 根据条件动态查询 @RequestMapping("/list2") public ModelAndView list2(Book book){ ModelAndView mav=new ModelAndView(); List<Book> bookList=bookDao.findAll(new Specification<Book>(){//findAll()还有个带参数page的用于分页 //内部类 @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 predicate; } }//内部类结束 ); mav.addObject("bookList", bookList); mav.setViewName("bookList"); return mav; }
3.bookList.ftl
<form method="post" action="/book/list2"> 图书名称:<input type="text" name="bookname" /> 图书作者:<input type="text" name="author" /> <input type="submit" value="搜索"/> </form>
4.结果