ORM思想:
主要的目的:使得操作实体类就想操作数据库表一样
实现方式:建立两个映射关系
- 实体类和表的映射关系
- 实体类中属性和表中字段的映射关系
最终效果:使得与数据库的数据交互不在重点关注sql语句
hibername框架简介:
hibername是一个对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库建立了映射关系,是一个全自动封装的ORM框架,hibername可以自动生成sql语句,自动执行,使得程序员无需关注sql语句,随心所欲的调用hibername提供的方法以面向对象的思维进行开发,了解,因为SpringDataJpa底层使用了hibername框架
JPA规范
就像JDBC的规范一样,由官方制定,内部由接口和抽象类组成,不同的厂家根据规范进行不同的实现,我们在使用时,只需要指定对应厂家即可,JPA也是一种规范,有多种实现,SpringDataJpa也只是一种实现方式
JPA规范
JPA基本操作
使用注解或者一点点代码调用JPA规范暴露出来的接口或者抽象类,底层有hibernate实现数据库的交互
以案例入手,快速入门JPA
案例需求:学生表的CRUD操作
1)、环境搭建
创建maven工程,导入依赖
<dependencies>
<!--Junit测试相关依赖-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<!--hibernate对jpa的支持依赖-->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.0.12.Final</version>
</dependency>
<!--druid连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.14</version>
</dependency>
<!--log4j日志的依赖-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!--mysql8的依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.17</version>
</dependency>
</dependencies>
配置jpa的核心配置文件,要求在resources文件夹下创建META-INF文件夹,在内部创建名为persistence.xml的配置文件
文件结构
之后可以右键查看模板创建文件
查看模板
找到jpa的模板,复制黏贴即可
jpa模板
配置详细内容
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
<!--配置持久化单元:persistence-unit
name:持久化单元名称,可自定义
transaction-type:事务管理方式
RESOURCE_LOCAL:本地事务管理,当数据表集中在本地的数据库中,需要用此方式管理
JTA:分布式事务管理,当数据表分布在不同的数据库中,需要用此方式管理
-->
<persistence-unit name="jpa01" transaction-type="RESOURCE_LOCAL">
<!--jpa的实现方式-->
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<properties>
<!--数据源
用户名、密码、驱动、数据库地址
-->
<property name="javax.persistence.jdbc.user" value="root"/>
<property name="javax.persistence.jdbc.password" value="123456"/>
<property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT"/>
<!--可选配置:jpa实现方(hibernate)的一些配置
在控制台显示生成的sql语句
自动创建数据库表行为:hibernate.hbm2ddl.auto:
create:程序运行时创建表,若表已存在,先删除在创建
update:程序运行时创建表,若存在则更新数据
none:程序运行时不会创建表
-->
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.hbm2ddl.auto" value="create"/>
</properties>
</persistence-unit>
</persistence>
编写数据表对应的实体类
/**
* 配置映射关系:
* 实体类和表的映射关系
* 实体类中属性和表中字段的映射关系
*/
@Data
@Entity //声明此类是一个实体类
@Table(name = "student_info") //实体类和表的映射关系
public class student {
@Id //设置主键
@GeneratedValue(strategy = GenerationType.IDENTITY) //设置主键自增
@Column(name = "sid") //实体类中属性和表中字段的映射关系
private int sid; //设置主键自增则该主键类型必须为int
@Column(name = "sname")
private String sname;
@Column(name = "sage")
private int sage;
@Column(name = "ssex")
private String ssex;
public student() {
}
public student(String sid, String sname, int sage, String ssex) {
this.sid = sid;
this.sname = sname;
this.sage = sage;
this.ssex = ssex;
}
}
2)、测试CRUD操作
public class test {
/**
* jpa的操作步骤
* 1、加载配置文件创建工厂类(实体管理器类工厂)
* 2、通过实体管理器类工厂创建实体管理器类
* 3、获取事务对象,开启事务
* 4、完成CRUD操作
* 5、提交事务(或回滚事务)
* 6、释放资源
*/
@Test
public void test01() {
//1、加载配置文件创建工厂类(实体管理器类工厂)
EntityManagerFactory jpa01 = Persistence.createEntityManagerFactory("jpa01");
//2、通过实体管理器类工厂创建实体管理器类
EntityManager em = jpa01.createEntityManager();
//3、获取事务对象,开启事务
EntityTransaction tx = em.getTransaction(); //获取事务对象
tx.begin(); //开启事务
//4、创建实体类对象,完成CRUD操作
student stu = new student(); //设置主键自增则创建的实体类不需要设置主键属性
stu.setSname("小杨JPA");
stu.setSage(1);
stu.setSsex("男");
em.persist(stu); //保存操作
//5、提交事务(或回滚事务)
tx.commit();
//6、释放资源
em.clear();
jpa01.close();
}
}
测试结果
成功的创建了表,使用create的注意点,因为每次启动都会删除原来的表创建新的表,则表中的数据永远都只会是最新一次执行的CRUD操作的结果 update
网友评论