Spring Boot2 系列教程(二十四)Spring Boot 整合 Jpa

Spring Boot 中的数据持久化方案前面给大伙介绍了两种了,一个是 JdbcTemplate,还有一个 MyBatis,JdbcTemplate 配置简单,使用也简单,可是功能也很是有限,MyBatis 则比较灵活,功能也很强大,据我所知,公司采用 MyBatis 作数据持久化的至关多,可是 MyBatis 并非惟一的解决方案,除了 MyBatis 以外,还有另一个东西,那就是 Jpa,松哥也有一些朋友在公司里使用 Jpa 来作数据持久化,本文就和大伙来讲说 Jpa 如何实现数据持久化。java

Jpa 介绍

首先须要向大伙介绍一下 Jpa,Jpa(Java Persistence API)Java 持久化 API,它是一套 ORM 规范,而不是具体的实现,Jpa 的江湖地位相似于 JDBC,只提供规范,全部的数据库厂商提供实现(即具体的数据库驱动),Java 领域,小伙伴们熟知的 ORM 框架可能主要是 Hibernate,实际上,除了 Hibernate 以外,还有不少其余的 ORM 框架,例如:mysql

  • Batoo JPA
  • DataNucleus (formerly JPOX)
  • EclipseLink (formerly Oracle TopLink)
  • IBM, for WebSphere Application Server
  • JBoss with Hibernate
  • Kundera
  • ObjectDB
  • OpenJPA
  • OrientDB from Orient Technologies
  • Versant Corporation JPA (not relational, object database)

Hibernate 只是 ORM 框架的一种,上面列出来的 ORM 框架都是支持 JPA2.0 规范的 ORM 框架。既然它是一个规范,不是具体的实现,那么必然就不能直接使用(相似于 JDBC 不能直接使用,必需要加了驱动才能用),咱们使用的是具体的实现,在这里咱们采用的实现实际上仍是 Hibernate。git

Spring Boot 中使用的 Jpa 其实是 Spring Data Jpa,Spring Data 是 Spring 家族的一个子项目,用于简化 SQL、NoSQL 的访问,在 Spring Data 中,只要你的方法名称符合规范,它就知道你想干吗,不须要本身再去写 SQL。github

关于 Spring Data Jpa 的具体状况,你们能够参考一文读懂 Spring Data Jpaweb

工程建立

建立 Spring Boot 工程,添加 Web、Jpa 以及 MySQL 驱动依赖,以下:spring

工程建立好以后,添加 Druid 依赖,完整的依赖以下:sql

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.10</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.28</version>
    <scope>runtime</scope>
</dependency>

如此,工程就算建立成功了。数据库

基本配置

工程建立完成后,只须要在 application.properties 中进行数据库基本信息配置以及 Jpa 基本配置,以下:app

# 数据库的基本配置
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.url=jdbc:mysql:///test01?useUnicode=true&characterEncoding=UTF-8
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

# JPA配置
spring.jpa.database=mysql
# 在控制台打印SQL
spring.jpa.show-sql=true
# 数据库平台
spring.jpa.database-platform=mysql
# 每次启动项目时,数据库初始化策略
spring.jpa.hibernate.ddl-auto=update
# 指定默认的存储引擎为InnoDB
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect

注意这里和 JdbcTemplate 以及 MyBatis 比起来,多了 Jpa 配置,Jpa 配置含义我都注释在代码中了,这里再也不赘述,须要强调的是,最后一行配置,默认状况下,自动建立表的时候会使用 MyISAM 作表的引擎,若是配置了数据库方言为 MySQL57Dialect,则使用 InnoDB 作表的引擎。框架

好了,配置完成后,咱们的 Jpa 差很少就能够开始用了。

基本用法

ORM(Object Relational Mapping) 框架表示对象关系映射,使用 ORM 框架咱们没必要再去建立表,框架会自动根据当前项目中的实体类建立相应的数据表。所以,我这里首先建立一个 User 对象,以下:

@Entity(name = "t_user")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    @Column(name = "name")
    private String username;
    private String address;
    //省略getter/setter
}

