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);
}
浙公网安备 33010602011771号