本文将介绍怎样在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. iOS学习笔记06-手势识别

    一.UIGestureRecognizer简单介绍 我们已经学习了触摸事件处理,但触摸事件处理起来很麻烦,每个触摸事件处理都需要实现3个touches方法,比较繁琐,实际上我们可以使用更加简单的触摸事 ...

  2. 【Luogu】P3402最长公共子序列(LCS->nlognLIS)

    题目链接 SovietPower 的题解讲的很清楚.Map或Hash映射后用nlogn求出LIS.这里只给出代码. #include<cstdio> #include<cctype& ...

  3. toolbarlite随笔之插件的闭包写法

    toolbarlite这个东西至今没搞懂是什么玩意.因为除了源代码我实在是找不到除了toolbar之外的任何关于toolbarlite的东西了.不知道toolbarlite是不是toolbar的子集, ...

  4. msp430项目编程34

    msp430中项目---flash编程34 1.电路工作原理 2.代码(显示部分) 3.代码(功能实现) 4.项目总结

  5. MySQL 游戏排行榜

    今天在坛子上看到了,顺便写下来. 有两种方法: 1.效率不高,因为有子查询.但是简洁.而且我对SOCRES表做了INDEX.所以性能上也差不了多少. mysql> show create tab ...

  6. Fragment的广播消息接收

    这种方式不用在配置文件加东西 广播注册,可以写在Activity(onCreate),也可以写在Fragment(onActivityCreated)里. LocalBroadcastManager ...

  7. Flink学习(一)

    Apache Flink是一个面向分布式数据流处理和批量数据处理的开源计算平台,它能够基于同一个Flink运行时,提供支持流处理和批处理两种类型应用的功能. 现有的开源计算方案,会把流处理和批处理作为 ...

  8. ByteArrayInputStream的作用,和BufferedOutputStream 的区别

    个人好奇ByteArrayInputStream,到底是有什么用于是百度了一些资料 整合了下,********这两个类对于要创建临时性文件的程序以及网络数据的传输.数据压缩后的传输等可以提高运行的的效 ...

  9. idea tomcat 配置

    昨天我们讲了如何新建多模块项目:idea创建maven多模块项目 本节课,我们讲如何配置tomcat,使昨天配置的web项目,JRapid.Admin可以运行起来.具体步骤如下 第一步 第二步 第三步 ...

  10. transition、animation在macbook air上图片动画边缘抖动2

    示例: BUG描述: 最近同事一项目中,产品提出在macbook air上,列表图片放大效果边缘出现抖动现象.在retina屏上没有此问题. 调试过程: 1.单独把结构分离.确定是否由其他元素引起. ...