本文将介绍怎样在Spring Boot project中加入JPA作为持久化方式。

改动 pom.xml 依赖

与上一篇介绍的 jdbc 不同的是 spring-boot-starter-jdbc 改动为 spring-boot-starter-data-jpa 就可以。当然数据库驱动包也是不可少的。例如以下:

 <!-- MYSQL -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- Spring Boot JPA -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

注意:假设你想JDBC和JPA能够一起使用,Spring Boot 是支持的,你仅仅须要把JDBC和JPA的依赖都加入在pom.xml 中就可以。无需其它特殊处理,有关JDBC的使用介绍请看上一篇 “Spring-Boot JDBC 连接数据库”。

改动属性配置文件

在属性配置文件里加入 JPA 相关属性,注意这些并不是必须。我们假设仅仅加入dataSource 的 url\username\password\driver-class-name 也能够正常使用,有关JPA的其它配置都是可选的。

spring.jpa.database=
spring.jpa.show-sql=
spring.jpa.properties=
spring.jpa.generate-ddl=
spring.jpa.open-in-view=
spring.jpa.database-platform=
spring.jpa.hibernate.ddl-auto=
spring.data.jpa.repositories.enabled=
spring.jpa.hibernate.naming-strategy=

熟悉JPA的依据名字应基本知道这些分别的作用了。

传统上。JPA实体类在persistence.xml文件里指定的。使用Spring Boot。这个文件是没有必要的。由于它使用“实体扫描”。默认情况下主配置 @EnableAutoConfiguration 或 @SpringBootApplication 以下的全部包都将会被扫描。不论什么使用注解 @Entity, @Embeddable 或 @MappedSuperclass 的类都将被管理。

Java代码实例

  • 一个接口
  • 一个Controller

我们创建一个接口 IScoreDao.java ,然后我们继承框架为我们提供好的接口 Repository 或 CrudRepository (CrudRepository 继承自 Repository),当中为我们提供了对数据库的基本操作方法。

package org.springboot.sample.dao;

import java.util.List;

import javax.transaction.Transactional;

import org.springboot.sample.entity.Score;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param; public interface IScoreDao extends CrudRepository<Score, Integer> { @Transactional
@Modifying
@Query("update Score t set t.score = :score where t.id = :id")
int updateScoreById(@Param("score") float score, @Param("id") int id); @Query("select t from Score t ")
List<Score> getList(); }

注意,假设你当中使用了改动、新增、删除操作,则必须要在接口上面或者相应的方法上面加入 @Transactional 注解,否则会抛出异常。

实体类 Score.java

package org.springboot.sample.entity;

import java.io.Serializable;
import java.util.Date; import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table; /**
* 成绩
*
* @author 单红宇(365384722)
* @myblog http://blog.csdn.net/catoop/
* @create 2016年1月12日
*/
@Entity
@Table(name = "score")
public class Score implements Serializable { private static final long serialVersionUID = 8127035730921338189L; @Id
@GeneratedValue
private int id; @Column(nullable = false, name="STUDENTID") // 这里说一下,我使用指定数据库列的时候。使用小写会不起作用,改动为大写便正常了。 不知道为何。假设遇到一样问题的能够尝试下。
private int stuId; @Column(nullable = false, name="SUBJECTNAME")
private String subjectName; @Column(nullable = false)
private float score; @Column(nullable = false, name="EXAMTIME")
private Date examTime; // 省去get、set 方法(占用文章空间) }

ScoreController.java

package org.springboot.sample.controller;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springboot.sample.dao.IScoreDao;
import org.springboot.sample.entity.Score;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
@RequestMapping("/score")
public class ScoreController { private static final Logger logger = LoggerFactory.getLogger(ScoreController.class); @Autowired
private IScoreDao scoreService; @RequestMapping("/scoreList")
public List<Score> getScoreList(){
logger.info("从数据库读取Score集合");
// 測试更新数据库
logger.info("更新的行数:" + scoreService.updateScoreById(88.8f, 2));
scoreService.delete(23); return scoreService.getList();
}
}

然后在浏览器訪问地址:http://localhost:8080/myspringboot/score/scoreList 測试。


最后要说明的是,Spring 会自己主动为我们继承CrudRepository接口的接口创建实现类。我们仅仅须要在使用的时候直接使用注解 @Autowired 注入就可以(IScoreDao 接口上也没有必要添加 @Component 、 @Repository 等注解)。

还有,我这里为了简单起见。直接将操作数据库的在Controller中使用,实际项目中,是不建议这样做的。IScoreDao 的所属角色是数据库持久,我们还应当有 Service(如ScoreService) 来调用 IScoreDao 的方法。然后在Controller 中调用 Service 中的方法。

原因是由于。我们数据库訪问层。都是接口定义方法,上面注解注入SQL和參数,没有具体的代码逻辑处理。假设我们想在运行SQL之前或之后运行逻辑处理,仅仅能在 Service 中或者Controller(不建议)中。

我们严格依照这样的方式去做(持久层仅仅与SQL有关,通过接口定义无逻辑处理),这样才是彻彻底底的持久层。越严格的规范制度。在某种程度上来说事实上越有利于代码的管理和项目代码的迭代发展。

当然,假设你实在想要实现自己的 class 实现类。以下会附上一个实例代码,在此之前。我们先看一个图片:

这个图是Spring 使用动态代理创建的接口实例。能够看出,其使用的是 SimpleJpaRepository 类,所以假设我们实现自己的 Repository 。能够扩展 SimpleJpaRepository 并 实现自己的 factory-class 入手。这里不做具体解释。注意凡事实现 Repository 接口的实现类都不须要加入 @Repository 注解,否则你会遇到问题。

本文介绍JPA 相比上一篇关于JDBC 的介绍添加的文件project截图为:

熟悉当中一种持久数据的方法后,其它相似的都大同小异。

Spring Boot JPA 连接数据库的更多相关文章

