本文将介绍怎样在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. hdu 1848 sg——dfs&&打表双实现

    Fibonacci again and again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Jav ...

  2. Codeforces Round #402 (Div. 2) A+B+C+D

    Codeforces Round #402 (Div. 2) A. Pupils Redistribution 模拟大法好.两个数列分别含有n个数x(1<=x<=5) .现在要求交换一些数 ...

  3. Python unittest 学习

    import unittest class UTest(unittest.TestCase): def test_upper(self): self.assertEqual('foo'.upper() ...

  4. Explosion at Cafebazaar

    Explosion at Cafebazaar 时间限制: 1 Sec  内存限制: 128 MB 题目描述 You are an engineer at Cafebazaar and your sp ...

  5. Vxlan简介

    1.为什么需要Vxlan 1.什么是VXLAN VXLAN(Virtual eXtensible LAN可扩展虚拟局域网),是一种mac in UDP技术.传统的二层帧被封装到了UDP的报文中,通过U ...

  6. 简单说明PHP的垃圾收集机制是怎样的?

    腾讯 对变量有个引用计数,计数到0时变量被销毁. ———————————————————————— 每一种语言都有自己的自动垃圾回收机制,让程序员不必过分关心程序内存分配,但是在OOP中,有些对象需要 ...

  7. 第一行代码 Android 思维导图

    第一行代码 Android  思维导图

  8. openSUSE Leap 15.0 初始配置

    添加源: # 禁用原有软件源 sudo zypper mr -da # 添加阿里镜像源 sudo zypper ar -fc https://mirrors.aliyun.com/opensuse/d ...

  9. Unity 3D 之通过序列化来存档游戏数据

    我们在使用u3d开发一些单机游戏的过程中,都会涉及到游戏数据的存单和加载.一般情况下,如果存储的数据不复杂,我们就可以用PlayerPrefs,但有时涉及到的数据更加复杂,使用PlayerPrefs难 ...

  10. codevs——1842 递归第一次

    1842 递归第一次  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 白银 Silver 题解       题目描述 Description 同学们在做题时常遇到这种函数 f( ...