002-原始jpa以及基本加载过程,基本sql使用
一、概述
1.1、创建
public void createMethod() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("");
EntityManager manager = factory.createEntityManager();
manager.getTransaction().begin();// 开始事务
manager.persist(new Object());
manager.getTransaction().commit();
manager.close();
factory.close();
}
1.2、查询
// 立即加载
public void getMethod() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("");
EntityManager manager = factory.createEntityManager();
Object object = manager.find(Object.class, 1);
System.out.println(object);// 如果Object是null,没有异常打印null
manager.close();
factory.close();
} // 延迟加载
public void getMethod2() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("");
EntityManager manager = factory.createEntityManager();
// 延迟加载,不立即返回,返回一个代理对象,只有读取对象具体属性时,才返回具体对象
Object object = manager.getReference(Object.class, 1);
// 如果数据库没有object,在读取属性是出现异常
// object.getName();
manager.close();
// 关闭后再读取有问题
// object.getName();
factory.close();
}
1.3、更新
public void updateMethod() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("");
EntityManager manager = factory.createEntityManager();
manager.getTransaction().begin();// 开始事务
Object object = manager.find(Object.class, 1);
object,setName("测试");
manager.getTransaction().commit();
manager.close();
factory.close();
// 四种 实体状态:new新建状态; managed托管状态,能够被更新【托管状态,被事务管理】,放到jdbc批处理中,commit之后开始提交;游离状态【托管】;删除状态
}
public void updateMethod2() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("");
EntityManager manager = factory.createEntityManager();
manager.getTransaction().begin();// 开始事务
Object object = manager.find(Object.class, 1);
manager.clear();//把实体管理器中的所有实体变成游离状态,此时提交;不会被更新,需要做以下处理
object,setName("测试");
manager.merge(object);//把实体放入实体管理器中,再次提交可以被更新
manager.getTransaction().commit();
manager.close();
factory.close();
// 四种 实体状态:new新建状态; managed托管状态,能够被更新【托管状态,被事务管理】,放到jdbc批处理中,commit之后开始提交;游离状态【托管】;删除状态
}
1.4、删除
public void deleteMethod() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("");
EntityManager manager = factory.createEntityManager();
manager.getTransaction().begin();// 开始事务
Object object = manager.find(Object.class, 1);
manager.remove(object);
manager.getTransaction().commit();
manager.close();
factory.close();
}
二、基本加载过程
EntityManagerFactory factory = Persistence.createEntityManagerFactory("");
查看:Persistence,javax.persistence.Persistence,其中:createEntityManagerFactory代码如下
public static EntityManagerFactory createEntityManagerFactory(String persistenceUnitName, Map properties) {
EntityManagerFactory emf = null;
List<PersistenceProvider> providers = getProviders();//1
for ( PersistenceProvider provider : providers ) {
emf = provider.createEntityManagerFactory( persistenceUnitName, properties );//2
if ( emf != null ) {
break;
}
}
if ( emf == null ) {
throw new PersistenceException( "No Persistence provider for EntityManager named " + persistenceUnitName );
}
return emf;
}
对于1句,
private static List<PersistenceProvider> getProviders() {
return PersistenceProviderResolverHolder
.getPersistenceProviderResolver()
.getPersistenceProviders();
}
查看代码,查看PersistenceProviderResolverHolder的私有静态类CachingPersistenceProviderResolver,其中读取
Enumeration<URL> resources = cl.getResources( "META-INF/services/" + PersistenceProvider.class.getName() );
对于第二句
provider.createEntityManagerFactory(
选择任意一个持久化接口创建
三、sql语句的使用【增删改查】
public void sqlQueryMethod() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("");
EntityManager manager = factory.createEntityManager();
// 面向对象查询语句
// 位置参数
Query query = manager.createQuery("selet o from Person o where o.id=?1");
query.setParameter(1, 222);
// 类型参数
// Query query2 = manager.createQuery("selet o from Person o where o.id=:id");
// query2.setParameter("id", 222);
List resultList = query.getResultList();
//如果只有一个值
//query.getSingleResult();
manager.close();
factory.close();
}
public void sqlDeleteMethod() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("");
EntityManager manager = factory.createEntityManager();
manager.getTransaction().begin();// 开始事务
// 面向对象查询语句
// 位置参数
Query query = manager.createQuery("delete from Person o where o.id=?1");
query.setParameter(1, 222);
query.executeUpdate();
manager.getTransaction().commit();
manager.close();
factory.close();
}
public void sqlUpdateMethod() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("");
EntityManager manager = factory.createEntityManager();
manager.getTransaction().begin();// 开始事务
// 面向对象查询语句
// 位置参数
Query query = manager.createQuery("update Person 0 set o.name=:name where o.id=:id");
query.setParameter("name", "zahangsan");
query.setParameter("id", 11);
query.executeUpdate();
manager.getTransaction().commit();
manager.close();
factory.close();
}
份
002-原始jpa以及基本加载过程,基本sql使用的更多相关文章
- JPA数据懒加载LAZY配合事务@Transactional使用(三)
上篇博文<JPA数据懒加载LAZY和实时加载EAGER(二)>讲到,如果使用懒加载来调用关联数据,必须要保证主查询session(数据库连接会话)的生命周期没有结束,否则,你是无法抽取到数 ...
- Dubbo源码分析之ExtensionLoader加载过程解析
ExtensionLoader加载机制阅读: Dubbo的类加载机制是模仿jdk的spi加载机制: Jdk的SPI扩展加载机制:约定是当服务的提供者每增加一个接口的实现类时,需要在jar包的META ...
- Spring Framework框架解析(1)- 从图书馆示例来看xml文件的加载过程
引言 这个系列是我阅读Spring源码后的一个总结,会从Spring Framework框架的整体结构进行分析,不会先入为主的讲解IOC或者AOP的原理,如果读者有使用Spring的经验再好不过.鉴于 ...
- 第42天学习打卡(Class类 Class类的常用方法 内存分析 类的加载过程 类加载器 反射操作泛型 反射操作注解)
Class类 对象照镜子后得到的信息:某个类的属性.方法和构造器.某个类到底实现了哪些接口.对于每个类而言,JRE都为其保留一个不变的Class类型的对象.一个Class对象包含了特定某个结构(cla ...
- 工厂模式模拟Spring的bean加载过程
一.前言 在日常的开发过程,经常使用或碰到的设计模式有代理.工厂.单例.反射模式等等.下面就对工厂模式模拟spring的bean加载过程进行解析,如果对工厂模式不熟悉的,具体可以先去学习一下工厂 ...
- linux内核启动以及文件系统的加载过程
Linux 内核启动及文件系统加载过程 当u-boot 开始执行 bootcmd 命令,就进入 Linux 内核启动阶段.普通 Linux 内核的启动过程也可以分为两个阶段.本文以项目中使用的 lin ...
- Inside Flask - flask 扩展加载过程
Inside Flask - flask 扩展加载过程 flask 扩展(插件)通常是以 flask_<扩展名字> 为扩展的 python 包名,而使用时,可用 import flask. ...
- web.xml 的加载过程
初始化过程: 在启动Web项目时,容器(比如Tomcat)会读web.xml配置文件中的两个节点<listener>和<contex-param>. 接着容器会创建一个Serv ...
- Browser默认书签加载过程
Browser配置默认书签——string.xml中<string-array name="bookmarks" translatable="false" ...
随机推荐
- Java精选笔记_Filter(过滤器)
Filter(过滤器) Filter入门 什么是Filter Filter被称作过滤器或者拦截器,其基本功能就是对Servlet容器调用Servlet的过程进行拦截,从而在Servlet进行响应处理前 ...
- ssh&scp指定密钥
scp时指定密钥: scp -P22 -r -i ~/.ssh/dongjing-shanghai.pem root@kiri_pro01:/data/backup/back_from_japan ...
- Bash Shell 里的各种括号
天在 SegmentFault 上看到又有人问起关于Shell里各种括号的问题.对于很多玩Shell的人,括号是个很尴尬的问题,用起来没问题,说起来不明白,我在这里总结一下Bash Shell几种括号 ...
- OnGlobalLayoutListener用法
1.implements ViewTreeObserver.OnGlobalLayoutListener{} 2.mContentView.getViewTreeObserver().addOnGlo ...
- DiscuzX的目录权限设置1
经常有朋友遇到Discuz目录权限设置出错的问题,网上千奇百怪的教程非常多,所谓的终极安全的教程更是满天飞,各种所谓的安全加强软件也随处可见,可实际过程中发现,老手用不上,新手则只会因为这些东西徒增麻 ...
- discuz x 系列目录结构说明
api ┄┄┄外部接口 connect ┄┄┄腾讯互联 db ┄┄┄UCenter数据库备份接口 google ┄┄┄Google引擎使用 javascript ┄┄┄数据和广告的 J ...
- js里面进行位运算时候的注意事项
&(按位与):两个操作数都是1就是1 任何数与1按位与的出来的都是其二进制最后一位:任何数与0按位与都是0|(按位或):两个操作数一个是1就是1 任何数与0按位或都是其本身^(按位异或):两个 ...
- IOS实例方法和类方法的区别
类方法和实例方法 实例方法是— 类开头是+ 实例方法是用实例对象访问,类方法的对象是类而不是实例,通常创建对象或者工具类. 在实例方法里,根据继承原理发送消息给self和super其实都是发送给s ...
- poj_2553 强连通分支&出度为0的点
题目大意 N个点的有向图中,定义“好点”为: 从该点v出发可以到达的所有点u,均有一条路径使得u可达v. 求出图中所有的“好点”,并按照顺序从小到大输出出来. 题目分析 图存在多个强连通分支,强连通分 ...
- Delphi使用ADO连接网络数据库,断网后重连问题
原始文章: https://blog.csdn.net/blog_jihq/article/details/11737699# 使用TADOConnection对象连接网络数据库(以MySQL为例), ...