文档章节

springboot系列八 Spring-Data-JPA

yimingkeji
 yimingkeji
发布于 2018/12/02 20:27
字数 1062
阅读 41
收藏 6
JPA(Java Persistence API)是一种对象关系映射的ORM框架,springboot-jpa可以用简单的配置来完成一些常规的数据库crud操作

文档:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/

DEMO

依赖

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.0.RELEASE</version>
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.16.14</version>
        <scope>provided</scope>
    </dependency>
    <!--开发工具-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
</dependencies>

配置

server:
  port: 8080
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver # mysql8推荐使用cj.jdbc, com.mysql.jdbc.Driver不推荐使用了
    #数据库连接池默认使用 tomcat-jdbc
    tomcat:
      max-idle: 10
      min-idle: 1
      initial-size: 1
  jpa:
    database: MYSQL
    show-sql: true
    hibernate:
      ddl-auto: update

实体

@Data
@Entity(name = "user")
public class User {
    @Id
    private int id;

    private String name;

    @Column(name = "phone_number", unique = true)
    private String phoneNumber;

    @Column(name = "create_time")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime = new Date();
}

dao

public interface UserRepository extends JpaRepository<User, Integer> {
}

rest接口

@RestController
@RequestMapping("/user")
public class UserResource {

    @Autowired
    private UserRepository userRepository;

    @GetMapping("")
    public List<User> list(){
        return userRepository.findAll();
    }

    @PostMapping("")
    public User add(@RequestBody User user){
        return userRepository.save(user);
    }
}

启动类

@SpringBootApplication
public class MysqlApp {
    public static void main(String[] args) {
        SpringApplication.run(MysqlApp.class, args);
    }
}

启动app后,使用rest工具如postman来测试。

POST http://localhost:8080/user
---
request body:
{
	"name":"六六六",
	"phoneNumber":"15500000006"
}
---
response:
{
    "id": 0,
    "name": "六六六",
    "phoneNumber": "15500000006",
    "createTime": "2018-12-02T01:34:41.382+0000"
}
GET http://localhost:8080/user
---
[
    {
        "id": 1,
        "name": "张三",
        "phoneNumber": "15500000001",
        "createTime": "2018-12-01T13:04:53.000+0000"
    },
    {
        "id": 2,
        "name": "李四",
        "phoneNumber": "15500000002",
        "createTime": "2018-12-01T13:04:56.000+0000"
    },
    {
        "id": 3,
        "name": "王五",
        "phoneNumber": "15500000003",
        "createTime": "2018-12-01T13:05:02.000+0000"
    },
    {
        "id": 5,
        "name": "六六六",
        "phoneNumber": "15500000006",
        "createTime": "2018-12-02T01:34:41.000+0000"
    }
]

JPA常用查询方法

官方文档

关键字 举例 对应JPQL
And findByLastnameAndFirstname … where x.lastname = ?1 and x.firstname = ?2
Or findByLastnameOrFirstname … where x.lastname = ?1 or x.firstname = ?2
Is,Equals findByFirstname,findByFirstnameIs,findByFirstnameEquals … where x.firstname = ?1
Between findByStartDateBetween … where x.startDate between ?1 and ?2
LessThan findByAgeLessThan … where x.age < ?1
LessThanEqual findByAgeLessThanEqual … where x.age <= ?1
GreaterThan findByAgeGreaterThan … where x.age > ?1
GreaterThanEqual findByAgeGreaterThanEqual … where x.age >= ?1
After findByStartDateAfter … where x.startDate > ?1
Before findByStartDateBefore … where x.startDate < ?1
IsNull findByAgeIsNull … where x.age is null
IsNotNull,NotNull findByAge(Is)NotNull … where x.age not null
Like findByFirstnameLike … where x.firstname like ?1
NotLike findByFirstnameNotLike … where x.firstname not like ?1
StartingWith findByFirstnameStartingWith … where x.firstname like ?1 (parameter bound with appended %)
EndingWith findByFirstnameEndingWith … where x.firstname like ?1 (parameter bound with prepended %)
Containing findByFirstnameContaining … where x.firstname like ?1 (parameter bound wrapped in %)
OrderBy findByAgeOrderByLastnameDesc … where x.age = ?1 order by x.lastname desc
Not findByLastnameNot … where x.lastname <> ?1
In findByAgeIn(Collection<Age> ages) … where x.age in ?1
NotIn findByAgeNotIn(Collection<Age> ages) … where x.age not in ?1
TRUE findByActiveTrue() … where x.active = true
FALSE findByActiveFalse() … where x.active = false
IgnoreCase findByFirstnameIgnoreCase … where UPPER(x.firstame) = UPPER(?1)

JPA示例

表数据

id name age available(是否禁用) createTime
1 张三 28 true 2018-01-01
2 李四 22 false 2018-05-03
3 丽丽 18 true 2018-12-30

查询方法

By

根据name查询

//select * from user where name=?1
User findByName(String name);//等同findOneByName
List<User> findByName(String name);//等同findAllByName
userRepository.findByName("张三");
1 张三 28 true 2018-01-01

And

根据name和age查询

//select * from user where name=?1 and age=?2
User findByNameAndAge(String name, int age);
userRepository.findByNameAndAge("张三", 28);
1 张三 28 true 2018-01-01

