概念
ORM思想
对象关系映射(Object Relational Mapping,简称ORM)是通过使用描述对象和数据库之间映射的元数据,将面向对象语言程序中的对象自动持久化到关系数据库中。
实际应用中即在关系型数据库和业务实体对象之间作一个映射,这样,我们在具体的操作业务对象的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了。
简而言之,ORM思想就是通过实体对象操纵数据库的持久化数据。
常见的ORM框架,如hibernate,mybatis等
JPA
JPA是Java Persistence API的简称,中文名Java持久层API。
JPA支持XML和JDK5.0注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中;
JPA是SUN公司推出的一套基于ORM思想的规范,提供统一的内部接口由各类框架去实现这种规范
SpringDataJPA
Spring Data JPA 是 Spring 基于 ORM 框架、JPA 规范的基础上封装的一套JPA应用框架。不是为了取代现有的ORM框架,只是提供便捷开发,易于维护和切换ORM框架使用。
JPQL
JPQL全称Java Persistence Query Language,旨在以面向对象表达式语言的表达式,将SQL语法和简单查询语义绑定在一起·使用这种语言编写的查询是可移植的,可以被编译成所有主流数据库服务器上的SQL。
其特征与原生SQL语句类似,并且完全面向对象,通过类名和属性访问,而不是表名和表的字段。
举个栗子:
当你想把大象装进冰箱里,你需要制定大概思想要怎么去做;(ORM思想)
其次你可以将你的操作步骤记录下来,将打开冰箱门,装进大象,关上冰箱门封装成一套规范;(JPA规范)
而为了以防下次出现另一种冰箱,你再将对所有冰箱的操作封装;(SpringDataJPA)
你在开门关门用的是左手还是右手?(JPQL)
JPA的使用
使用JPA离不开它的实现框架,用hibernate作为它的实现商使用。
导入hibernate的jar包
<!-- hibernate对jpa的支持包 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.0.7.Final</version>
</dependency>
<!-- c3p0 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-c3p0</artifactId>
<version>5.0.7.Final</version>
</dependency>
创建大象的数据库表
CREATE TABLE elephant(
e_id int(32) NOT NULL AUTO_INCREMENT COMMENT '大象的id',
e_name VARCHAR(32) NOT NULL COMMENT '大象名字',
e_address VARCHAR(32) DEFAULT NULL COMMENT '大象的住址',
PRIMARY KEY (e_id)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
创建大象的实体类
public class Elephant {
//大象id
private int eleId;
//大象名字
private String eleName;
//大象住址
private String eleAddress;
/* getter and setter */
}
编写JPA的配置文件
在resources目录的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="jpa" 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/jpa"/>
<property name="javax.persistence.jdbc.user" value="root"/>
<property name="javax.persistence.jdbc.password" value="****"/>
<!--jpa提供的配置信息-->
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true" />
<!--
create:总是创建新的表删除旧表
update:有表则不会创建新的表
-->
<property name="hibernate.hbm2ddl.auto" value="create" />
</properties>
</persistence-unit>
</persistence>
实体类加注解
@Entity
@Table(name="elephant")
public class Elephant {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="e_id")
private int eleId;
@Column(name = "e_name")
private String eleName;
@Column(name = "e_address")
private String eleAddress;
/* getter和setter */
}
注解:
@Entity
属性:name:默认为实体类非限定类名
表示该类是实体类
@Table
属性:
name:指定数据库表的名称,默认为实体类名
catalog: 表的目录,默认为" “。指定数据库实例名
schema: 模式名,默认为” "
@Id
可以放在属性或者对应的get方法上
指定该属性为表的主键
@GeneratedValue
作用:指定主键的生成策略
属性:
strategy :指定主键生成策略,默认为AUTO。
生成策略:
IDENTITY:主键由数据库自动生成(主要是自动增长型)
SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列
AUTO:主键由程序控制
TABLE:使用一个特定的数据库表格来保存主键
@Column
作用:指定实体类属性和数据库表之间的对应关系
属性: name:指定数据库表的列名称。
unique:是否唯一
nullable:是否可以为空
inserttable:是否可以插入
updateable:是否可以更新
length: String属性的长度,默认为255
scale:列的小数位数,默认为0
抽取工具类
public final class JPAUtil {
// JPA的实体管理器工厂:相当于Hibernate的SessionFactory
private static EntityManagerFactory factory;
static {
// 该方法参数必须和persistence.xml中persistence-unit标签name属性取值一致
factory = Persistence.createEntityManagerFactory("jpa");
}
public static EntityManager getEntityManager() {
return factory.createEntityManager();
}
}
EntityManagerFactory:
方法:createEntityManager:返回一个实体管理器
getCache:访问二级缓存
EntityManager:
persist(Object entity):保存实体到表中
T merge(T entity):更新
void remove(Object entity):删除
T find(Class entityClass, Object primaryKey):通过主键查询
T getReference(Class entityClass, Object primaryKey):延迟加载查询
测试CRUD
public class Test {
//保存添加
@Test
public void test1(){
//
EntityManager em = JPAUtil.getEntityManager();
//获取事务对象
EntityTransaction et = em.getTransaction();
et.begin();
Elephant elephant = new Elephant();
elephant.setEleName("跳舞的大象");
elephant.setEleAddress("森林");
em.persist(elephant);
et.commit();
em.close();
}
//查询
@Test
public void test2(){
//
EntityManager em = JPAUtil.getEntityManager();
//获取事务对象
EntityTransaction et = em.getTransaction();
et.begin();
Elephant elephant = em.find(Elephant.class, 1);
System.out.println(elephant);
et.commit();
em.close();
}
//更新
@Test
public void test3(){
EntityManager em