什么是JPA?
JPA ( The Java Persistence API )是用于访问,持久化和管理 Java 对象 /类与关系型数据库之间的数据交互的 Java 规范。 JPA 被定义为 EJB ( Enterprise JavaBeans ) 3.0 规范的一部分,作为 EJB 2 CMP 实体 Bean 规范的替代。
注意, JPA 只是一个标准,只定义了一系列接口,而没有具体的实现。很多企业级框架提供了对 JPA 的实现,如 Spring 。因此 Spring 本身与 JPA 无关,只是提供了对 JPA 的支持,因此在 Spring 中你也会看到很多注解都是属于 javax.persistence
包的。
JPA 允许 POJO( Plain Old Java Objects )轻松地持久化,而不需要类来实现 EJB 2 CM P 规范所需的任何接口或方法。 JPA 还允许通过注解或 XML 定义对象的关系映射,定义 Java 类如何映射到关系数据库表。 JPA 还定义了一个运行时 EntityManager
API ,用于处理对象的查询和管理事务。 同时, JPA 定义了对象级查询语言 JPQL,以允许从数据库中查询对象,实现了对数据库的解耦合,提高了程序的可移植性,而不具体依赖某一底层数据库。
JPA 是 Java 持久化规范中的一个最新版本。第一个版本是 OMG 持久性服务 Java 绑定,但这个一个失败的产品,甚至没有任何商业产品支持它。接下来的版本是 EJB 1.0 CMP Entity Beans ,它已经非常成功地被大型 Java EE 提供程序( BEA , IBM )采用,但是它复杂性太高而且性能比较差。 EJB 2.0 CMP 试图通过引入本地接口来减少 Entity Bean 的一些复杂性,但是大多数复杂性仍然存在,而且缺乏可移植性。
历史总是要向前发展的,种种的这些使得 EJB 3.0 规范将降低复杂性作为主要目标,这导致规范委员会沿着 JPA 的路径前进。 JPA 旨在统一 EJB 2 CMP , JDO , Hibernate ,从目前来看, JPA 的确取得了成功。
目前大多数持久化供应商已经发布了 JPA 的实现,并被行业和用户采用。这些包括 Hibernate (由 JBoss 和 Red Hat 收购), TopLink (由 Oracle 收购)和 Kodo JDO (由 BEA 和 Oracle 收购)。其他支持 JPA 的产品包括 Cocobase (由 Thought Inc. 收购)和 JPOX 。
JPA的基本操作语句
//And --- 等价于 SQL 中的 and 关键字,比如 findByHeightAndSex(int height,char sex);
public List<User> findByHeightAndSex(int height,char sex);
// Or --- 等价于 SQL 中的 or 关键字,比如 findByHeightOrSex(int height,char sex);
public List<User> findByHeightOrSex(int height,char sex);
//Between --- 等价于 SQL 中的 between 关键字,比如 findByHeightBetween(int min, int max);
public List<User> findByHeightBetween(int min,int max);
//LessThan --- 等价于 SQL 中的 "<",比如 findByHeightLessThan(int max);
public List<User> findByHeightLessThan(int max);
//GreaterThan --- 等价于 SQL 中的">",比如 findByHeightGreaterThan(int min);
public List<User> findByHeightGreaterThan(int min);
//IsNull --- 等价于 SQL 中的 "is null",比如 findByNameIsNull();
public List<User> findByNameIsNull();
//IsNotNull --- 等价于 SQL 中的 "is not null",比如 findByNameIsNotNull();
public List<User> findByNameIsNotNull();
//NotNull --- 与 IsNotNull 等价;
public List<User> findByNameNotNull();
//Like --- 等价于 SQL 中的 "like",比如 findByNameLike(String name);
public List<User> findByNameLike(String name);
//NotLike --- 等价于 SQL 中的 "not like",比如 findByNameNotLike(String name);
public List<User> findByNameNotLike(String name);
//OrderBy --- 等价于 SQL 中的 "order by",比如 findByNameNotNullOrderByHeightAsc();
public List<User>findByNameNotNullOrderByHeightAsc();
//Not --- 等价于 SQL 中的 "! =",比如 findByNameNot(String name);
public List<User> findByNameNot(String name);
//In --- 等价于 SQL 中的 "in",比如 findByNameIN(String name);
public List<User> findByNameIn(String name);
//NotIn --- 等价于 SQL 中的 "not in",比如 findByNameNotIN(String name);
public List<User> findByNameNotIn(String name);
原生Sql语句
//利用原生的SQL进行查询操作
@Query(value = "select o.* from orders o ,user u where o.uid=u.id and u.name=?1", nativeQuery = true)
@Modifying
public List<Order> findOrderByName(String name);
//利用原生的SQL进行删除操作
@Query(value = "delete from orders where id=?1 ", nativeQuery = true)
@Modifying
public void deleteOrderById(int id);
//利用原生的SQL进行删除操作
@Query(value = "delete from orders where uid=?1 ", nativeQuery = true)
@Modifying
public void deleteOrderByUId(int uid);
//利用原生的SQL进行修改操作
@Query(value = "update orders set name=?1 where id=?2 ", nativeQuery = true)
@Modifying
public void updateOrderName(String name,int id);
//利用原生的SQL进行插入操作
@Query(value = "insert into orders(name,uid) value(?1,?2)", nativeQuery = true)
@Modifying
public void insertOrder(String name,int uid);