JPA(学习)
程序员文章站
2022-03-02 15:23:01
...
ORM思想
操作实体类就相当于操作数据库表。
就要建立两个映射关系:
- 建立实体类和表的关系。
- 建立实体类中属性和表中字段的关系。
不再关注重点:SQl语句
实现了ORM思想的框架:Mybatis、Hibernate。
配置两个映射关系:
@ToString
@Data//get和set方法
/**
* 注意!!!:导包都是javax.persistence的包
* 1、完成实体类和表的映射关系
* @Entity 声明实体类
* @Table 配置实体类和表的映射关系
* name:配置数据库表的名称
* 2、实体类中属性和表中字段的关系
*
*/
@Entity
@Table(name = "cst_customer")
public class Customer {
/**
* @Id 声明主键的配置
* @GeneratedValue 配置主键的策略
* (strategy = GenerationType.IDENTITY) 自增
* @Column 配置属性数据表中字段的映射关系
* name:数据库表中字段的名称
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "cust_id")
private Long cust_id;
@Column(name = "cust_name")
private String cust_name;
@Column(name = "cust_source")
private String cust_source;
@Column(name = "cust_industry")
private String cust_industry;
@Column(name = "cust_level")
private String cust_level;
@Column(name = "cust_address")
private String cust_address;
@Column(name = "cust_phone")
private String cust_phone;
}
其中主键的生成策略:
* @GeneratedValue 配置主键的策略
* strategy
* GenerationType.IDENTITY: 自增 (底层数据库必须要支持自动增长)Mysql
* GenerationType.SEQUENCE: 序列 (底层数据库必须支持序列) Oracle
* GenerationType.TABLE : Jpa提供的一种机制,通过一张数据库表的形式帮助我们完成主键自增 相当于除了你的表,他会自己再建一个表来放下一次的自增id为多少
* GenerationType.AUTO : 由程序自动的帮助我们选择主键生成策略
测试代码:
/**
* 测试jpa的保存
* 案例:保存一个客户到数据库
* Jpa的操作
* 1.加载配置文件创建工厂(实体管理类工厂)对象
* 2.通过实体类管理类工厂获取实体类管理器
* 3.获取事务对象,开启事务
* 4.完成增删改查操作
* 5.提交事务(回滚事务)
* 6.释放资源
*/
@Test
void JpaTest() {
//1.加载配置文件创建工厂(实体管理类工厂)对象
/*维护了很多内容:浪费资源
*线程安全,多个线程访问同一个不会有线程安全问题
*如何解决资源浪费
*创建一个公共的EntityManagerFactory对象
*静态代码块形式创建
*/
EntityManagerFactory myJpa = Persistence.createEntityManagerFactory("MyJpa");//配置文件中persistence-unit的名字
//2.通过实体类管理类工厂获取实体类管理器
/*
*getTransaction:创建事务对象
*persist:保存
*merge:更新
*remove:删除
* find/getRefrence:根据id查询
*/
EntityManager entityManager = myJpa.createEntityManager();
// 3.获取事务对象,开启事务
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
// 4.完成增删改查操作
Customer customer=new Customer();
customer.setCust_name("cqupt");
customer.setCust_address("南山");
//保存
entityManager.persist(customer);
// 5.提交事务(回滚事务:rollback)
transaction.commit();
// 6.释放资源
entityManager.close();
myJpa.close();
}
配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
<!--需要配置persistence-unit节点
持久化单元:
name:持久化单元名称
transaction-type:事务管理的方式
JTA:分布式事务管理(不同的表在不同的数据库)
RESOURCE_LOCAL:本地事务管理(不同的表在同一数据库)
-->
<persistence-unit name="MyJpa" transaction-type="RESOURCE_LOCAL">
<!-- JPA的实现方式-->
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<properties>
<!-- 数据库信息
用户名:javax.persistence.jdbc.user
密码:javax.persistence.jdbc.password
驱动:javax.persistence.jdbc.driver
数据库地址:javax.persistence.jdbc.url
-->
<property name="javax.persistence.jdbc.user" value="root"/>
<property name="javax.persistence.jdbc.password" value="19980605"/>
<property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/syfwfl?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC"/>
<!--可选配置:配置JPA实现方的信息
显示Sql :hibernate.show_sql:false|true
自动创建数据库表:hibernate.hbm2ddl.auto:
create: 程序运行时创建数据库(如果有表先删除表再创建)
update: 程序运行时创建表(如果有表不会创建)
none : 不会创建表
-->
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
</properties>
</persistence-unit>
</persistence>