JPA
jpa的概念:
Java Persistence API,即Java 持久化API,是SUN公司推出的一套基于ORM的规范,内部是由一系列的接口和抽象类构成。
ORM思想:
对象关系映射,Object Relational Mapping,将数据库中的字段名与实体类中的属性名对应起来,从而可以通过操作实体类的属性来操作数据库中的字段的效果
Hiberate:
JPA是规范,Hibernate除了作为ORM框架之外,它也是一种JPA实现,如果使用JPA规范进行数据库操作,底层需要hibernate作为其实现类完成数据持久化工作。
pom.xml
<dependencies>
<!-- junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- hibernate对jpa的支持包 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${project.hibernate.version}</version>
</dependency>
<!-- c3p0 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-c3p0</artifactId>
<version>${project.hibernate.version}</version>
</dependency>
<!-- log日志 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- Mysql and MariaDB -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
</dependencies>
实体类Entity:
import javax.persistence.*;
@Entity //指定当前类是一个实体类
@Table(name="cst_customer") //指定实体类所映射的数据库表的表名
public class Customer {
@Id //指定当前属性是主键IDENTITY,oracle就用SEQUENCE
//配置主键的生成策略,mysql就用
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="cust_id") //指定当前属性对应的数据库字段
private Long custId;
@Column(name="cust_name")
private String custName;
@Column(name="cust_source")
private String custSource;
@Column(name="cust_industry")
private String custIndustry;
@Column(name="cust_level")
private String custLevel;
@Column(name="cust_address")
private String custAddress;
@Column(name="cust_phone")
private String custPhone;
getter/setter...
}
API
在类路径resources下,创建META-INF文件夹,指定配置文件名为: persistence.xml (固定写法 )
@Test
public void testInsert(){
//自动加载配置文件,创建实体管理器工厂对象
EntityManagerFactory factory = Persistence.createEntityManagerFactory("myjpa");
//生成实体管理器对象
EntityManager entityManager = factory.createEntityManager();
//开启事务
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
Customer customer = new Customer();
customer.setCustIndustry("你好");
customer.setCustName("张三");
entityManager.persist(customer);
transaction.commit();
//释放资源
entityManager.close();
factory.close();
}
getTransaction : 获取事务对象
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin(); //开启事务
transaction.commit(); //提交事务
transaction.rollback(); //回滚事务
persist : 保存操作
Customer customer = new Customer();
customer.set....
//注意:不能设置id属性,id属性必须由实体类中的策略生成,sql中没有id
entityManager.persist(customer);
merge : 更新操作
//注意:如果没有id就会执行为insert;
//底层先执行select,再执行update,将customer参数更新到查询的对象中
entityManager.merge(customer); nnnii
remove : 删除操作
//删除必须先查再删,直接new的对象不行
Consumer consumer = entityManager.find(Consumer.class,1);
entityManager.remove(consumer);
find/getReference : 根据id查询
Consumer consumer1 = entityManager.find(Consumer.class,1); //立即加载
Consumer consumer2 = entityManager.getReference(Consumer.class,1); //延迟加载,得到的是动态代理对象
persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
<!--配置持久层单元,
name表示给当前持久层单元起一个名字,创建实体管理器工厂的时候使用,
transaction-type指定事务的类型,RESOURCE_LOCAL本地事务,JTA分布式事务-->
<persistence-unit name="myjpa" transaction-type="RESOURCE_LOCAL">
<!--配置持久层提供者-->
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<!--配置数据库连接环境-->
<properties>
<!--必须-->
<property name="javax.persistence.jdbc.user" value="root"></property>
<property name="javax.persistence.jdbc.password" value="root"></property>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"> </property>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/jpa"> </property>
<!--可选,
hibernate.show_sql在控制台输出执行的具体的sql
hibernate.hbm2ddl.auto取值:
create,每次执行sql前,先删除表,再创建表
update,有表就不创建,每表就创建
none,有没有表都不管,如果没有表就报错-->
<property name="hibernate.show_sql" value="true"></property>
<property name="hibernate.hbm2ddl.auto" value="none"></property>
</properties>
</persistence-unit>
</persistence>
JPQL
JPQL 全称Java Persistence Query Language
Java持久化查询语言(JPQL)是一种可移植的查询语言,旨在以面向对象表达式语言的表达式,将SQL语法和简单查询语义绑定在一起·使用这种语言编写的查询是可移植的,可以被编译成所有主流数据库服务器上的SQL。
注意:通过实体类的类名和属性名访问数据库,而不是表名和表的字段
//查询所有,不需要select,不能使用通配符*, from 实体类类名
String jpql = "from Consumer";
Query query = entityManager.createQuery(jpql);
List list = query.getResultList();
//分页查询,完全遵循limit
String jpql = "from Consumer";
Query query = entityManager.createQuery(jpql);
query.setFirstResult(0); //开始的索引
query.setMaxResults(10); //每页显示条数
//条件查询
String jpql = "from Consumer where name = ? "; //name是实体类的属性名
Query query = entityManager.createQuery(jpql);
query.setParameter(1,"张三");
Object obj = query.getSingleResult(); //获取单个结果,底层assert期望值为1,必须是一个结果
//排序查询
String jpql = "from Consumer order by id desc";
Query query = entityManager.createQuery(jpql);
List list = query.getResultList();
//聚合函数查询
String jpql = "select count(id) from Consumer";
Query query = entityManager.createEntityManager(jpql);
Object obj = query.getSingleResult();