Spring Boot JPA 连接数据库
本文将介绍怎样在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 连接数据库的更多相关文章
- 11. Spring Boot JPA 连接数据库
转自:https://blog.csdn.net/catoop/article/details/50508397
- spring boot jpa 使用update 报错解决办法
在spring boot jpa 中自定义sql,执行update操作报错解决办法: 在@Query(...)上添加 @Modifying@Transactional注解
- Spring Boot(五):Spring Boot Jpa 的使用
在上篇文章Spring Boot(二):Web 综合开发中简单介绍了一下 Spring Boot Jpa 的基础性使用,这篇文章将更加全面的介绍 Spring Boot Jpa 常见用法以及注意事项. ...
- Spring Boot + JPA(hibernate 5) 开发时,数据库表名大小写问题
(转载)Spring Boot + JPA(hibernate 5) 开发时,数据库表名大小写问题 这几天在用spring boot开发项目, 在开发的过程中遇到一个问题hibernate在执 ...
- Spring Boot Jpa 的使用
Spring Boot Jpa 介绍 首先了解 Jpa 是什么? Jpa (Java Persistence API) 是 Sun 官方提出的 Java 持久化规范.它为 Java 开发人员提供了一种 ...
- (转)Spring Boot(五):Spring Boot Jpa 的使用
http://www.ityouknow.com/springboot/2016/08/20/spring-boot-jpa.html 在上篇文章Spring Boot(二):Web 综合开发中简单介 ...
- Spring boot JPA 用自定义主键策略 生成自定义主键ID
最近学习Spring boot JPA 学习过程解决的一些问题写成随笔,大家一起成长.这次遇到自定义主键的问题 package javax.persistence; public enum Gener ...
- Spring Boot(十五):spring boot+jpa+thymeleaf增删改查示例
Spring Boot(十五):spring boot+jpa+thymeleaf增删改查示例 一.快速上手 1,配置文件 (1)pom包配置 pom包里面添加jpa和thymeleaf的相关包引用 ...
- spring boot JPA中实体类常用注解
spring boot jpa中的注解很多,参数也比较多.没必要全部记住,但是经常查看官方文档也比较麻烦,记录一下一些常用的注解.通过一些具体的例子来帮助记忆. @Entity @Table(name ...
随机推荐
- tomcat的安装和优化二
JAVA应用服务器weblogicwebsphere tomcat resin(百度,去哪网,搜狗,人人,互动百科)jboss resin官网:www.caucho.com jvm的调优: 1 JAM ...
- (转)iOS字体
一.iOS原生字体展示 在 label中选择字体的font,并把font由system改成custom后,就能在family中看到72种特殊字体.这些里面就有很炫的字体,但 是全部是只针对英文数字,对 ...
- Docker镜像分层技术
Docker镜像管理 1.镜像分层技术 2.创建镜像 3.下载镜像到主机 4.删除镜像 5.上传镜像到registry docker镜像: 早在集装箱没有出现的时候,码头上还有许多搬运的工人在搬运货物 ...
- 【2018.11.23】2018WCTest(7)
向已退役学长致敬! 题目&他的题解 T1 一道睿智题目,正常思路就是时空复杂度均为 $O(n\times 32768)$ 的背包.这个做法不被卡时间却被卡空间,其实就是想让你离线处理询问,然后 ...
- 设置java、maven环境变量(怕麻烦以后直接来这里复制)
这种方法更为安全,它可以把使用这些环境变量的权限控制到用户级别,如果你需要给某个用户权限使用这些环境变量,你只需要修改其个人用户主目录下的.bash_profile文件就可以了. ·用文本编辑器打开用 ...
- linux文件夹作用
linux下的文件结构,看看每个文件夹都是干吗用的/bin 二进制可执行命令 /dev 设备特殊文件 /etc 系统管理和配置文件 /etc/rc.d 启动的配置文件和脚本 /home 用户主目录的基 ...
- .net面试题汇总-第二篇
本篇主要关注下,.net面试题中经常用的算法问题 1.有一群猴子,它们每天要吃桃子,它们第一天吃的数量是总量的一半再多一个,第二天吃的是第一天剩下的一半再多一个,第三天吃的是第二天剩下的一半多一个,以 ...
- scanf printf函数返回值
1. scanf 函数是有返回值的,它的返回值可以分成三种情况 1) 正整数,表示正确输入参数的个数.例如执行 scanf("%d %d", &a, &b); ...
- HDU 1394 线段树求逆序对
Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- [bzoj3622]已经没有什么好害怕的了_动态规划_容斥原理
bzoj-3622 已经没有什么好害怕的了 题目大意: 数据范围:$1\le n \le 2000$ , $0\le k\le n$. 想法: 首先,不难求出药片比糖果小的组数. 紧接着,我开始的想法 ...