JPA
jpa的概念:
Java Persistence API,即Java 持久化API,是SUN公司推出的一套基于ORM的规范,内部是由一系列的接口和抽象类构成。
ORM思想:
对象关系映射,Object Relational Mapping,将数据库中的字段名与实体类中的属性名对应起来,从而可以通过操作实体类的属性来操作数据库中的字段的效果
Hiberate:
JPA是规范,Hibernate除了作为ORM框架之外,它也是一种JPA实现,如果使用JPA规范进行数据库操作,底层需要hibernate作为其实现类完成数据持久化工作。
pom.xml
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${project.hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-c3p0</artifactId>
<version>${project.hibernate.version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<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
@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....
entityManager.persist(customer);
merge : 更新操作
entityManager.merge(customer); nnnii
remove : 删除操作
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">
<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>
<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();