jpa
使用 IntelliJ IDEA 创建项目,创建时选择 JavaEE Persistence
2.创建成功后,添加依赖jar,由于 Jpa 只是一个规范,因此我们说用Jpa实际上必然是用Jpa的某一种实现,那么是哪一种实现呢?当然就是Hibernate了,所以添加的jar,实际上来自 Hibernate,如下
3.添加实体类
接下来在项目中添加实体类,如下:
@Entity(name = "t_book")
public class Book {
private Long id;
private String name;
private String author;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long getId() {
return id;
}
// 省略其他getter/setter
}
首先@Entity注解表示这是一个实体类,那么在项目启动时会自动针对该类生成一张表,默认的表名为类名,@Entity注解的name属性表示自定义生成的表名。@Id注解表示这个字段是一个id,@GeneratedValue注解表示主键的自增长策略,对于类中的其他属性,默认都会根据属性名在表中生成相应的字段,字段名和属性名相同,如果开发者想要对字段进行定制,可以使用@Column注解,去配置字段的名称,长度,是否为空等等。
- 创建persistence.xml
JPA 规范要求在类路径的 META-INF 目录下放置persistence.xml,文件的名称是固定的
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
<persistence-unit name="NewPersistenceUnit" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<class>org.sang.Book</class>
<properties>
<property name="hibernate.connection.url"
value="jdbc:mysql:///jpa01?useUnicode=true&characterEncoding=UTF-8"/>
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
<property name="hibernate.connection.username" value="root"/>
<property name="hibernate.connection.password" value="123"/>
<property name="hibernate.archive.autodetection" value="class"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
</properties>
</persistence-unit>
</persistence>
- persistence-unit 的name 属性用于定义持久化单元的名字, 必填。
- transaction-type:指定 JPA 的事务处理策略。RESOURCE_LOCAL:默认值,数据库级别的事务,只能针对一种数据库,不支持分布式事务。如果需要支持分布式事务,使用JTA:transaction-type=”JTA”
- class节点表示显式的列出实体类
- properties中的配置分为两部分:数据库连接信息以及Hibernate信息
- 执行持久化操作
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("NewPersistenceUnit");
EntityManager manager = entityManagerFactory.createEntityManager();
EntityTransaction transaction = manager.getTransaction();
transaction.begin();
Book book = new Book();
book.setAuthor("罗贯中");
book.setName("三国演义");
manager.persist(book);
transaction.commit();
manager.close();
entityManagerFactory.close();
这里首先根据配置文件创建出来一个 EntityManagerFactory ,然后再根据 EntityManagerFactory
的实例创建出来一个 EntityManager ,然后再开启事务,调用 EntityManager 中的 persist
方法执行一次持久化操作,最后提交事务,执行完这些操作后,数据库中旧多出来一个 t_book 表,并且表中有一条数据。
关于 JPQL
- JPQL语言,即 Java Persistence Query Language 的简称。JPQL 是一种和 SQL
非常类似的中间性和对象化查询语言,它最终会被编译成针对不同底层数据库的 SQL 查询,从而屏蔽不同数据库的差异。JPQL语言的语句可以是
select 语句、update 语句或delete语句,它们都通过 Query 接口封装执行。 - Query接口封装了执行数据库查询的相关方法。调用 EntityManager 的 createQuery、create
NamedQuery 及 createNativeQuery 方法可以获得查询对象,进而可调用 Query 接口的相关方法来执行查询操作。 - Query接口的主要方法如下:
- int executeUpdate();用于执行update或delete语句。
- List getResultList();用于执行select语句并返回结果集实体列表。
- Object getSingleResult();用于执行只返回单个结果实体的select语句。
- Query setFirstResult(int startPosition);用于设置从哪个实体记录开始返回查询结果。
- Query setMaxResults(int maxResult);用于设置返回结果实体的最大数。与setFirstResult结合使用可实现分页查询。
- Query setFlushMode(FlushModeType flushMode);设置查询对象的Flush模式。参数可以取2个枚举值:FlushModeType.AUTO 为自动更新数据库记录,FlushMode Type.COMMIT 为直到提交事务时才更新数据库记录。
- setHint(String hintName, Object value);设置与查询对象相关的特定供应商参数或提示信息。参数名及其取值需要参考特定 JPA 实现库提供商的文档。如果第二个参数无效将抛出IllegalArgumentException异常。
- setParameter(int position, Object value);为查询语句的指定位置参数赋值。Position 指定参数序号,value 为赋给参数的值。
- setParameter(int position, Date d, TemporalType type);为查询语句的指定位置参数赋 Date 值。Position 指定参数序号,value
为赋给参数的值,temporalType 取 TemporalType 的枚举常量,包括 DATE、TIME 及 TIMESTAMP
三个,,用于将 Java 的 Date
型值临时转换为数据库支持的日期时间类型(java.sql.Date、java.sql.Time及java.sql.Timestamp)。 - setParameter(int position, Calendar c, TemporalType type);为查询语句的指定位置参数赋 Calenda r值。position 指定参数序号,value 为赋给参数的值,temporalType 的含义及取舍同前。
- setParameter(String name, Object value);为查询语句的指定名称参数赋值。
- setParameter(String name, Date d, TemporalType type);为查询语句的指定名称参数赋 Date 值,用法同前。
- setParameter(String name, Calendar c, TemporalType type);为查询语句的指定名称参数设置Calendar值。name为参数名,其它同前。该方法调用时如果参数位置或参数名不正确,或者所赋的参数值类型不匹配,将抛出 IllegalArgumentException 异常。
JPQL 举例
和在 SQL 中一样,JPQL 中的 select 语句用于执行查询。其语法可表示为:select_clause form_clause [where_clause] [groupby_clause] [having_clause] [orderby_clause]
其中:
- from 子句是查询语句的必选子句。
- select 用来指定查询返回的结果实体或实体的某些属性。
- from 子句声明查询源实体类,并指定标识符变量(相当于SQL表的别名)。
- 如果不希望返回重复实体,可使用关键字 distinct 修饰。select、from 都是 JPQL 的关键字,通常全大写或全小写,建议不要大小写混用。
在 JPQL 中,查询所有实体的 JPQL 查询语句很简单,如下:select o from Order o 或 select o from Order as o
这里关键字 as 可以省去,标识符变量的命名规范与 Java 标识符相同,且区分大小写,调用 EntityManager 的
createQuery() 方法可创建查询对象,接着调用 Query 接口的 getResultList() 方法就可获得查询结果集,如下:
Query query = entityManager.createQuery( "select o from Order o");
List orders = query.getResultList();
Iterator iterator = orders.iterator();
while(iterator.hasNext() ) { // 处理Order
}
其他方法的与此类似,这里不再赘述。