SpringBoot+SpringData 整合入门
SpringData概述
SpringData :Spring的一个子项目。用于简化数据库访问,支持NoSQL和关系数据存储。其主要目标是使用数据库的访问变得方便快捷。
SpringData 项目所支持NoSQL存储:
- MongoDB(文档数据库)
- Neo4j(图形数据库)
- Redis(键/值存储)
- Hbase(列族数据库)
SpringData 项目所支持的关系数据存储技术:
- JDBC
- JPA
Spring Data : 致力于减少数据访问层 (DAO) 的开发量. 开发者唯一要做的,就只是声明持久层的接口,其他都交给 Spring Data JPA 来帮你完成!
框架怎么可能代替开发者实现业务逻辑呢?比如:当有一个 UserDao.findUserById()
这样一个方法声明,大致应该能判断出这是根据给定条件的 ID 查询出满足条件的 User 对象。Spring Data JPA 做的便是规范方法的名字,根据符合规范的名字来确定方法需要实现什么样的逻辑。
SpringBoot+SpringData 整合入门
第一步 添加依赖
springBoot相关
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
mysql驱动
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
springDataJPA相关
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
第二步 配置文件 (src/main/resources/application.yml)
spring:
datasource:
url: jdbc:mysql://localhost:3306/springboot-springdata
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
jpa:
#指定数据库
database: mysql
#打印sql
show-sql: true
hibernate:
#开启数据库更新表
ddl-auto: update
#指定命名策略
naming:
strategy: org.hibernate.cfg.ImprovedNamingStrategy
properties:
hibernate:
#Hibernate方言
dialect: org.hibernate.dialect.MySQL5Dialect
第三步 创建Repository接口、Entity
Repository接口
public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {}
Entity(启动项目会自动创建表)
@DynamicInsert(true)
@DynamicUpdate(true)
@Table(name = "sys_user")
public class User implements Serializable{
private static final long serialVersionUID = 6425411731900579688L;
@Id
@GeneratedValue
@Column(columnDefinition = "bigint(20) comment '主键'", nullable = false)
private long id;
@Column(columnDefinition = "varchar(255) comment '用户姓名'",nullable = false, unique = true)
private String username;
@Column(columnDefinition = "varchar(255) comment '密码'", nullable = false)
private String password;
@Column(columnDefinition = "int(10) comment '年龄'", nullable = false)
private int age;
}
这样就整合完成,可以创建接口进行单元测试了
Repository接口概述
Repository 接口是 Spring Data 的一个核心接口,它不提供任何方法,开发者需要在自己定义的接口中声明需要的方法
public interface Repository<T, ID extends Serializable> { }
Spring Data可以让我们只定义接口,只要遵循 Spring Data的规范,就无需写实现类。
与继承 Repository 等价的一种方式,就是在持久层接口上使用 @RepositoryDefinition
注解,并为其指定 domainClass
和idClass
属性。如下两种方式是完全等价的
/**
* 主键方式定义接口
*/
@RepositoryDefinition(domainClass=Person.class,idClass=Integer.class)
public interface PersonRepsotory{}
/**
* 继承方式定义接口
* 常用
*/
public interface PersonRepsotory extends JpaRepository<Person, Integer>{}
Repository的子接口
如图,基础的 Repository 提供了最基本的数据访问功能,其几个子接口则扩展了一些功能。它们的继承关系如下:
Repository
: 仅仅是一个标识,表明任何继承它的均为仓库接口类
CrudRepository
: 继承 Repository,实现了一组 CRUD 相关的方法
PagingAndSortingRepository
: 继承 CrudRepository,实现了一组分页排序相关的方法
JpaRepository
: 继承 PagingAndSortingRepository,实现一组 JPA 规范相关的方法
自定义的 XxxxRepository
: 需要继承 JpaRepository,这样的 XxxxRepository接口就具备了通用的数据访问控制层的能力。
JpaSpecificationExecutor
: 不属于Repository体系,实现一组 JPA Criteria 查询相关的方法
SpringData 查询方法命名规范
简单条件查询: 查询某一个实体类或者集合
按照 Spring Data 的规范,查询方法以 find | read | get
开头, 涉及条件查询时,条件的属性用条件关键字连接,要注意的是:条件属性以首字母大写。
例如:定义一个 Entity 实体类
public class User{
private String lastName;
private String firstName;
}
使用And条件连接时,应这样写: findByLastNameAndFirstName(String lastName,String firstName);
条件的属性名称与个数要与参数的位置与个数一一对应
支持的关键字
springData 查询方法解析原理
假如创建如下的查询:findByUserDeptUuid()
,框架在解析该方法时,首先剔除 findBy
,然后对剩下的属性进行解析,假设查询实体为UserInfo。
第一步:先判断 userDeptUuid (根据 POJO 规范,首字母变为小写)是否为查询实体的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,继续第二步;
第二步:从右往左截取第一个大写字母开头的字符串(此处为Uuid),然后检查剩下的字符串是否为查询实体的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,则重复第二步,继续从右往左截取;最后假设 user 为查询实体的一个属性;
第三步:接着处理剩下部分(DepUuid),先判断 user 所对应的类型是否有deptUuid属性,如果有,则表示该方法最终是根据 “ UserInfo.user.deptUuid” 的取值进行查询;否则继续按照步骤 二的规则从右往左截取,最终表示根据 “UserInfo.user.dept.uuid” 的值进行查询。可能会存在一种特殊情况,比如 UserInfo包含一个 user 的属性,也有一个 userDep 属性,此时会存在混淆。可以明确在属性之间加上 "_" 以显式表达意图,比如 "findByUser_DepUuid()" 或者 "findByUserDept_Uuid()"
springData 实战
命名方法查询
public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {
/**
* 根据username来获取对应的user
*/
User getByUsername(String username);
/**
* WHERE username LIKE %?
*/
List<User> findByUsernameStartingWith(String username);
/**
* WHERE username LIKE ?%
*/
List<User> findByUsernameEndingWith(String username);
/**
* WHERE username id < ?
*/
List<User> findByIdLessThan(Long id);
}
注解查询
public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {
/**
* 查询id 值最大的那个User 使用@Query 主键可以自定义JPQL语句以实现更灵活的查询
*/
@Query("SELECT u FROM User u WHERE u.id = (SELECT MAX(p.id) FROM User p)")
User getMaxIdUser();
/**
* @Query 注解传递参数的方式一:占位符方式
*/
@Query("SELECT u FROM User u WHERE u.username = ?1 AND u.age = ?2")
List<User> testQueryAnnotationUser1(String username , Integer age);
/**
* @Query 注解传递参数的方式二:命名参数方式
*/
@Query("SELECT u FROM User u WHERE u.username = :username AND u.age = :age")
List<User> testQueryAnnotationUser2(@Param("username") String username , @Param("age")Integer age);
}
可以通过自定义的 JPQL 完成 UPDATE 和 DELETE 操作,注意
: JPQL 不支持使用 INSERT。
在 @Query 注解中编JPQL 语句, 但必须使用 @Modifying 进行修饰
. 以通知 SpringData, 这是一个 UPDATE 或 DELETE 操作。
UPDATE 或 DELETE 操作需要使用事务, 可以使用注解@Transactional声明
,默认情况下, SpringData 的每个方法上有事务, 但都是一个只读事务. 他们不能完成修改操作!
public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {
/**
* @Query 注解update、delete操作,不支持insert
*/
@Modifying
@Query("UPDATE User u SET u.age = :age")
@Transactional
void updateUserAge(@Param("age") Integer age);
}
还可以使用原生Sql查询,只需配置nativeQuery = true
public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {
/**
* 设置 nativeQuery=true 即可以使用原生的 SQL 查询
*/
@Query(value = "SELECT COUNT(id) FROM sys_user" , nativeQuery = true)
long getTotalCount();
}
SpringBoot+SpringData 整合入门的更多相关文章
- SpringBoot+Mybatis整合入门(一)
SpringBoot+Mybatis 四步整合 第一步 添加依赖 springBoot+Mybatis相关依赖 <!--springBoot相关--> <parent> < ...
- springboot+layui 整合百度富文本编辑器ueditor入门使用教程(踩过的坑)
springboot+layui 整合百度富文本编辑器ueditor入门使用教程(踩过的坑) 写在前面: 富文本编辑器,Multi-function Text Editor, 简称 MTE, 是一 ...
- Spring全家桶相关文章汇总(Spring,SpringBoot,SpringData,SpringCloud)
因为Spring框架包含的组件比较多,写的博客内容也比较多,虽然有分专栏但是依然不方便查找,所以专门用一篇文章来记录相关文章,会不定期更新. 一.Spring 1.基础内容 Spring介绍 Sp ...
- 带你搭一个SpringBoot+SpringData JPA的环境
前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 不知道大家对SpringBoot和Spring Da ...
- SpringBoot Kafka 整合使用
前提 假设你了解过 SpringBoot 和 Kafka. 1.SpringBoot 如果对 SpringBoot 不了解的话,建议去看看 DD 大佬 和 纯洁的微笑 的系列博客. 2.Kafka K ...
- SpringBoot之简单入门
一,spring boot 是什么? spring boot的官网是这样说的: Spring Boot makes it easy to create stand-alone, production- ...
- SpringBoot开发快速入门
SpringBoot开发快速入门 目录 一.Spring Boot 入门 1.Spring Boot 简介 2.微服务 3.环境准备 1.maven设置: 2.IDEA设置 4.Spring Boot ...
- SpringBoot之基础入门-专题一
SpringBoot之基础入门-专题一 一.Spring介绍 1.1.SpringBoot简介 在初次学习Spring整合各个第三方框架构建项目的时候,往往会有一大堆的XML文件的配置,众多的dtd或 ...
- SpringBoot介绍,快速入门小例子,目录结构,不同的启动方式,SpringBoot常用注解
SpringBoot介绍 引言 为了使用ssm框架去开发,准备ssm框架的模板配置 为了Spring整合第三方框架,单独的去编写xml文件 导致ssm项目后期xml文件特别多,维护xml文件的成本也是 ...
随机推荐
- 【VB6】全局键盘钩子
基本也没啥好说的,不要用到木马及恶意程序中是以前从VB.NET程序改到VB6的,阉割了一些功能,只提供键盘Hook功能想要截获热键可以在处理函数中返回1,里面有示例 下载地址 http://pan.b ...
- asp.net mvc 配置ckeditor4.x
下载地址:https://ckeditor.com/ckeditor-4/download/ 一.使用方法: 1.在页面中引入ckeditor核心文件ckeditor.js 2.在使用编辑器的地方插入 ...
- window.open新打开窗口与新开标签页
最近在使用window.open时忽略了一个细节问题:window.open新打开一个窗口,但是有时却是新打开一个窗口有时打开一个新标签页.虽然对一般的需求来说,这个两种情况都无所谓,但是对于那种有强 ...
- 「PKUSC2018」真实排名(组合)
一道不错的组合数问题! 分两类讨论: 1.\(a_i\) 没有翻倍,那些 \(\geq a_i\) 和 \(a_j\times 2<a_i\) 的数就没有影响了.设 \(kth\) 为 \(a_ ...
- python音乐播放器第二版
此代码是上一期的改版 需要用到的Python库有 .pygame 2.time 3.xmusic(我自己写的用来做音乐索引) .colorama(美观) 推荐使用pip安装 方法: pip ins ...
- 在express3里用ejs模版引擎时,如何使其支持'.html'后缀
①express 默认jade模板,改为ejs模板,需执行以下命令: express -e --ejs ②在app.js中,将 app.set('view engine', 'jade'); 替换为 ...
- [Leetcode]315.计算右侧小于当前元素的个数 (6种方法)
链接 给定一个整数数组 nums,按要求返回一个新数组 counts.数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量. 示例: 输 ...
- POJ 2583
#include<iostream> #include<stdio.h> using namespace std; int main() { //freopen("a ...
- Centos6.7配置Nginx+Tomcat简单整合
系统环境:Centos 6.7 软件环境:JDK-1.8.0_65.Nginx-1.10.3.Tomcat-8.5.8 文档环境:/opt/app/ 存放软件目录,至于mkdir创建文件就不用再说了 ...
- 五、CLR加载程序集代码时,JIT编译器对性能的产生的影响
1.CLR首次加载代码造成的性能损失 四.CLR执行程序集中代码介绍了CLR在首次执行一个类的时,会初始化一个内部结构,然后当目标方法被首次调用时,JITComplier函数(JIT编译器)会验证IL ...