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" ...
随机推荐
- CentOS7.1 Liberty云平台之Dashboard篇(7)
控制节点: 一.安装及配置Dashboard 1.安装dashboard相关包 yum install openstack-dashboard 2.配置/etc/openstack-dashboard ...
- 使用Unity制作的一个望远镜特效,在狙击手游戏中非经常见
仅仅须要编写一个脚本文件,然后就能随意设置放大缩小的速度.以及程度.
- row_number()over函数的使用(转)
(转)http://hi.baidu.com/122439049/blog/item/0c9c48131b2734d5f7039e13.html row_number() OVER (PARTITIO ...
- swift - UISwitch 的用法
具体代码如下,和oc的使用没有差别: 创建: let hswitch = UISwitch() /*创建开关,以及监听它值的改变,代码如下*/ //开关位置 hswitch.center = CGPo ...
- python2.0_s12_day12_css样式详解
CSScss是英文Cascading Style Sheets的缩写,称为层叠样式表,用于对页面进行美化. CSS 存放方式有三种: 一种写法:在<body></body>内部 ...
- python2.0_s12_day9_协程&多线程和cpu,磁盘io之间的关系
事件驱动和异步io有什么直接关系. 当我们访问一个网页,不考虑网络问题.我们人类不觉得网页慢. 但是实际中对计算机来说还是慢.那慢在哪里.io io操作是整个网络操作中最慢的.比如你打开网页要是有2秒 ...
- OSG绘制金字塔geode+动态纹理坐标
osg::Node* createPyramidModel() { // create the root node which will hold the model. osg::Group* roo ...
- TortoiseSVN中分支和合并实践【转】
使用svn几年了,一直对分支和合并敬而远之,一来是因为分支的管理不该我操心,二来即使涉及到分支的管理,也不敢贸然使用合并功能,生怕合并出了问题对团队造成不良影响,最主要的原因是,自己对分支的目的和合并 ...
- 我们复习.Net的这些日子里
今天是我们复习前面学习的第三天,也是在今天我们结束了复习.之前上学时间感觉知识全是生僻的,在生活中很少用到,因此喜欢重复的记忆,而现在学习的知识全是现在乃至未来,将是每天我们使用的,所以就感觉没必要重 ...
- 如何设置SOLR的高亮 (highlight)?
打开SOLR的核心配置文件: solrconfig.xml 找到 standard request handler 写入以下XML配置代码: <requestHandler name=" ...