SpringBoot03_Jpa

本篇文章介绍SpringBoot + Jpa。文章不会过多介绍Spring Data
Jpa与Jpa的区别以及底层依赖,本专栏专注的是实践,因此会快速进入到如何搭建项目当中。

IDE:IntelliJ IDEA 2019.3.3

Java:jdk1.8

Spring Boot:2.3.5.RELEASE

MySQL:8.0.15

一、Spring Data JPA

首先快速介绍下Spring Data Jpa是什么?

Spring Data Jpa是Spring提供的一套简化Jpa开发的数据访问层框架,通过简单的继承Repository接口以快速实现数据层的CRUD操作,Spring Data Jpa同时约定了一套 方法命名规则 ,开发人员编写指定关键词的接口便能够实现相应的方法。

我们为什么要使用Spring Data Jpa?

因为简单快速高效。如果使用传统JDBC编程,我们会编写非常多的重复且无意义的代码,同时在Java代码中会耦合大量SQL语句,可维护性较差。而Spring Data Jpa将传统的SQL操作进行同一封装,并只对外提供简单的几个接口,便能够帮助开发人员快速访问、操作数据层,让开发人员更加专注业务代码的实现。


二、Spring Data Jpa快速启动

1、引入依赖

这里的依赖包最好在父工程进行依赖管理,为了方便这里就直接列出来了。

引入依赖后依照前面的文章快速搭建SpringBoot工程。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
    <version>2.3.5.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
    <version>2.3.5.RELEASE</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.17</version>
</dependency>

2、相关配置

spring:
  # 配置数据源信息,注意这是MySQL8.0版本以上的配置方式,MySQL5.0版本是不需要.cj的
  datasource:
    driverClassName: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/springbootdb?serverTimezone=Asia/Shanghai&characterEncoding=utf-8
    username: root
    password: 123456
  # 配置jpa
  jpa:
    show-sql: true # 默认false,在日志里显示执行的sql语句
    database: mysql # 数据库类型
    hibernate.ddl-auto: update # 运行程序时,没有表时会创建表,如果对象发生改变时,会更新对应的表,并且不会删除原有数据,只会进行更新(推荐)

上面的配置部分大家都比较熟悉,比如MySQL数据源相关配置,使用Spring时也大差不差。

对于Spring Data Jpa的配置也都有详尽的注释,这里只对 hibernate.ddl-auto 这个配置进行相关补充:

  • hibernate.ddl-auto: create:每次运行程序时,都会创建新表,同时原始数据丢失

  • hibernate.ddl-auto: create-drop:每次运行程序时,都会创建新表,程序结束后清空表

  • hibernate.ddl-auto: upadte:运行程序时,没有表时会创建表,如果对象发生改变时,会更新对应的表,并且不会删除原有数据,只会进行更新(推荐

  • hibernate.ddl-auto: validate:运行程序时,会校验字段与数据库列是否类型匹配,不匹配则报错

  • hibernate.ddl-auto: none:禁用DDL

还有一些其它的配置,大家可以在 JpaPropertiesHibernateProperties 两个配置类中查询。


3、实体类与DAO接口

1)、实体类

  • 编写一个JavaBean代表数据表的抽象,其中bean的属性与数据表的列名对应(也可以通过注解的id属性对应)。
  • 添加 @Entity 类注解,标明当前类为实体类,能够与数据源中的某张表对应,为Jpa在解析时提供标识。
  • 添加 @Table 类注解,并通过 name 属性映射至数据库中的某张表。
  • 接着进行bean中的属性与列名的映射过程:
    • @Id 注解标明当前属性为主键,之后可以通过 @GeneratedValue 注解中的 strategy 属性确定主键生成策略:
      • TABLE:使用特定的数据表来保存主键
      • SEQUENCE:使用数据库的序列机制提供主键,序列机制只有部分数据库支持,如Oracle、DB2等
      • IDENTITY:数据库自动生成主键,比如常见的自增长
      • AUTO:主键由持久化引擎判断控制生成,持久化引擎会根据配置的数据库在以上三种策略中选择一种,该选项也是默认选项
    • @Column 注解能够将当前属性映射至数据库列名上,如果未指定 name 属性,则属性名必须与列名相同。否则可以指定列名。length 属性可以指定数据库列名的存储字符长度。该注解中还有 nullable 属性标明当前属性是否可以为null,其它的属性可以在 @Column 中查询。
// org.mrxu.pojo.User
@Data
@Entity
@Table(name = "user")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "user_name", length = 20)
    private String userName;

    @Column(name = "user_age")
    private int userAge;
}

2)、DAO接口

  • 编写一个接口并继承 JpaRepository,泛型中填写实体类、主键类型
  • over!对,你没看错,就是这么简单!如果你只想实现简单的CRUD操作,到这里就行了。所有的CRUD操作都封装在了 JpaRepository 中。
// org.mrxu.dao.UserRepository
public interface UserRepository extends JpaRepository<User, Long> {}

4、测试

首先我们检查下数据库,可以看到其中并没有表,当程序运行时会自动为我们创建表。

在这里插入图片描述

1)、insert测试

编写如下测试类并运行:

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserRepositoryTest {
    @Resource
    private UserRepository userRepository;
    @Test
    public void testAddUser() {
        User user = new User();
        user.setUserAge(20);
        user.setUserName("xiaohua");
        // save方法为JpaRepository中的方法
        userRepository.save(user);
    }
}

运行结果如下图所示,可以看见不仅表被创建了,数据也成功添加进了表中。

在这里插入图片描述

2)、query测试

编写如下测试类并运行,这里只写了测试方法,框架同上:

@Test
public void testQueryUser() {
    Optional<User> userOptional = userRepository.findById(1L);
    User user = userOptional.get();
    System.out.println(user);
}

运行结果如下,可以看到表中数据被成功查询。

在这里插入图片描述

3)、update测试

编写如下测试类并运行,这里只写了测试方法,框架同上:

update与insert都是使用 save 方法,只不过update需要指定唯一键标明当前操作为更新操作,否则为新增操作。

@Test
public void testUpdateUser() {
    User user = new User();
    user.setId(1L);
    user.setUserAge(21);
    user.setUserName("xiaohua");
    userRepository.save(user);
}

运行结果如下,数据库中的数据已经被更新了:

在这里插入图片描述
看看打印的日志,也能说明当前操作为更新操作:

在这里插入图片描述

4)、删除操作

编写如下测试类并运行,这里只写了测试方法,框架同上:

@Test
public void testDeleteUser() {
    userRepository.deleteById(1L);
}

5)、小结

JpaRepository 中还有许多其它的通用CRUD方法,比如 findAllsaveAlldelete 等,大家可以去自行测试下,这里就不过多叙述。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值