zoukankan      html  css  js  c++  java
  • 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.结果

    本博客为博主的学习笔记,不作任何商业用途。
  • 相关阅读:
    《团队名称》第八次团队作业:Alpha冲刺
    《代码敲不队》第八次团队作业:Alpha冲刺 第四天
    《代码敲不队》第八次团队作业:Alpha冲刺 第三天
    《代码敲不队》第八次团队作业:Alpha冲刺 第二天
    《代码敲不队》第八次团队作业:Alpha冲刺 第一天
    【Beta】Scrum meeting 3
    【Beta】Scrum meeting 2
    《队长说得队》第九次团队作业:Beta冲刺与验收准备
    【Beta】Scrum meeting 1
    《队长说得队》【Alpha】Scrum meeting 5
  • 原文地址:https://www.cnblogs.com/guo7533/p/8722133.html
Copyright © 2011-2022 走看看