`

SpringBoot支持Spring Data Jpa

阅读更多
1. Spring Data Jpa简介

JPA(Java Persistence API)定义了一系列对象持久化的标准,目前实现这一规范的产品有Hibernate、TopLink等。
SpringDataJPA框架,主要针对的就是Spring唯一没有简化到的业务逻辑代码,至此,开发者连仅剩的实现持久层业务逻辑的工作都省了,唯一要做的,就只是声明持久层的接口,其他都交给SpringDataJPA来帮你完成!


2. Spring Data Jpa基本crud实现

新建项目SpringDataJpaCrud

pom.xml引入jpa和mysql驱动支持

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<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

server.port=8000
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/springboot
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.hibernate.ddl-auto=update
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.show-sql=true

book.java

package com.andrew.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="t_book")
public class Book {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    @Column(length=100)
    private String name;
    @Column(length=50)
    private String author;
    
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAuthor() {
        return author;
    }
    public void setAuthor(String author) {
        this.author = author;
    }
}

HelloWorldApplication.java右键Run As选择Spring Boot App

项目成功启动
数据库自动创建t_book表

insert into t_book values(1, 'author01', 'java编程思想');
insert into t_book values(2, 'author02', 'mysql必知必会');
insert into t_book values(3, 'author03', 'oracle必知必会');

将application.properties修改成application.yml

server: 
    port: 8000
    context-path: /
spring: 
    datasource: 
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3306/springboot
        username: root
        password: root
    jpa: 
        hibernate: 
            ddl-auto: update
        database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
        show-sql: true

src/main/java/com/andrew/dao/BookDao.java
要求实现JpaRepository

package com.andrew.dao;
import org.springframework.data.jpa.repository.JpaRepository;
import com.andrew.entity.Book;
public interface BookDao extends JpaRepository<Book, Integer> {
}

src/main/java/com/andrew/controller/BookController.java
@GetMapping(value="xxx")类似@RequestMapping(value="xxx",method=RequestMethod.GET)
@PostMapping(value="xxx")类似@RequestMapping(value="xxx",method=RequestMethod.POST)

package com.andrew.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.andrew.dao.BookDao;
import com.andrew.entity.Book;

@Controller
@RequestMapping("/book")
public class BookController {
    @Resource
    private BookDao bookDao;
    @RequestMapping("/list")
    public ModelAndView list() {
        ModelAndView mv = new ModelAndView();
        mv.addObject("bookList", bookDao.findAll());
        mv.setViewName("bookList");
        return mv;
    }
    @RequestMapping(value = "/add", method = RequestMethod.POST)
    public String add(Book book) {
        bookDao.save(book);
        return "forward:/book/list";
    }
    @RequestMapping("/preUpdate/{id}")
    public ModelAndView preUpdate(@PathVariable("id") Integer id) {
        ModelAndView mv = new ModelAndView();
        mv.addObject("book", bookDao.getOne(id));
        mv.setViewName("bookUpdate");
        return mv;
    }
    @PostMapping(value = "/update")
    public String update(Book book) {
        bookDao.save(book);
        return "forward:/book/list";
    }
    @GetMapping("/delete")
    public String delete(Integer id) {
        bookDao.deleteById(id);
        return "forward:/book/list";
    }
}

src/main/resources/templates/bookList.ftl

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>图书管理</title>
</head>
<body>
<a href="/bookAdd.html">添加</a>
<table>
    <tr>
        <th>编号</th>
        <th>图书名称</th>
        <th>图书作者</th>
        <th>操作</th>
    </tr>
    <#list bookList as book>
        <tr>
            <td>${book.id}</td>
            <td>${book.name}</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>

src/main/resources/templates/bookUpdate.ftl

<!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="name" value="${book.name}"/><br/>
    图书作者:<input type="text" name="author" value="${book.author}"/><br/>
    <input type="submit" value="提交"/>
</form>
</body>
</html>

src/main/webapp/bookAdd.html

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

HelloWorldApplication.java右键Run As选择Spring Boot App

http://localhost:8000/book/list
添加 click
http://localhost:8000/bookAdd.html
abc 123 提交
http://localhost:8000/book/add
修改 click
abcdef 123456 提交
http://localhost:8000/book/update
删除 click
http://localhost:8000/book/delete?id=4


3. 自定义查询@Query

4. 动态查询Specification使用

bookList.ftl

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>图书管理</title>
</head>
<body>
<a href="/bookAdd.html">添加</a>
<form method="post" action="/book/specification">
    图书名称:<input type="text" name="name" />&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.name}</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>

src/main/java/com/andrew/dao/BookDao.java
继承JpaSpecificationExecutor<Book>

package com.andrew.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.andrew.entity.Book;

public interface BookDao extends JpaRepository<Book, Integer>, JpaSpecificationExecutor<Book> {
    @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);
}

src/main/java/com/andrew/controller/BookController.java

package com.andrew.controller;
import java.util.List;
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 org.springframework.data.jpa.domain.Specification;
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.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import com.andrew.dao.BookDao;
import com.andrew.entity.Book;

@Controller
@RequestMapping("/book")
public class BookController {
    @Resource
    private BookDao bookDao;

    @RequestMapping("/list")
    public ModelAndView list() {
        ModelAndView mv = new ModelAndView();
        mv.addObject("bookList", bookDao.findAll());
        mv.setViewName("bookList");
        return mv;
    }
    @RequestMapping(value = "/add", method = RequestMethod.POST)
    public String add(Book book) {
        bookDao.save(book);
        return "forward:/book/list";
    }
    @RequestMapping("/preUpdate/{id}")
    public ModelAndView preUpdate(@PathVariable("id") Integer id) {
        ModelAndView mv = new ModelAndView();
        mv.addObject("book", bookDao.getOne(id));
        mv.setViewName("bookUpdate");
        return mv;
    }
    @PostMapping(value = "/update")
    public String update(Book book) {
        bookDao.save(book);
        return "forward:/book/list";
    }
    @GetMapping("/delete")
    public String delete(Integer id) {
        bookDao.deleteById(id);
        return "forward:/book/list";
    }
    @ResponseBody
    @GetMapping("/queryByName")
    public List<Book> queryByName(){
        return bookDao.findByName("编程");
    }
    @ResponseBody
    @GetMapping("/randomList")
    public List<Book> randomList(){
        return bookDao.randomList(2);
    }
    @RequestMapping("/specification")
    public ModelAndView specification(Book book){
        ModelAndView mv = 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;
            }
        });
        mv.addObject("bookList", bookList);
        mv.setViewName("bookList");
        return mv;
    }
}

http://localhost:8000/book/queryByName
[{"id":1,"name":"java编程思想","author":"author01"}]
http://localhost:8000/book/randomList
[{"id":3,"name":"oracle必知必会","author":"author03"},{"id":2,"name":"mysql必知必会","author":"author02"}]
[{"id":1,"name":"java编程思想","author":"author01"},{"id":2,"name":"mysql必知必会","author":"author02"}]
http://localhost:8000/book/list
java 搜索
1    java编程思想    author01    修改 删除
必知必会 搜索
2    mysql必知必会    author02    修改 删除
3    oracle必知必会    author03    修改 删除
分享到:
评论

相关推荐

    基于SpringBoot+SpringDataJPA+Mysql的课表排课及实验室机房管理系统

    本系统采用SpringBoot、SpringDataJPA以及Mysql数据库,这三大技术的组合为实现这一目标提供了强大支持。 **SpringBoot** 是一个用于简化Spring应用初始搭建以及开发过程的框架。它集成了大量常用的第三方库配置,...

    使用 SpringBoot + SpringDataJPa 设计通用的权限管理系统,适合管理系统快速开发迭代,可用于开发模板

    使用 SpringBoot + SpringDataJPa 设计通用的权限管理系统,适合管理系统快速开发迭代,可用于开发模板,项目经过测试,可完美运行! 使用 SpringBoot + SpringDataJPa 设计通用的权限管理系统,适合管理系统快速...

    仓库管理系统,SpringBoot+Spring Data JPA.zip

    仓库管理系统,SpringBoot+Spring Data JPA.zip仓库管理系统,SpringBoot+Spring Data JPA.zip仓库管理系统,SpringBoot+Spring Data JPA.zip仓库管理系统,SpringBoot+Spring Data JPA.zip仓库管理系统,SpringBoot...

    springboot+springdatajpa+thymeleaf+shiro 的管理平台框架

    《构建基于SpringBoot、SpringDataJPA、Thymeleaf和Shiro的高效管理平台框架》 在现代Web开发中,高效、稳定的管理平台框架是不可或缺的。本框架结合了SpringBoot、SpringDataJPA、Thymeleaf和Shiro等技术,构建了...

    基于Thymeleaf+SpringBoot+SpringDataJPA实现的的中小医院信息管理系统

    本系统是基于Thymeleaf+SpringBoot+SpringDataJPA实现的的中小医院信息管理系统。简单实现了挂号收费,门诊管理,划价收费,药房取药,体检管理,药房管理,系统维护等基础功能。就诊卡提供了手动和读卡两种方式录入...

    基于SpringBoot+Spring Data JPA+mybatis的仓库管理系统.zip

    基于SpringBoot+Spring Data JPA+mybatis的仓库管理系统 基于SpringBoot+Spring Data JPA+mybatis的仓库管理系统 基于SpringBoot+Spring Data JPA+mybatis的仓库管理系统 基于SpringBoot+Spring Data JPA+mybatis的...

    Java本科毕业设计-Springboot+Spring Data JPA 仓库管理系统.zip

    Java本科毕业设计-Springboot+Spring Data JPA 仓库管理系统,也可做期末大作业,课程设计。Java本科毕业设计-Springboot+Spring Data JPA 仓库管理系统,也可做期末大作业,课程设计。Java本科毕业设计-Springboot+...

    springboot+spring data jpa+thymeleaf学习web项目整合demo源码

    在 "springboot+spring data jpa+thymeleaf学习web项目整合demo源码" 中,我们可以学习到以下几个关键知识点: 1. **Spring Boot 整合**:Spring Boot 可以与多个框架集成,如 Spring MVC、Spring Data 和 ...

    springBoot整合springData JPA

    **SpringBoot整合SpringData JPA** 是一个现代Java开发中的常见技术栈,它结合了Spring Boot的便捷性和Spring Data JPA的数据访问效率。Spring Boot简化了应用的初始搭建以及配置,而Spring Data JPA则是Spring ...

    基于SpringBoot+Spring Data JPA+mybatis的仓库管理系统源码.zip

    1、基于SpringBoot+Spring Data JPA+mybatis的仓库管理系统源码.zip 2、该资源包括项目的全部源码,下载可以直接使用! 3、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考...

    SpringBoot + SpringData Jpa + Scala + Mysql(java+Scala混编)

    在SpringBoot项目中,pom.xml用于声明SpringBoot起步依赖、SpringData JPA、Scala库、MySQL驱动等相关依赖,使得Maven能够自动下载和管理这些依赖。 【src】 src目录是Java项目中的源代码目录,通常包含main和test...

    springboot+springdata jpa增删改查

    SpringBoot和SpringData JPA是Java开发中的两个关键框架,它们极大地简化了Web应用程序的构建过程,特别是数据库操作。SpringBoot以其"开箱即用"的特性,减少了配置工作,而SpringData JPA则提供了对Java ...

    SpringBoot+Spring data JPA+FreeMarker+shiro+log4jdbc

    综合上述技术,这个项目可能是一个使用SpringBoot作为基础框架,通过Spring Data JPA进行数据库操作,使用FreeMarker作为模板引擎展示页面,Shiro负责安全控制,而Log4jdbc则用于记录数据库查询日志的Web应用。...

    基于SpringBoot和Spring Data JPA的健身房管理系统设计源码

    该项目是一款基于SpringBoot,Spring Data JPA,Shiro,BootStrap,Layui的前后端项目,旨在为健身房提供一个高效、便捷的管理系统,支持会员管理、课程预约、数据统计等功能,帮助健身房更好地管理和使用资源。

    仓库管理系统,SpringBoot+Spring Data JPA+mybatis.zip

    《仓库管理系统:SpringBoot、Spring Data JPA与MyBatis的整合应用》 在现代企业信息化建设中,仓库管理系统是不可或缺的一部分,它帮助企业有效管理库存,提高运营效率。本项目采用SpringBoot、Spring Data JPA...

    webmagic+springboot+SpringDataJpa.zip

    【标题】"webmagic+springboot+SpringDataJpa.zip"是一个包含集成WebMagic爬虫框架、Spring Boot和Spring Data JPA技术的项目压缩包。这个项目旨在展示如何利用这些技术进行定时抓取网站数据,并将抓取到的数据存储...

    基于SpringBoot + SpringData JPA + SpringSecurity + SpringSec.zip

    SpringData JPA支持通过简单的注解和查询方法,实现对数据库的CRUD操作。通过Repository接口,开发者无需编写大量的DAO层代码,极大地减少了重复工作,提高了代码的可读性和可维护性。 **SpringSecurity** Spring...

    仓库管理系统,SpringBoot+Spring Data JPA+.zip

    《仓库管理系统:基于SpringBoot与Spring Data JPA的实现》 仓库管理系统是现代企业运营中的重要组成部分,它负责对库存物品进行高效的管理,包括入库、出库、库存盘点等操作。本项目采用SpringBoot框架结合Spring ...

    idea下整合springboot+spring data jpa

    在开发Java应用时,Spring Boot和Spring Data JPA是两个非常重要的框架,它们极大地简化了项目的构建和数据访问。Spring Boot提供了快速启动和配置的机制,而Spring Data JPA则是Spring框架的一部分,专注于数据库...

Global site tag (gtag.js) - Google Analytics