Spring boot学习笔记之四:SpringBoot操作之Spring-Data-Jpa

Spring-Data-Jpa JPA(Java Persistence API)定义了一系列对象持久化的标准,目前实现这一规范的产品有Hibernate、TopLink等。

Spring Data JPA 框架,主要针对的就是 Spring 唯一没有简化到的业务逻辑代码,至此,开发者连仅剩的实现持久层业务逻辑的工作都省了,唯一要做的,就只是声明持久层的接口,其他都交给 Spring Data JPA 来帮你完成!

1 准备

我这里使用的数据库是mysql,引入对应的依赖

    <!-- Spring-Mybatis 如果需要整个mybatis需要引引入这个依赖-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.0</version>
        </dependency>

        <!-- MySQL -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--spring jpa支持-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

接下来配置application.properties

spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/db_book?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf8&useSSL=true
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形式

上面配置完 我们要在数据库里新建一个db_book

2 编码

使用Spring-Data-Jpa来实现CRUD操作,视图层采用Freemarker

1.新建一个Book实体

package com.jd.entity; //新建一个entity


import javax.persistence.*;

@Entity  //声明一个实体,用的是Java规范下的注解
@Table(name="t_book") //映射的表名称
public class Book {

     /**
      * id,唯一不重复
      * 声明主键
      * 声明主键的生成策略
      */
    @Id
    @GeneratedValue
    private Integer id;

    @Column(length=100)  //对应数据库的字段,长度为100,类型为varchar
    private String bookName;
    
    @Column(length = 100)
    private String author;
    
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    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;
    }


}

2.这里我们先把application.properties修改成application.yml 主流格式

在 spring boot 中,有两种配置文件,一种是application.properties,另一种是application.yml,两种都可以配置spring boot 项目中的一些变量的定义,参数的设置等,yml 文件在写的时候层次感强,而且少写了代码。所以现在很多人都使用yml配置文件。

可以参考:https://www.cnblogs.com/baoyi/p/SpringBoot_YML.html

application.yml

server:
  port: 8080
  servlet:

    
helloworld: hello spring boot


spring:
    datasource:
      driver-class-name: com.mysql.jdbc.Driver
      url: jdbc:mysql://localhost:3306/db_book?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf8&useSSL=true
      username: root
      password: system
    jpa:
      hibernate:
        ddl-auto: update
      show-sql: true

**yml格式有个注意点 冒号后面一定要加个空格 ,并且注意层次关系!!!!

3.图书Dao接口,要求实现JpaRepository,和JpaSpecificationExecutor接口

import com.jd.entity.Book;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;

import java.util.List;
​/**
 * jpa里面已经帮我们封装了一些基本的增删改查的方法,如果需要自定义可以像我这样写在下面
 */

public interface BookDao extends JpaRepository<Book,Integer>, JpaSpecificationExecutor<Book> {

    /**
     * 使用SQL查询
     * @param name ?1 ==>指的是方法中的第一个参数
     * @return
     */
    @Query("select b from Book b where b.bookName like %?1%")
    public List<Book> findByName(String name);

    /**
     * 使用SQL查询
     * @param n
     * @return随机查询一条数据
     */
    @Query(value="select * from t_book order by RAND() limit ?1",nativeQuery=true)
    public List<Book> randomList(Integer n);
}

4.BookController,我们这里就不编写Service了,直接在这里操作Dao实现CRUD,当然真实企业开发不会这样做。

package com.jd.controller;

import com.jd.dao.BookDao;
import com.jd.entity.Book;

import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import javax.annotation.Resource;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.util.List;

/**
 * Created by ${HeJD} on 2018/6/27.
 */
@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("/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.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;
    }
     /**
     * 添加图书
     * @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";
    }

    /**
     * 删除图书
     * @param id
     * @return
     */
    @GetMapping("/delete")
    public String delete(Integer id){
        bookDao.deleteById(id);
        return "forward:/book/list";
    }

    /**
     * 根据名称查询图书
     * @return
     */
    @ResponseBody
    @GetMapping("/queryByName")
    public List<Book> queryByName(){
        return bookDao.findByName("编程");
    }

    @ResponseBody
    @GetMapping("/randomList")
    public List<Book> randomList(){
        return bookDao.randomList(2);
    }
}

这里的@GetMapping(value="xxx") 类似 @RequestMapping(value="xxx",method=RequestMethod.GET)

以及@PostMapping(value="xxx") 类似 @RequestMapping(value="xxx",method=RequestMethod.POST)

5.bookList.ftl 展示数据(templates目录下)

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>图书管理</title>
</head>
<body>
<a href="/bookAdd.html">添加</a><br/>
<form method="post" action="/book/list2">
    图书名称:<input type="text" name="bookName" />&nbsp;
    图书作者:<input type="text" name="author" />&nbsp;
    <input type="submit" value="搜索"/>
</form>
<table>
    <tr>
        <th>编号</th>
        <th>图书名称</th>
        <th>图书作者</th>
        <th>操作</th>
    </tr>
    <#list bookList as book>
        <tr>
            <td>${book.id}</td>
            <td>${book.bookName}</td>
            <td>${book.author}</td>
            <td>
                <a href="/book/preUpdate/${book.id}">修改</a>
                <a href="/book/delete?id=${book.id}">删除</a>
            </td>
        </tr>
    </#list>
</table>
</body>
</html>

6.bookAdd.html 图书添加页面(这个页面放在webapp下,如果没有这个目录自己新建一个)


<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>图书添加页面</title>
</head>
<body>
<form action="book/add" method="post">
    图书名称:<input type="text" name="bookName"/><br/>
    图书作者:<input type="text" name="author"/><br/>
    <input type="submit" value="提交"/>
</form>
</body>
</html>

7.bookUpdate.ftl图书修改页面(templates目录下)

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>图书修改</title>
</head>
<body>
<form action="/book/update" method="post">
    <input type="hidden" name="id" value="${book.id}"/>
    图书名称:<input type="text" name="bookName" value="${book.bookName}"/><br/>
    图书作者:<input type="text" name="author" value="${book.author}"/><br/>
    <input type="submit" value="提交"/>
</form>
</body>
</html>

结果:




猜你喜欢

转载自blog.csdn.net/eeeeasy/article/details/80831367