  1. 11. Spring Boot JPA 连接数据库

    转自:https://blog.csdn.net/catoop/article/details/50508397

  2. spring boot jpa 使用update 报错解决办法

    在spring boot jpa 中自定义sql,执行update操作报错解决办法: 在@Query(...)上添加 @Modifying@Transactional注解

  3. Spring Boot(五):Spring Boot Jpa 的使用

    在上篇文章Spring Boot(二):Web 综合开发中简单介绍了一下 Spring Boot Jpa 的基础性使用,这篇文章将更加全面的介绍 Spring Boot Jpa 常见用法以及注意事项. ...

  4. Spring Boot + JPA(hibernate 5) 开发时,数据库表名大小写问题

      (转载)Spring Boot + JPA(hibernate 5) 开发时,数据库表名大小写问题   这几天在用spring boot开发项目, 在开发的过程中遇到一个问题hibernate在执 ...

  5. Spring Boot Jpa 的使用

    Spring Boot Jpa 介绍 首先了解 Jpa 是什么? Jpa (Java Persistence API) 是 Sun 官方提出的 Java 持久化规范.它为 Java 开发人员提供了一种 ...

  6. (转)Spring Boot(五):Spring Boot Jpa 的使用

    http://www.ityouknow.com/springboot/2016/08/20/spring-boot-jpa.html 在上篇文章Spring Boot(二):Web 综合开发中简单介 ...

  7. Spring boot JPA 用自定义主键策略 生成自定义主键ID

    最近学习Spring boot JPA 学习过程解决的一些问题写成随笔,大家一起成长.这次遇到自定义主键的问题 package javax.persistence; public enum Gener ...

  8. Spring Boot(十五):spring boot+jpa+thymeleaf增删改查示例

    Spring Boot(十五):spring boot+jpa+thymeleaf增删改查示例 一.快速上手 1,配置文件 (1)pom包配置 pom包里面添加jpa和thymeleaf的相关包引用 ...

  9. spring boot JPA中实体类常用注解

    spring boot jpa中的注解很多,参数也比较多.没必要全部记住,但是经常查看官方文档也比较麻烦,记录一下一些常用的注解.通过一些具体的例子来帮助记忆. @Entity @Table(name ...

随机推荐

  1. Windows同步阿里云时间

    Ctrl+R打开cmd命令框 输入:gpedit.msc 计算机配置”—“管理模版”—“系统”—“Windows 时间服务”—“时间提供程序”—“配置 Windows NTP 客户端 双击打开配置 W ...

  2. 【Luogu】P2680运输计划(树上差分+二分)

    题目链接 总体思路……怎么说呢……是个暴力吧…… 首先用倍增预处理出每条路径的长度. 然后按长度把路径排序. 然后二分答案.对于当前答案mid检验,怎么检验呢? 首先差分把所有长度比mid大的链上除了 ...

  3. HackerRank# Candies

    原题地址 LeetCode上也有这道题,直接扫一遍就行了,连数组都不用开,感觉像是蕴含了某种动归的思想在里面,要不怎么是个动归题呢 代码: #include <cmath> #includ ...

  4. Kubernetes对象

    Kubernetes对象 在之前的文章已经讲到了很多Kubernets对象,包括pod,service,deployment等等.Kubernets对象是一种持久化,表示集群状态的实体.它是一种声明式 ...

  5. 2013   Dhaka 区域赛

    A.uva 12709 Falling ANTS 首先按照H排序,然后按照L*H*W排序 #include<iostream> #include<cstdio> #includ ...

  6. Java:Session详解

    以下情况,Session结束生命周期,Servlet容器将Session所占资源释放:1.客户端关闭浏览器2.Session过期3.服务器端调用了HttpSession的invalidate()方法. ...

  7. Vmware虚拟机三种网卡模式详解

    由于Linux目前很热门,越来越多的人在学习linux,但是买一台服务放家里来学习,实在是很浪费.那么如何解决这个问题?虚拟机软件是很好的选择,常用的虚拟机软件有vmware workstations ...

  8. Day 1 计算机基础

    计算机基础 一.为什么学习计算机基础? 编程语言的作用:人类使机器明白并动作的指令.类似:人文社会的英语.   关系:计算机硬件 —— 操作系统(OS) —— 软件(编程语言成品,学习成果). 自语: ...

  9. hdu3315 /最大权最佳匹配(最大权下尽量不改变次序)(有权田忌赛马类问题)/费用流

    题意:2个人比赛,每场比赛有得分,每场每人派一支圣兽( brute ,字典翻译为畜生,感觉这里不太符╮(╯▽╰)╭),有攻击力和血条...一堆规则... 合理安排,让1号人获得最大分数,并尽量不要改变 ...

  10. HDU 5676 ztr loves lucky numbers【DFS】

    题目链接; http://acm.hdu.edu.cn/showproblem.php?pid=5676 题意: 由4和7组成的且4和7出现次数相同的数称为幸运数字,给定n,求不大于n的最大幸运数字. ...