orm思想
-
主要目的:操作实体类就相当于操作数据库表
-
建立两个映射关系:
实体类和表的映射关系
实体类中属性和表中字段的映射关系
不再重点关注:sql语句实现了ORM思想的框架:mybatis,hibernate
hibernate框架介绍
Hibernate是一个开放源代码的对象关系映射框架,
它对JDBC进行了非常轻量级的对象封装,
它将POJO与数据库表建立映射关系,是一个全自动的orm框架
JPA规范
jpa规范,实现jpa规范,内部是由接口和抽象类组成
jpa的基本操作
案例:是客户的相关操作(增删改查)
客户:就是一家公司
客户表:
/*创建客户表*/
CREATE TABLE cst_customer (
cust_id bigint(32) NOT NULL AUTO_INCREMENT COMMENT '客户编号(主键)',
cust_name varchar(32) NOT NULL COMMENT '客户名称(公司名称)',
cust_source varchar(32) DEFAULT NULL COMMENT '客户信息来源',
cust_industry varchar(32) DEFAULT NULL COMMENT '客户所属行业',
cust_level varchar(32) DEFAULT NULL COMMENT '客户级别',
cust_address varchar(128) DEFAULT NULL COMMENT '客户联系地址',
cust_phone varchar(64) DEFAULT NULL COMMENT '客户联系电话',
PRIMARY KEY (`cust_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
jpa操作的操作步骤
-
加载配置文件创建实体管理器工厂
Persisitence:静态方法(根据持久化单元名称创建实体管理器工厂)
createEntityMnagerFactory(持久化单元名称)EntityManagerFactory factory = Persistence.createEntityManagerFactory("myJpa");
作用:创建实体管理器工厂
-
根据实体管理器工厂,创建实体管理器
EntityManagerFactory :获取EntityManager对象
方法:createEntityManagerEntityManager em = factory.createEntityManager();
内部维护的很多的内容
- 内部维护了数据库信息,
- 维护了缓存信息
- 维护了所有的实体管理器对象
- 再创建EntityManagerFactory的过程中会根据配置创建数据库表
- EntityManagerFactory的创建过程比较浪费资源
特点:线程安全的对象
多个线程访问同一个EntityManagerFactory不会有线程安全问题
如何解决EntityManagerFactory的创建过程浪费资源(耗时)的问题?思路:创建一个公共的EntityManagerFactory的对象,静态代码块的形式创建EntityManagerFactory
-
创建事务对象,开启事务
EntityManager对象:实体类管理器EntityTransaction tx = em.getTransaction(); presist : 保存 merge : 更新 remove : 删除 find/getRefrence : 根据id查询
Transaction 对象 : 事务
tx.begin(); begin:开启事务 commit:提交事务 rollback:回滚
4.增删改查操作
5.提交事务
6.释放资源
搭建环境的过程
-
创建maven工程导入坐标
-
需要配置jpa的核心配置文件
*位置:配置到类路径下的一个叫做 META-INF 的文件夹下
*命名:persistence.xml
<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0"> <!--配置持久化单元 name:持久化单元名称 transaction-type:事务类型 RESOURCE_LOCAL:本地事务管理 JTA:分布式事务管理 --> <persistence-unit name="myJpa" transaction-type="RESOURCE_LOCAL"> <!--配置JPA规范的服务提供商 --> <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> <properties> <!-- 数据库驱动 --> <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /> <!-- 数据库地址 --> <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/test" /> <!-- 数据库用户名 --> <property name="javax.persistence.jdbc.user" value="root" /> <!-- 数据库密码 --> <property name="javax.persistence.jdbc.password" value="111111" /> <!--jpa提供者的可选配置: 我们的JPA规范的提供者为hibernate,所以jpa的核心配置中兼容hibernate的配 hibernate.hbm2ddl.auto create程序执行时,创建数据库表(如果有表,删除表) update程序执行时,创建数据库表(如果有表,不创建表) none不会创建任何数据库表(数据库有表,可以正常运行,没有表则报错) --> <property name="hibernate.show_sql" value="true" /> <property name="hibernate.format_sql" value="true" /> <property name="hibernate.hbm2ddl.auto" value="" /> </properties>
-
配置实体类和表,类中属性和表中字段的映射关系
package cn.itcast.domain; import javax.persistence.*; /** * 客户的实体类 * 配置映射关系 * 1.实体类和表的映射关系 * @Entity:声明实体类 * @Table : 配置实体类和表的映射关系 * name : 配置数据库表的名称 * 2.实体类中属性和表中字段的映射关系 */ @Entity @Table(name = "cst_customer") public class Customer { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "cust_id") private int custId; //客户的主键 @Column(name = "cust_name") private String custName;//客户名称 @Column(name="cust_source") private String custSource;//客户来源 @Column(name="cust_level") private String custLevel;//客户级别 @Column(name="cust_industry") private String custIndustry;//客户所属行业 @Column(name="cust_phone") private String custPhone;//客户的联系方式 @Column(name="cust_address") private String custAddress;//客户地址 }
@Id:声明主键的配置
@GeneratedValue:配置主键的生成策略
strategy- GenerationType.IDENTITY :自增,mysql
底层数据库必须支持自动增长(底层数据库支持的自动增长方式,对id自增) - GenerationType.SEQUENCE : 序列,oracle
底层数据库必须支持序列 - GenerationType.TABLE : jpa提供的一种机制,通过一张数据库表的形式帮助我们完成主键自增
- GenerationType.AUTO : 由程序自动的帮助我们选择主键生成策略
@Column:配置属性和字段的映射关系
name:数据库表中字段的名称 - GenerationType.IDENTITY :自增,mysql
-
保存客户到数据库中
-
persist : 保存
@Test public void testSave(){ EntityManagerFactory factory = Persistence.createEntityManagerFactory("myJpa"); EntityManager em = factory.createEntityManager(); EntityTransaction tx = em.getTransaction(); tx.begin(); Customer customer = new Customer(); customer.setCustName("传智播客"); customer.setCustIndustry("教育"); em.persist(customer); tx.commit(); em.close(); factory.close(); }
-
merge : 更新
-
remove : 删除
-
find/getRefrence : 根据id查询
-
-
jpql查询
sql:查询的是表和表中的字段
jpql:查询的是实体类和类中的属性
jpql和sql语句的语法相似-
查询全部
String jpql = "FROM cn.itcast.domain.Customer"; //query才是真正执行jpql的对象 Query query = em.createQuery(jpql); //发送查询,并封装结果集 List list = query.getResultList();
-
分页查询
String jpql = "from Customer"; Query query = em.createQuery(jpql); query.setFirstResult(0); query.setMaxResults(2);
-
.统计查询
String jpql = "select count(custId) from Customer"; Query query = em.createQuery(jpql); Object count = query.getSingleResult(); System.out.println("总记录数:"+count);
-
条件查询
String jpql = "from Customer where custName like ?"; Query query = em.createQuery(jpql); //第一个参数:占位符的索引位置(从1开始) //第二个参数:取值 query.setParameter(1,"????-%"); //发送查询,并封装结果集 List list = query.getResultList();
-
排序
String jpql = "FROM cn.itcast.domain.Customer order by custId desc"; Query query = em.createQuery(jpql); List list = query.getResultList();
-