Or

//select * from user where name=?1 or age=?2
User findByNameOrAge(String name, int age);

In

//select * from user where name in(?1)
List<User> findByNameIn(List<String> nameList);

GreaterThan

如查询年龄大于20的

//select * from user where age>?2
List<User> findByAgeGreaterThan(int age);
userRepository.findByAgeGreaterThan(20);
id name age available createTime
1 张三 28 true 2018-01-01
2 李四 22 false 2018-05-03

Boolean查询

如查询禁用的用户

//select * from user where available = 0
List<User> findByAvailableFalse();
userRepository.findByAvailableFalse();
2 李四 22 false 2018-05-03

Between

如按时间段查询

//select * from user where createtime between ?1 and ?2
List<User> findByCreateTimeBetween(Date start, Date end);
userRepository.findByCreateTimeBetween(new Date("2018-05-01"), Date("2019-05-01"));
//这里new Date("2018-05-01")是举例,实际中自己格式化为java.util.Date类型即可
id name age available createTime
2 李四 22 false 2018-05-03
3 丽丽 18 true 2018-12-30

Top

查询前top页的数据

//select * from user limit 10
List<User> findTop10();
//select * from user where available = 1 limit 10
List<User> findTop10ByAvailableIsTrue();

count 统计

//select count(1) where age=?1
long countByAge(int age);

原生SQL查询 @Query

JPA也支持原生sql查询,使用@Query注解使用,如:

UserRepository:

//原生sql查询
@Query(value = "select * from user where name=?1 and age > ?2", nativeQuery = true)
List<User> queryBySQL(String name, int age);

接口:

@GetMapping("/sql")
    public List<User> sql(String name, int age){
        return userRepository.queryBySQL(name, age);
    }

测试:

GET http://localhost:8080/user/sql?name=张三&age=10

源码地址

https://gitee.com/yimingkeji/springboot/tree/master/jpa

© 著作权归作者所有

yimingkeji
粉丝 14
博文 47
码字总数 30840
作品 0
杭州
私信 提问
springboot从入门到精通教程分享, 深度掌握Springboot实践技术教程

深度掌握Springboot实践技术教程,共22个课时,需要的可回复邮箱。 课程简介 day1 01springboot简介-曾经开发中的问题 02springboot解决的问题-优势以及弊端 03springboot环境准备 04spring...

小小倾听
2018/12/06
733
19
springboot 是如何帮我们省去web.xml配置的

概述 最开始使用原生的springmvc时,总是免不了有如下xml配置 但是,切换到springboot之后,web.xml之类的繁琐的配置基本上都不见了。出于好奇研究了下springboot究竟帮我们做了什么,我们可...

端吉
2018/06/23
0
0
springboot学习(二)——springmvc配置使用

以下内容,如有问题,烦请指出,谢谢 上一篇讲解了springboot的helloworld部分,这一篇开始讲解如何使用springboot进行实际的应用开发,基本上寻着spring应用的路子来讲,从springmvc以及web...

嘻哈开发者
2018/04/26
142
0
Spring Boot入门资料整理

Spring Boot 初识 SpringBoot前世今生 本文主要讲述spring boot的由来,即其它诞生的背景,初衷,现状,及对未来的展望。 Spring Boot参考指南中文版--Chapter1.Spring Boot中文文档 本节提供...

小致dad
2017/11/07
537
0
带你搭一个SpringBoot+SpringData JPA的环境

只有光头才能变强。 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 不知道大家对SpringBoot和Spring Data JPA了解多少,如果你已经学过Spring和Hibernate的话...

Java3y
03/23
31
5

没有更多内容

加载失败,请刷新页面

加载更多

75、GridFS

GridFS是MongoDB提供的用于持久化存储文件的模块,CMS使用Mongo DB存储数据,使用FGridFS可以快速集成开发。 工作原理: 在GridFS存储文件是将文件分块存储,文件会按照256KB的大小分割成多个...

lianbang_W
今天
4
0
js bind 绑定this指向

本文转载于:专业的前端网站➱js bind 绑定this指向 1、示例代码 <!DOCTYPE html><html lang="zh"> <head> <meta charset="UTF-8" /> <title>bind函数绑定this指向......

前端老手
今天
4
0
CentOS Linux 7上将ISO映像文件写成可启动U盘

如今,电脑基本上都支持U盘启动,所以,可以将ISO文件写到U盘上,用来启动并安装操作系统。 我想将一个CentOS Linux 7的ISO映像文件写到U盘上,在CentOS Linux 7操作系统上,执行如下命令: ...

大别阿郎
今天
4
0
深入vue-公司分享ppt

组件注册 全局注册 注册组件,传入一个扩展过的构造器 Vue.component('my-component', Vue.extend({/*...*/})) 注册组件,传入一个选项对象(自动调用Vue.extend) Vue.component('my-comp...

莫西摩西
今天
4
0
gitlab重置管理员密码

登录gitlab服务器 [root@localhost bin]# sudo gitlab-rails console productionLoading production environment (Rails 5.2.3)irb(main):001:0> u = User.where(email: 'admin@example.co......

King华仔o0
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部