首先 @Entity 注解表示这是一个实体类,那么在项目启动时会自动针对该类生成一张表,默认的表名为类名,@Entity 注解的 name 属性表示自定义生成的表名。@Id 注解表示这个字段是一个 id,@GeneratedValue 注解表示主键的自增加策略,对于类中的其余属性,默认都会根据属性名在表中生成相应的字段,字段名和属性名相同,若是开发者想要对字段进行定制,可使用 @Column 注解,去配置字段的名称,长度,是否为空等等。

作完这一切以后,启动 Spring Boot 项目,就会发现数据库中多了一个名为 t_user 的表了。

针对该表的操做,则须要咱们提供一个 Repository,以下:

public interface UserDao extends JpaRepository<User,Integer> {
    List<User> getUserByAddressEqualsAndIdLessThanEqual(String address, Integer id);
    @Query(value = "select * from t_user where id=(select max(id) from t_user)",nativeQuery = true)
    User maxIdUser();
}

这里,自定义 UserDao 接口继承自 JpaRepository,JpaRepository 提供了一些基本的数据操做方法,例如保存,更新,删除,分页查询等,开发者也能够在接口中本身声明相关的方法,只须要方法名称符合规范便可,在 Spring Data 中,只要按照既定的规范命名方法,Spring Data Jpa 就知道你想干吗,这样就不用写 SQL 了,那么规范是什么呢?参考下图:

固然,这种方法命名主要是针对查询,可是一些特殊需求,可能并不能经过这种方式解决,例如想要查询 id 最大的用户,这时就须要开发者自定义查询 SQL 了。

如上代码所示,自定义查询 SQL,使用 @Query 注解,在注解中写本身的 SQL,默认使用的查询语言不是 SQL,而是 JPQL,这是一种数据库平台无关的面向对象的查询语言,有点定位相似于 Hibernate 中的 HQL,在 @Query 注解中设置 nativeQuery 属性为 true 则表示使用原生查询,即大伙所熟悉的 SQL。上面代码中的只是一个很简单的例子,还有其余一些点,例如若是这个方法中的 SQL 涉及到数据操做,则须要使用 @Modifying 注解。

好了,定义完 Dao 以后,接下来就能够将 UserDao 注入到 Controller 中进行测试了(这里为了省事,就没有提供 Service 了,直接将 UserDao 注入到 Controller 中)。

@RestController
public class UserController {
    @Autowired
    UserDao userDao;
    @PostMapping("/")
    public void addUser() {
        User user = new User();
        user.setId(1);
        user.setUsername("张三");
        user.setAddress("深圳");
        userDao.save(user);
    }
    @DeleteMapping("/")
    public void deleteById() {
        userDao.deleteById(1);
    }
    @PutMapping("/")
    public void updateUser() {
        User user = userDao.getOne(1);
        user.setUsername("李四");
        userDao.flush();
    }
    @GetMapping("/test1")
    public void test1() {
        List<User> all = userDao.findAll();
        System.out.println(all);
    }
    @GetMapping("/test2")
    public void test2() {
        List<User> list = userDao.getUserByAddressEqualsAndIdLessThanEqual("广州", 2);
        System.out.println(list);
    }
    @GetMapping("/test3")
    public void test3() {
        User user = userDao.maxIdUser();
        System.out.println(user);
    }
}

如此以后,便可查询到须要的数据。

好了,本文的重点是 Spring Boot 和 Jpa 的整合,这个话题就先说到这里。

多说两句

在和 Spring 框架整合时,若是用到 ORM 框架,大部分人可能都是首选 Hibernate,实际上,在和 Spring+SpringMVC 整合时,也能够选择 Spring Data Jpa 作数据持久化方案,用法和本文所述基本是同样的,Spring Boot 只是将 Spring Data Jpa 的配置简化了,所以,不少初学者对 Spring Data Jpa 以为很神奇,可是又以为无从下手,其实,此时能够回到 Spring 框架,先去学习 Jpa,再去学习 Spring Data Jpa,这是给初学者的一点建议。

相关案例已经上传到 GitHub,欢迎小伙伴们们下载:https://github.com/lenve/javaboy-code-samples

扫码关注松哥,公众号后台回复 2TB,获取松哥独家 超2TB 学习资源

相关文章
相关标签/搜索