目录
ORM思想的引入
JPA 概述
Springboot结合JPA的实现
1. 添加Spring Data JPA 依赖
2.添加MySql数据库驱动依赖
3.在中配置数据库和JPA的相关属性置
4.创建实体配置类
5.编写UserDao接口
6.编写测试类
ORM思想的引入
主要目的:操作实体类就是操作数据库表
建立两个两个映射关系:
实体类和数据库表的映射关系
实体类中的属性和数据库表中字段的映射关系
不再重点关注sql语句,通过实体类对象就可以完成数据库表的增删改查
JPA 概述
JPA 是Java Persistence API的简称,即Java持久化 API,是SUN公司推出的一套基于ORM思想的规范,内部由一系列接口和实现类构成。
JPA是JCP组织发布的Java EE标准之一。JPA是一种面向对象的查询语言,定义了独特的JPQL(Java Persistence Query Language),是一种针对实体的查询语言,无论是查询还是修改,全部操作的都是对象实体,而非数据库的表。
JPA框架中支持大数据集、事务、并发等容器级事务,这使得JPA超越了简单持久化框架的局限,在企业应用发挥更大的作用。
JPA 的主要目标之一就是提供更加简单的编程模型。
JPA 的查询语言是面向对象而非面向数据库的,它以面向对象的自然语法构造查询语句,可以看成是Hibernate Hg的等价物
Springboot结合JPA的实现
1. 添加Spring Data JPA 依赖
新建一个Springboot项目,在中加入Spring Data JPA依赖
<!--引入jpa的依赖-->
<dependency>
<groupId></groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
2.添加MySql数据库驱动依赖
<!--引入mysql的驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
3.在application.properties中配置数据库和JPA的相关属性置
-class-name=
=jdbc:mysql://localhost:3306/springboot?characterEncoding=UTF8&useSSL=false
=root
=
#jpa的相关配置
-ddl=true
-auto=update
-sql=true
-platform=.MySQL5InnoDBDialect
jpa相关配置:
(1)-ddl:属性值可以为true和false
true:开启逆向工程,即存在数据库的表,然后数据库表可以生成实体类。
false:正向工程,先存在实体类,然后根据实体类,生成底层的表。
开发阶段可以 设置为true 开启逆向工程;在实际上线运行阶段,实体类和底层的数据库表都是已经存在,应该把值改成flase。
(2)-auto:数据表结构
属性值可以设置为create,create-drop,none,update,validate
create:设置为create,每次运行程序都会将原来的数据删除,然后重新创建一个表。
create-drop:每次加载时将创建一个数据表,数据表使用完毕之后,将数据表再次删除。
none :将功能不生效 。
update:加载时更新表结构,如果你的表结构和实体类发生了改变,数据表会更新,如果数据库中有数据表,就使用原来的表,没有数据表,就会创建一个数据表。
validate:验证创建数据库表结构,实体类和数据表进行校验,如果属性或者个数不一致,就会抛出异常。
(3)-sql:控制台打印sql语句,属性值为true和false
true: 操作实体对象的时候,会给我们生成sql语句
false:不生成sql语句
(4)-platform:指定数据库的类型
4.创建实体配置类
注:set和get方法可以用lombok注解表示
package ;
import ;
import .*;
/**
* @author
* User 实体类,对应底层数据库表,mysql数据库当中没有user表
*可以使用jpa的正向工程
* 实体类--->关系表
* @Entity 注解:表明当前是实体类,当前的实体类和底层的user 关系表进行
*/
@Entity(name="user")
public class User {
@Id //id唯一值
@GeneratedValue(strategy = ) //自增主键
private int id;
@Column
private String name;
@Column
private String password;
@Column
private int age;
public int getId() {
return id;
}
public void setId(int id) {
= id;
}
public String getName() {
return name;
}
public void setName(String name) {
= name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
= password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
= age;
}
@Override
public String toString() {
return "User{" +
", name='" + name + '\'' +
", password='" + password + '\'' +
", age=" + age +
'}';
}
}
5.编写UserDao接口
新建一个接口,让接口继承JpaRepository,这个接口默认提供一组与JPA规范相关的方法。
JpaRepository<T,ID> jpa提供的接口:接口的当中定义了实体的基本操作,T 制定具体操作的实体类 ,ID指定主键字段的类型(实体类当中带有id注解的属性)。
import ;
import ;
/**
* 创建UserDao 接口,实现user实体类的操作
* JpaRepository<T,ID> jpa提供的接口:接口的当中定义了实体的基本操作
* T 制定具体操作的实体类 ,ID指定主键字段的类型(实体类当中带有id注解的属性)
*/
public interface UserDao extends JpaRepository<User,Integer> {
}
6.编写测试类
直接调用继承的JpaRepository类里面的方法进行CRUD。
其中,sava方法就可以完成添加和修改操作
package ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import .;
import ;
import ;
/*@EnableAutoConfiguration(exclude={})*/
@SpringBootTest(classes = )
class SpringbootJpaApplicationTests {
//对jpa提供的接口方法进行测试;
@Autowired
UserDao userDao; //springboot在启动的时候,底层使用了动态代理的方式,获得了一个接口的实现类,完成了注入
@Test
void contextLoads() {
("table 创建成功");
}
/**
* save方法
* 如果没有指定id字段,直接进行insert操作
* 如果指定id字段,且这个id存在,则就进行update操作
* 根据id 先去查询这个id是否存在
* 如果存在,则就进行更新操作
* 如果根据id没有查询到对应的记录,进行一个添加操作
*/
@Test
void addUset(){
("添加用户");
User user=new User();
("小❀");
("123456");
(18);
(user);
}
@Test
void updateUset(){
("添加用户");
User user=new User();
(4);
("李四");
("123456");
(24);
(user);
}
//查询操作,根据id来查询
@Test
void findUser(){
//获得了一个optional对象
//findById() JpaRepository 接口当中提供的,不是我们自定义的,
//查询的内容封装到optional对象中,get()方法获得user对象,如果查询的对象不存在,返回异常信息
Optional<User> optional = (1);
User user=();
(user);
}
/**
* 列表查询:返回的是列表集合
* findAll()没有指定任何参数,查询的列表
* findAll()在使用的时候可以指定参数,按照参数排序查询
*/
//查询全部
@Test
void findAllUser(){
List<User> users = ();
for (User user : users) {
(user);
}
}
//按照名字的顺序查找全部
@Test
void findAllUser2(){
List<User> name = (("name"));
for (User user : name) {
(user);
}
}
/**
* pageable:接口类型
* pageRequest:接口的实现类对象,
* 实现类不是直接new 构造器protect
* PageRequest:当类中提供了of方法,返回本类对象
* of()方法,static静态方法
* 参数一:
* page:查询第一页,用户指定
* size:当前页显示的记录数
* :指定降序排序
* :指定升序排序(一般默认)
* properties:指定具体的哪个属性进行排序
*/
//分页查询
@Test
void findAllUserWithPage(){
//pageable 对象封装了一些分页相关的参数
Pageable pageable= (1,2,,"id");
Page<User> users = (pageable);
for (User user : users) {
(user);
}
//获得分页相关的信息
//();获得元素的个数
// int totalPages= ();//获得页码数
}
/**
* 删除操作:
* delete(user);传递user对象,删除传递对象
* 先查询,再删除
*/
@Test
void deleteUser(){
/* User user=new User();
(1);
(user);
*/
(4);
}
}