jpa01
JPA
Java Persistence API, 即Java 持久化API
JPA规范本质上就是一种ORM规范,提供了一些编程的API接口,但具体实现则由服务厂商来提供实现。
入门案例
1.创建maven ,导入坐标
2.配置jpa的核心配置文件,创建在META-INFO目录下,persistence.xml
3.编写客户实体类
4.配置实体类和表
5.保存
pom.xml
1 <properties> 2 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 3 <project.hibernate.version>5.0.7.Final</project.hibernate.version> 4 </properties> 5 6 <dependencies> 7 <!-- junit --> 8 <dependency> 9 <groupId>junit</groupId> 10 <artifactId>junit</artifactId> 11 <version>4.12</version> 12 <scope>test</scope> 13 </dependency> 14 15 <!-- hibernate对jpa的支持包 --> 16 <dependency> 17 <groupId>org.hibernate</groupId> 18 <artifactId>hibernate-entitymanager</artifactId> 19 <version>${project.hibernate.version}</version> 20 </dependency> 21 22 <!-- c3p0 --> 23 <dependency> 24 <groupId>org.hibernate</groupId> 25 <artifactId>hibernate-c3p0</artifactId> 26 <version>${project.hibernate.version}</version> 27 </dependency> 28 29 <!-- log日志 --> 30 <dependency> 31 <groupId>log4j</groupId> 32 <artifactId>log4j</artifactId> 33 <version>1.2.17</version> 34 </dependency> 35 36 <!-- Mysql and MariaDB --> 37 <dependency> 38 <groupId>mysql</groupId> 39 <artifactId>mysql-connector-java</artifactId> 40 <version>5.1.6</version> 41 </dependency>
persistence.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0"> 3 4 <!--需要配置persistence-unit节点 5 持久化单元,name 持久化单元名称 6 transaction-type:事务管理方式 7 JTA:分布式事务管理 8 RESOURCE_lOCAL 本地事务管理 9 --> 10 <persistence-unit name="myJpa" transaction-type="RESOURCE_LOCAL"> 11 <!-- -jpa实现方式--> 12 <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 13 14 <!-- 数据库信息--> 15 <properties> 16 <property name="javax.persistence.jdbc.user" value="root"/> 17 <property name="javax.persistence.jdbc.password" value="root"/> 18 <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/> 19 <property name="javax.persistence.jdbc.url" value="jdbc:mysql:///jpa"/> 20 21 <!--配置jpa实现方的(hibernate)的配置信息 22 显示sql false |true 23 create :程序运行时创建数据库,表,有表,先删除 24 update : 程序运行时,如果有表,不会创建表 25 none :不会创建表 26 --> 27 <property name="hibernate.show_sql" value="true"/> 28 <property name="hibernate.hbm2ddl.auto" value="update"/> 29 </properties> 30 <!--可选配置,配置jpa实现方的配置信息--> 31 </persistence-unit> 32 </persistence>
创建domain实体类,jpa注解配置映射关系
实体类和表的映射关系
实体类的属性和表的字段映射关系
@Entity:声明实体类
@Table:声明实体类和表的映射关系 name="表名"
@Id 声明主键
@Column 属性和表字段的映射关系 name="字段名"
@GeneratedValue:配置主键生成策略 @GeneratedValue(strategy = GenerationType.IDENTITY)
GenerationType.IDENTITY :自增,mysql ,底层数据库必须支持自动增长(底层数据库支持的自动增长方式,对id自增)
GenerationType.SEQUENCE : 序列,oracle ,底层数据库必须支持序列
GenerationType.TABLE : jpa提供的一种机制,通过一张数据库表的形式帮助我们完成主键自增
GenerationType.AUTO : 由程序自动的帮助我们选择主键生成策略
Persistence对象主要作用是用于获取EntityManagerFactory对象的 。通过调用该类的createEntityManagerFactory静态方法,根据配置文件中持久化单元名称创建EntityManagerFactory。
EntiryManagerFactory
EntityManagerFactory 接口主要用来创建 EntityManager 实例,是一个线程安全的对象,并且EntityManagerFactory 的创建极其浪费资源,创建时只需要做到一个工程只存在一个EntityManagerFactory 即可
EntityManager
EntityManager是完成持久化操作的核心对象。实体类作为普通 java对象,只有在调用 EntityManager将其持久化后才会变成持久化对象。EntityManager对象在一组实体类与底层数据源之间进行 O/R 映射的管理
通过调用EntityManager的方法完成获取事务,以及持久化数据库的操作
getTransaction : 获取事务对象
persist : 保存操作
merge : 更新操作
remove : 删除操作
find/getReference : 根据id查询
EntityTransaction
EntityTransaction是完成事务操作的核心对象
begin:开启事务
commit:提交事务
rollback:回滚事务
解决实体管理器工厂的浪费资源和耗时问题
通过静态代码块的形式,当程序第一次访问此工具类时,创建一个公共的实体管理器工厂对象
1 public class JpaUtils { 2 3 private static EntityManagerFactory factory; 4 5 static { 6 //1.加载配置文件,创建entityManagerFactory 7 factory = Persistence.createEntityManagerFactory("myJpa"); 8 } 9 /** 10 * 获取EntityManager对象 11 */ 12 public static EntityManager getEntityManager() { 13 return factory.createEntityManager(); 14 } 15 }
save
1 /** 2 * 测试jpa的保存 3 * jpa的操作步骤 4 * 1.加载配置文件创建工厂 5 * 2.通过实体管理类创建实体管理器 6 * 3.获取事务对象开启事务 7 * 4.完成增删改查操作 8 * 5.提交事务 9 * 6.释放资源 10 */ 11 12 @Test 13 public void testSave(){ 14 // EntityManagerFactory factory = Persistence.createEntityManagerFactory("myJpa"); 15 // EntityManager em = factory.createEntityManager(); 16 17 EntityManager em = JpaUtils.getEntityManager(); 18 19 EntityTransaction tx = em.getTransaction(); 20 tx.begin(); 21 Customer customer = new Customer(); 22 customer.setCustName("金立手机"); 23 customer.setCustIndustry("金立"); 24 em.persist(customer); 25 //提交事务 26 tx.commit(); 27 em.close(); 28 // factory.close(); 29 }
Test
1 /** 2 * 根据id查询客户 3 * 通过工具类获取entityManager 4 开启事务 5 增删改差 6 提交事务 7 释放资源 8 */ 9 10 @Test 11 public void testFind(){ 12 EntityManager entityManager = JpaUtils.getEntityManager(); 13 EntityTransaction tx = entityManager.getTransaction(); 14 tx.begin(); 15 16 Customer customer = entityManager.find(Customer.class,1l); 17 System.out.println(customer); 18 19 // entityManager.remove(customer) 20 21 // customer.setCustName("zhangsan"); 22 // entityManager.merge(customer); 23 24 tx.commit(); 25 entityManager.close(); 26 }
fing与getReference
find立即查找
getReference 延迟加载,得到的时一个动态代理对象,不会立即发送sql语句
jpql
Java Persistence Query Language,其特征与原生SQL语句类似,并且完全面向对象,通过类名和属性访问,而不是表名和表的属性。
sql 查询的是表和表中的字段
jpql 查询的是实体类和类中的属性
findall
1 /** 2 * 查询全部 3 * jpql:from com.jpa.domain.Customer 4 * 类的全限定名 5 * sql:select * from cst_customer 6 * 7 * 1.获取entiryManager对象 8 * 2.开启事务 9 * 3.查询全部 10 * 4.提交事务 11 * 5.释放资源 12 */ 13 @Test 14 public void testFindAll(){ 15 EntityManager em = JpaUtils.getEntityManager(); 16 EntityTransaction tx = em.getTransaction(); 17 tx.begin(); 18 String jpal = "from com.jpa.domain.Customer"; 19 Query query = em.createQuery(jpal); 20 21 List list = query.getResultList(); 22 23 for (Object obj :list){ 24 System.out.println(obj); 25 } 26 tx.commit(); 27 em.close(); 28 }
条件查询
/**
* 1.创建query查询对象
* 2.对参数进行赋值
* 3.查询,并得到返回结果
*/
排序查询
1 String jpal = "from Customer order by custId desc"; 2 Query query = em.createQuery(jpal); 3 4 List list = query.getResultList(); 5 6 for (Object obj :list){ 7 System.out.println(obj); 8 }
分页查询
1 String jpal = " from Customer"; 2 Query query = em.createQuery(jpal); 3 4 //起始索引 5 query.setFirstResult(0); 6 //每页查询条数 7 query.setMaxResults(1); 8 9 List list = query.getResultList(); 10 for (Object obj :list){ 11 System.out.println(obj); 12 }
条件查询
1 // sql select * from cst_customer where cust_name like ? 2 String jpal = " from Customer where custName like ? "; 3 Query query = em.createQuery(jpal); 4 query.setParameter(1,"金立%");
完
原文地址:https://www.cnblogs.com/quyangyang/p/11439050.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 使用frp搭建内网穿透
- CNS图表复现03—单细胞区分免疫细胞和肿瘤细胞
- C#记事本项目开发,一个可以实现批量操作的记事本!【附源码】
- Python 库引用问题:name 'json' is not defined,原因及解决办法
- Java集合类之Collection接口,集合的“爸爸”接口了解一下?
- Python 微信机器人-下载微信接收到的语音、图片等资源
- Python源文件打包成可执行的exe应用,给你的代码变个身!
- Python 技术篇-ffmpeg.exe的安装及配置
- Python 库配置问题-"Couldn't find ffmpeg or avconv - defaulting to ffmpeg, but may not work",原因及解决办法
- 小白都能看懂的简单爬虫入门案例剖析(爬虫入门看它就够了!)
- Python 技术篇-音频mp3格式转wav格式,高保真
- Python3 模块
- Python 微信机器人-向好友发送名片、转发名片
- iOS多线程:GCD使用介绍
- 适用于各语言的二分查找算法,你get到了嘛?