SpringBoot2.0之三 优雅整合Spring Data JPA
在我们的实际开发的过程中,无论多复杂的业务逻辑到达持久层都回归到了“增删改查”的基本操作,可能会存在关联多张表的复杂sql,但是对于单表的“增删改查”也是不可避免的,大多数开发人员对于这个简单而繁琐的操作都比较烦恼。
为了解决这种大量枯燥的简单数据库操作,大致的解决该问题的有三种方式
1、使用类似Hibernate的ORM框架,通过Hibernate完成java实体类和数据库之间的映射,完成简单的单表的“增删改查”
2、使用代码生成工具生成单表的“增删改查”代码,省去我们手动编写的过程(我将在后面的文章中给出可定制化生成代码方法,敬请关注!)
3、使用Spring-data-jpa这样的技术,它实现了模板Dao层,只需要在Dao,通过继承一个接口,就可轻松完成“增删改查”,具体使用方法如下:
一、在pom.xml文件中添加如下依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
二、在application.yml文件中配置数据库信息和jpa信息(注意:不同的SpringBoot版本jpa配置的方法可能会有不同)
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8
username: root
password: 123456
jpa:
hibernate:
ddl-auto: update
个人推荐使用yml格式的配置文件,看起来更加清晰简单(注意:每个配置属性的缩进是两个空格,这点一定要注意,不然会出现配置错误的情况,也可以在开发工具中安装相关的yml的插件方便查看)。
jpa的配置后 jpa.hibernate.ddl-auto= update,在其他低版本的SpringBoot中也有使用spring.jpa.properties.hibernate.hbm2ddl.auto=create-drop 这种配置的,具体根据版本而定。该配置的主要作用是:自动创建、更新、验证数据库结构
1、create:每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因(一般只会在第一次创建时使用)
2、create-drop:每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除
3、update:最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等应用第一次运行起来后才会
4、validate:每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值
三、创建实体
创建一个User类,配置好上面的信息后,启动项目,对应的数据库就会自动生成对应的表结构。@Table、@Entity、@Id等注解是jpa的相关知识,后面的文章将详细讲述。
@Table(name = "t_user")
@Entity
public class User {
@Id
@GeneratedValue
private Long id;
@Column
private String name;//姓名
@Column
private Integer age;//年龄
// .....
}
四、创建数据库访问Dao层
@Repository
public interface UserRepository extends JpaRepository<User,Long>{
/**
* 根据年纪查询用户
* @param age
* @return
*/
User findByAge(Integer age);
/**
* 根据年纪和姓名查询
* @param name
* @param age
* @return
*/
User findByNameAndAge(String name, Integer age);
/**
* 对于复杂查询可以使用@Query 编写sql
* @param name
* @return
*/
@Query("from User u where u.name=:name")
User findUser(@Param("name") String name);
}
该Dao成继承了JpaRepository接口,指定了需要操作的实体对象和实体对象的主键类型,通过查看JpaRepository接口源码可以看到,里面已经封装了创建(save)、更新(save)、删除(delete)、查询(findAll、findOne)等基本操作的函数,使用起来非常方便了,但是还是会存在一些复杂的sql,spring-data-jpa还提供了一个非常方便的方式,通过实体属性来命名方法,它会根据命名来创建sql查询相关数据,对应更加复杂的语句,还可以用直接写sql来完成,具体例子如上所示。
五、单元测试
使用junit进行单元测试,代码如下
/**
*
* @author 明天的地平线
*
* SpringBoot 之前的版本配置单元测试类时使用 @SpringApplicationConfiguration(Application.class)
* SpringBoot 1.5.9 改用@SpringBootTest(classes = Application.class)
*
*/
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = Application.class)
public class JpaTest {
@Autowired
private UserRepository userRepository;
/**
* 新增用户
* @throws Exception
*/
@Test
public void testAddUser() throws Exception {
User user = new User();
user.setName("zhangsan");
user.setAge(12);
userRepository.save(user);
User user2 = new User();
user2.setName("lishi");
user2.setAge(22);
userRepository.save(user2);
}
/**
* 删除用户(根据对象删除时,必须要有ID属性)
* @throws Exception
*/
@Test
public void testDelUser() throws Exception {
User user = new User();
user.setId(1L);
user.setName("zhangsan");
user.setAge(12);
userRepository.delete(user);
}
/**
* 修改用户信息
* @throws Exception
*/
@Test
public void testUpdUser() throws Exception {
User user = new User();
user.setId(2L);
user.setName("zhangsan11");
user.setAge(122);
userRepository.save(user);
}
/**
* 查询用户
* @throws Exception
*/
@Test
public void testQueryUser() throws Exception {
User user = userRepository.findByAge(22);
System.out.println(user.getName());
User user2 = userRepository.findByNameAndAge("lishi", 22);
System.out.println(user2.getName());
User user3 = userRepository.findUser("zhangsan11");
System.out.println(user3.getName());
}
/**
* 查询所有用户
* @throws Exception
*/
@Test
public void testQueryUserList() throws Exception {
List<User> list = userRepository.findAll();
for (User user : list) {
System.out.println(user.getName());
}
}
}
数据库数据如下:
本文主要以SpringBoot整合jpa为主,Spring-data-jpa的内容远比以上内容丰富和强大,例如分页排序、对原生sql的支持等,后续将对此内容进行专门讲解,感兴趣的小伙伴可以关注我的博客和微信公众号。
Git代码地址:https://gitee.com/Somta/SpringBoot/tree/master/SpringBoot-jpa
原文地址:http://somta.com.cn/#/blog/view/7909f62e5af6426c802c8748366592e8
SpringBoot2.0之三 优雅整合Spring Data JPA的更多相关文章
- springboot整合spring Data JPA
今天敲代码,一连串的错误,我也是服气~果然,我们不是在出bug,就是在找bug的路上…… 今天完成的是springboot整合spring data JPA ,出了一连串的错,真是头大 java.sq ...
- Spring Boot从入门到精通(九)整合Spring Data JPA应用框架
JPA是什么? JPA全称Java Persistence API,是Sun官方提出的Java持久化规范.是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中. ...
- Spring Boot 整合Spring Data JPA
Spring Boot整合Spring Data JPA 1)加入依赖 <dependency> <groupId>org.springframework.boot</g ...
- Spring Boot 应用系列 1 -- Spring Boot 2 整合Spring Data JPA和Druid,双数据源
最近Team开始尝试使用Spring Boot + Spring Data JPA作为数据层的解决方案,在网上逛了几圈之后发现大家并不待见JPA,理由是(1)MyBatis简单直观够用,(2)以Hib ...
- springboot整合spring data jpa 动态查询
Spring Data JPA虽然大大的简化了持久层的开发,但是在实际开发中,很多地方都需要高级动态查询,在实现动态查询时我们需要用到Criteria API,主要是以下三个: 1.Criteria ...
- SpringBoot第九篇:整合Spring Data JPA
作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/10910059.html 版权声明:本文为博主原创文章,转载请附上博文链接! 前言 前面几章, ...
- Spring Boot:整合Spring Data JPA
综合概述 JPA是Java Persistence API的简称,是一套Sun官方提出的Java持久化规范.其设计目标主要是为了简化现有的持久化开发工作和整合ORM技术,它为Java开发人员提供了一种 ...
- spring boot整合spring Data JPA和freemarker
1.spring Data JPA简介 是一个替代hibernate的一个作用于数据库的框架. 2.整合 1.导入依赖 <dependency> <groupId>org.sp ...
- Spring Boot整合Spring Data JPA
1.JPA 2.Spring Data JPA 3.导入依赖 4.连接数据库 5.实体类 6.Repository 7.测试 1.JPA JPA是Java Persistence API的简称,中文名 ...
随机推荐
- python 爬虫 之BeautifulSoup
BeautifulSoup是一个模块,该模块用于接收一个HTML或XML字符串,然后将其进行格式化,之后便可以使用他提供的方法进行快速查找指定元素,从而使得在HTML或XML中查找指定元素变得简单. ...
- linux日常管理-防火墙netfilter工具-iptables-2
分别是包的数量:26 包的字节:1320 处理方式 tcp协议 opt in out 源ip 目标ip 到80端口的行为. 处理行为处理有REJECT外 还有DROP ACCEPT.分别是看一 ...
- 【总结整理】http-https
上面这种加密消息的方式就是对称加密,你知道如何加密,也知道如何解码.然后李雷跟韩梅梅用的字母表偏移的加密方法叫 Caesar cipher, 凯撒加密.现实世界中用的加密算法会更复杂,但是基本原理相同 ...
- 树莓派 Learning 002 装机后必要的操作 --- 08 实现PC端 远程登入 树莓派 --- 法2 远程登录树莓派的图形桌面
树莓派 装机后必要的操作 - 实现PC端 远程登入 树莓派 我的树莓派型号:Raspberry Pi 2 Model B V1.1 装机系统:NOOBS v1.9.2 PC端系统:win10 x64 ...
- Java核心技术 卷1 基础知识-第一天
基本数据类型 java是一种强数据类的的语言 共有8种基本数据类型 其中: 整型4种 int(4字节) short(2字节) long(8字节) byte(1字节) java中整型的范围与机器无关 长 ...
- 17、SAM文件格式说明(转载迷宫中的将军)
1. SAM格式说明 SAM代表Sequence Alignment/Map格式,是一种制表符分隔的文本格式,包含一个可选的头部分(header section,有人称之为“注释部分”),和一个比对部 ...
- [转]hadoop运行mapreduce作业无法连接0.0.0.0/0.0.0.0:10020
14/04/04 17:15:12 INFO mapreduce.Job: map 0% reduce 0% 14/04/04 17:19:42 INFO mapreduce.Job: map 4 ...
- 12、scala隐式转换与隐式参数
一.隐式转换 1.介绍 Scala提供的隐式转换和隐式参数功能,是非常有特色的功能.是Java等编程语言所没有的功能.它可以允许你手动指定,将某种类型的对象转换成其他类型的对象. 通过这些功能,可以实 ...
- HTML5与CSS3实例教程(第2版) 附源码 中文pdf扫描版
HTML5和CSS3技术是目前整个网页的基础.<HTML5与CSS3实例教程(第2版)>共分3部分,集中讨论了HTML5和CSS3规范及其技术的使用方法.这一版全面讲解了最新的HTML5和 ...
- C#进行Post请求(解决url过长的问题)
//实例代码: 1.post请求 private string GetImageXY(string imgbyte) { string result3 = string.Empty; try { st ...