SpringBoot学习笔记之SpringDataJpa支持

一、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" />&nbsp;
         图书作者:<input type="text" name="author" />&nbsp;
         <input type="submit" value="搜索"/>
</form>

4.结果

本博客为博主的学习笔记,不作任何商业用途。
原文地址:https://www.cnblogs.com/guo7533/p/8722133.html