Spring Data Jpa 学习笔记

95 阅读3分钟

这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战

Jpa的概念

JPA(JavaPersistenceAPI)中文名Java持久层API,是JDK5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。Sun引入新的JPAORM规范出于两个原因:其一,简化现有JavaEE和JavaSE应用开发工作;其二,Sun希望整合ORM技术,实现天下归一。JPA包括以下三方面的内容一套API标准,在javax.persistence的包下面,用来操作实体对象,执行CRUD操作,框架在后台替代我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来。面向对象的查询语言:JavaPersistenceQueryLanguage(JPQL),这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。(这段是抄的)

SpringDataJpa

顾名思义SpringDataJap就是Spring遵循jpa的规范基于ORM框架开发的一套jap框架,让使用者可以通过代码非常方便的操作数据库,实现增删改查的功能,极大地简化开发,提升开发效率。

SpringDataJpa 快速入门

新建一个工程,导入依赖,这里我们用SpringBoot,导入mysql的依赖,Jpa的依赖,还有我们导入 lombok,就不用写getset了

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.20</version>
</dependency>

然后是我们的配置文件application.properties

spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/db_jpa?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
#创建数据库的方式类型
spring.jpa.hibernate.ddl-auto=update
#显示sql语句
spring.jpa.show-sql=true

我们做了两个配置一个是显示sql语句,一个是创建数据库的方式类型,我们选的是update,常用的也是update 其他几个类型分别是

  1. creat :每次都回去根据你的实体类生成表,不管有没有实体类有没有改变,表里边是否有数据,都会执行,这样我们上次的数据都被删除掉了,这里我们不用
  2. create-drop:每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除
  3. update : 我们今天用的,第一次运行时会根据实体类在我们连接的数据库去生成表,之后实体类更新,会根据实体类去更新表,但不会删除数据
  4. validate:每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。

创建实体类

@Entity
@Data
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    @Column(name = "username")
    private String userName;
    private Integer age;
    private String address;
    @Transient
    private String sex;
}

@Entity 代表是一个实体类

@Data 帮我们生成getset方法

@Id 主键

@GeneratedValue(strategy = GenerationType.IDENTITY) 主键自增策略

@Column(name = "username")当属姓名不一致时用来指定列名,当我们的用驼峰命名时,在生成列名会加下划线,比如我们上边的userName生成的列明是user_name,我们使用Column时他们保持一致

@Transient 表示这个属性数据库不创建,就是jap帮我们生成表时不生成这个列

创建接口

/*
* 自定义集成jap的接口
* CrudRepository提供增删改擦的借口
*
* CrudRepository<User,Integer> 
*/
public interface UserRepository extends CrudRepository<User,Integer> {

}

CrudRepository<T, ID> 的第一个参数使我们要操作的对象,ID时我们操作表的主键类型

测试类

新增
@Test
public void testSave(){
    User user = new User();
    user.setAge(20);
    user.setUserName("李四1109");
    user.setAddress("苏高新文体中心");
    User save = userRepository.save(user);
}

控制台打印

image.png

数据库,新增成功

image.png

查询
@Test
public void testGet(){
    System.out.println(userRepository.findById(1).get());
    System.out.println("---------------------------------------");
    Iterable<User> all = userRepository.findAll();
    for (User user : all) {
        System.out.println(user);
    }
    System.out.println("_--------------------------------------");
}

控制台

image.png

修改
@Test
public void testUpdate(){
    User user = new User();
    user.setAge(21);
    user.setUserName("李四1109");
    user.setAddress("苏高新文体中心");
    user.setId(1);
    User save = userRepository.save(user);
}

image.png

image.png 修改就是通过主键保存

删除
@Test
public  void testCountAndDele(){
    long count = userRepository.count();
    System.out.println(count);

    userRepository.deleteById(1);
    userRepository.deleteAll();

    System.out.println(userRepository.count());
}

image.png

image.png