JPA简介

JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。 Sun引入新的JPA ORM规范出于两个原因:其一,简化现有Java EE和Java SE应用开发工作;其二,Sun希望整合ORM技术,实现天下归一。

YAML中JPA的配置

spring:
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver

  jpa:
    # 指定数据库类型
    database-platform: org.hibernate.dialect.MySQL8Dialect
    # 会根据@Entity注解的实体类生成对应数据表。
    generate-ddl: true
    hibernate:
      # create 每次运行删除原有的表 再去创建一个新的表,
      # none将功能失效效
      # update 如果设定的实体类发生了改变,数据表会更新
      # validate 实体类和数据表进行校验,属性或个数不一致会抛出异常
      ddl-auto: create
      # 操作实体对象的时候会生成sql语句,false不生成sql
    show-sql: true

JPA的使用

创建表

  • 现在开始JPA的使用
  • 先创建一个实体类
@Entity(name = "t_pet")
public class Pet {
    //id唯一值
    @Id
    //主键生成策略
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    //pname是一个普通的列
    @Column
    private String pname;
}
//省略getter and setter toString....
- `@Entity(name = "t_pet")` 使用Entity标注为这是一个实体类,name属性值是 生成的表名
- `@Id` 表中的唯一值
- `@GeneratedValue(strategy = GenerationType.IDENTITY)` 是主键生成策略 strategy可以是GenerationType.**IDENTITY**也可以是GenerationType.**AUTO**
  • 直接创建测试类
@SpringBootTest
public class JpaTest {
    @Test
    void testJpaCreateTable() {
        System.out.println("table 创建成功");
    }
}
- 运行后会会看到控制台有这样一句
`Hibernate: create table hibernate_sequence (next_val bigint) engine=InnoDB`
这是创建数据库的sql语句,后面还有测试方法里的输出语句
到这里数据库就创建成功了

添加数据

  • 这时候需要创建一个dao接口,创建好接口后继承 JpaRepository
  • JpaRepository<T,Object> 第一个是上面创建实体类的类型,第二个实体类中 唯一值的类型,接口里面不需要自定义任何方法
import org.springframework.data.jpa.repository.JpaRepository;
public interface PetDao extends JpaRepository<Pet, Integer> {}
  • 接下来就是测试运行
	@Autowired
	private PetDao petDao;

	@Test
	void testJpaAdd() {
		Pet p = new Pet();
		p.setPname("Xaihei");
		p.setColor("Red");

		petDao.save(p);

		System.out.println("添加完成");
	}
    /**
     * 指定了 id值会先进行查询操作
     * 如果id值重复则会进行update(修改)操作
     * 如果id值不重复则进行insert(添加)操作
     */
    @Test
    void testJpaAdd2() {
        Pet p = new Pet();
        //id重复会进行修改操作
        //p.setId(1);

        //id不重复会进行添加操作
        p.setPname("Xaihei");
        p.setColor("Red");

        petDao.save(p);

        System.out.println("添加完成");
    }

查询数据

  • 查询数据使用到了findAll方法
  • 直接上代码
  • 根据id查询数据
//根据id查数据
    @Test
    void jpaFindId(){
        Optional<Pet> optional = petDao.findById(1);
		//调用Optional的get()方法
        Pet pet = optional.get();

        System.out.println(pet.getId());
        System.out.println(pet.getPname());
        System.out.println(pet.getColor());
    }


- 查询所有数据
```java
    @Test
    void jpaFindAll(){
        //直接查询所有
		//List<Pet> all = petDao.findAll();
		//System.out.println("all = " + all);

        //修改查询顺序
        List<Pet> pname = petDao.findAll(Sort.by(Sort.Order.asc("pname")));
        System.out.println("pname = " + pname);
    }
  • 分页查询
    void jpaFindAllPage(){
        //page 第几页
        //size 当前啊页几条
        //Direction.ASC 指定升序排序 Direction.DESC 指定降序排序
        //properties 指定哪个属性排序
        Pageable pageable = PageRequest.of(0,3, Sort.Direction.DESC,"pname");
        Page<Pet> all = petDao.findAll(pageable);
        for (Pet pet : all) {
            System.out.println(pet.getPname());
            System.out.println(pet.getColor());
            System.out.println(pet.getId());
        }
    }

删除操作

  • 删除使用了delete()方法
    @Test
    void jpaDelete(){
		//传入对象的方式
        //Pet pet = new Pet();
        //pet.setId(1);
        //petDao.delete(pet);

        //直接传入id
        petDao.deleteById(2);
    }

接下来就是自定义查询

  • 自定义查询需要在PetDao接口添加方法
  • 自定义查询命名规范
    • 自定义查询有命名规范
      比如按指定name查询 就要命名为findByName(String name)
      带and的命名findByPnameAndColor(String name, String color)
List<Pet> findByPname(String pname);
List<Pet> findByPnameAndColor(String pname, String color);
  • 测试
    //自定义查询
    @Test
    void jpaCustomName(){
        List<Pet> xaihei = petDao.findByPname("Xaihei");
        System.out.println("xaihei = " + xaihei);
    }

    //带and的自定义查询
    @Test
    void jpaCustomAnd(){
        List<Pet> byPnameAndColor = petDao.findByPnameAndColor("Xaihei", "Red");
        System.out.println("byPnameAndColor = " + byPnameAndColor);
    }

OK 完成 2021-11-07 23:37:19 星期日!!!``

posted on 2021-11-07 23:51  MucdIng  阅读(41)  评论(0)    收藏  举报