JPA开发总结<二>--代码整理

首先看下使用JPA规范的注解方式模板(代码中解释很详细):

@Entity(name="person")
public class Person {

	//GenerationType为AUTO是权衡mysql和oracle不同,也可以对应具体数据库选择IDENTITY或者SEQUENCE
	@Id @GeneratedValue(strategy=GenerationType.AUTO)
	private Integer id;

	//不能为空就设为false
	@Column(length=10,nullable=false,name="pname")
	private String name;
	//时间类型
	@Temporal(TemporalType.DATE)
	private Date birthday;

	//枚举型举例,EnumType.ORDINAL是将索引值存入数据库
	//@Enumerated枚举类型的性别(必须加上非空约束),设置默认值
	@Enumerated(EnumType.STRING) @Column(length=5,nullable=false)
	private Gender gender = Gender.MAN;

	//存储大文本,二进制数据,数据库字段格式longblob @Lob用于二进制数据  @Basic(fetch=LAZY)延迟初始化该属性,一般用于大数据(超过1M)
	//basic注解作用类似hibernate延迟加载(LAZY),在person没有getFile时不加载此字段,
	//因为其容量太大,占用内存太大,同时,如果在关闭session后getFile也会报懒加载异常
	@Lob @Basic(fetch=FetchType.LAZY)
	private Byte[] file;
	//数据库字段类型为longtext @Lob大文本类型
	@Lob
	private String info;
	//这个注解是不在数据库中映射这个字段 @Transient不持久化这个属性
	@Transient
	private String imagePath;
       <!-- 相应的get set方法省略 -->
}

对于数据库的基本操作方法模板:

	private static EntityManagerFactory factory;
	private static EntityManager em;
	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
		factory = Persistence.createEntityManagerFactory("jpatest1");
		em = factory.createEntityManager();
	}

	@Test
	public void savePerson() {
		em.getTransaction().begin(); //开启事务
		em.persist(new Person("张三")); //持久化对象(相当于Hibernate的save/persist方法)
		em.getTransaction().commit(); //提交事务
		em.close(); //关闭
		factory.close(); //关闭
	}

	@Test
	public void getPerson1() {

		//find() : 根据id得到某个Person对象。相当于Hibernate的get()方法,即时加载
		//如果要找的数据不存在,返回null值
		Person person = em.find(Person.class, 1);
		System.out.println(person.getName());

		//重新刷新数据库中的数据,防止数据被别人修改过
		em.refresh(person);

		em.close(); //关闭
		factory.close(); //关闭
	}

	@Test
	public void getPerson2() {

		//getReference() : 根据id得到某个Person对象.相当于Hibernate的load()方法,延迟加载
		//如果数据不存在,报错
		Person person = em.getReference(Person.class, 1); 

		//如果不调用这句代码,不会从数据库加载数据
		System.out.println(person.getName());

		em.close(); //关闭
		factory.close(); //关闭
	}

	@Test
	public void updatePerson1() {

		em.getTransaction().begin(); //开启事务

		Person person = em.find(Person.class, 1);
		//条件:1.关联事务
		//		2.对象处于托管(managed)状态。 JPA一共四种状态:初始状态 , 托管状态, 游离状态, 删除状态
		person.setName("李四"); //可以修改到数据库

		em.getTransaction().commit(); //提交事务
		em.close(); //关闭
		factory.close(); //关闭
	}

	@Test
	public void updatePerson2() {

		em.getTransaction().begin(); //开启事务
		Person person = em.find(Person.class, 1);
		//将实体管理器中的所有实体变成游离状态
		em.clear();
		//游离状态的数据不能持久化到数据库
		person.setName("王五");
		//把游离态的更新同步回数据库
		em.merge(person);
		em.getTransaction().commit(); //提交事务
		em.close(); //关闭
		factory.close(); //关闭
	}

	@Test
	public void deletePerson1() {

		em.getTransaction().begin(); //开启事务
		Person person = em.find(Person.class, 1);
		//删除某个实体
		em.remove(person);
		em.getTransaction().commit(); //提交事务
		em.close(); //关闭
		factory.close(); //关闭
	}
	//这里注意jpql操作的数据库名和字段名是类名字,不是自定义到数据库的名字
	@Test
	public void jpqlQuery() {

		Query query = em.createQuery("select o from person o where o.id = ?1");
		query.setParameter(1, 1);
//		query.getResultList(); //等同于Hibernate的list()方法
		Person person = (Person)query.getSingleResult();
		System.out.println(person.getName());
//		Query query2 = em.createQuery("select count(0) from Person o");
//		query2.getSingleResult(); //等同于Hibernate的uniqueResult()方法

		em.close(); //关闭
		factory.close(); //关闭
	}

	@Test
	public void deleteQuery() {
		em.getTransaction().begin(); //开启事务

		Query query = em.createQuery("delete from person o where o.id = ?1");
		query.setParameter(1, 2);
		//删除的更新方法,没有它立即刷新看不到数据删除
		query.executeUpdate();

		em.getTransaction().commit(); //提交事务
		em.close(); //关闭
		factory.close(); //关闭
	}

	@Test
	public void updateQuery() {
		em.getTransaction().begin(); //开启事务

		Query query = em.createQuery("update person o set o.name=:name where o.id = ?1");
		query.setParameter("name", "赵六");
		query.setParameter(1, 1);
		//删除的更新方法
		query.executeUpdate();

		em.getTransaction().commit(); //提交事务
		em.close(); //关闭
		factory.close(); //关闭
	}

最后再次附上META-INF目录下的persistence.xml文件配置:

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
   version="1.0">
   <!-- 持久化单元名字name=jpatest1,这个和前面createEntitymanagerFactory名字一致 -->
   <persistence-unit name="jpatest1" transaction-type="RESOURCE_LOCAL">
      <properties>
			<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
			<property name="hibernate.max_fetch_depth" value="3" />
			<property name="hibernate.connection.driver_class" value="org.gjt.mm.mysql.Driver"/>
			<property name="hibernate.connection.username" value="root" />
			<property name="hibernate.connection.password" value="123456" />
			<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/jpa?useUnicode=true&characterEncoding=UTF-8" />
			<property name="hibernate.show_sql" value="true" />
			<property name="hibernate.hbm2ddl.auto" value="update" />
			<property name="hibernate.format_sql" value="true" />
		</properties>
   </persistence-unit>
</persistence>

JPA开发最基本的操作配置信息就全了,下一步就是对一对多,一对一,多对多的配置作介绍。

时间: 2024-10-20 06:11:53

JPA开发总结<二>--代码整理的相关文章

微信公众平台开发(二) 微信公众平台示例代码分析

原文地址:http://www.cnblogs.com/mchina/archive/2013/06/07/3120592.html 一.摘要 微信公众平台提供了一个简单的php示例代码,在做进一步开发之前,我们有必要将其详细了解一下. 二.获取代码 微信官网:http://mp.weixin.qq.com/mpres/htmledition/res/wx_sample.zip 三.分析代码 完整代码如下: <?php /** * wechat php test */ //define your

Photon Server 实现注册与登录(二) --- 服务端代码整理

一.有的代码前端和后端都会用到.比如一些请求的Code.使用需要新建项目存放公共代码. 新建项目Common存放公共代码: EventCode :存放服务端自动发送信息给客户端的code OperationCode : 区分请求和响应 ReturnCode : 服务端响应码 ParameterCode : 解析参数Toos/DicTool.cs : 数据基本上都是用Dictionary读取,这里工具话一下. 二.代码 Toos/DicTool.cs using System.Collection

文顶顶iOS开发博客链接整理及部分项目源代码下载

文顶顶iOS开发博客链接整理及部分项目源代码下载 网上的iOS开发的教程很多,但是像cnblogs博主文顶顶的博客这样内容图文并茂,代码齐全,示例经典,原理也有阐述,覆盖面宽广,自成系统的系列教程却很难找.如果你是初学者,在学习了斯坦福iOS7公开课和跟着文顶顶的博客做项目之后,最快只需要2个月时间,就基本可以独立完成iOS App的开发工作.有经验的开发者也可以在该博客中寻找代码片段进行学习借鉴,必有所收获. 在此也向@文顶顶 表示严重感谢! 由于文顶顶博客博文繁多,每次找文章需要频繁的翻页,

JPA开发入门实例

一. 什么是JPA JPA是sun官方提出的Java持久化规范, 它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据, 它的出现主要是为了简化现有的持久化开发工作和整合ORM技术. JPA总体思想和现有的Hibernate.TopLink等ORM框架大体一致. 总的来说, JPA包括以下3方面的技术: 1. ORM映射元数据(JPA支持XML和注解两种元数据的形式) - 元数据描述对象和表之间的映射关系. 2. Java持久化API: 用来操作实体对象, 执行CRUD

SQL开发技巧(二)

本系列文章旨在收集在开发过程中遇到的一些常用的SQL语句,然后整理归档,本系列文章基于SQLServer系列,且版本为SQLServer2005及以上…… 文章系列目录 SQL开发技巧(一) SQL开发技巧(二) 本文内容简介 这篇文章主要介绍以下内容: 快速查询表的总记录数 非递归查询树形结构表的所有子节点 清除查询缓存 编程中构建Where语句的小技巧 如何进行跨服务器的数据库查询 快速查询表的总记录数 什么,你还在用select count(*) from xxx?难道没有园友告诉你用se

JPA开发总结&lt;一&gt;

什么是JPA JPA(Java Persistence API)是Sun官方提出的Java持久化规范,它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据.它的出现主要是为了简化现有的持久化开发工作和整合ORM技术,结束现在HIbernate.TopLink.JDO等ORM框架各自为营的局面.值得注意的是,JPA是在充分吸收了现有HIbernate.TopLink.JDO等ORM框架的基础上发展而来的(JPA的开发就是Hibernate的创始人做的),具有易于使用.伸缩

Spring Data JPA开发手册——1.介绍

<Spring Data JPA开发手册--1.介绍> 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 我发现网上几乎没有讲述Spring Data JPA原理的文章,很多Guide一上来就是如何配置,接着就是几大段代码,没有一篇文章能把Spring Data JPA原理及构成说清楚的.所以,我写了这个系列的文章. 用Java Persistence API库创建持久层是很繁琐的,也很耗时,而且需要大量的样板代码.我们可以通过以下步骤消除一些样板代

JPA开发

什么是JPA: JPA(Java Persistence API)是Sun官方提出的Java持久化规范.它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据.他的出现主要是为了简化现有的持久化开发工作和整合ORM技术,结束现在Hibernate.TopLink等ORM框架各自为营的局面.值得注意的是,JPA是在充分吸收了现有Hibernate.TopLink等ORM框架的基础上发展而来的,具有易于使用.伸缩性强等优点.从目前的开发社区的反应上看,JPA受到了极大的支持和

SQL开发技巧(二) 【转】感觉他写的很好

本文转自: http://www.cnblogs.com/marvin/p/DevelopSQLSkill_2.html 本系列文章旨在收集在开发过程中遇到的一些常用的SQL语句,然后整理归档,本系列文章基于SQLServer系列,且版本为SQLServer2005及以上…… 文章系列目录 SQL开发技巧(一) SQL开发技巧(二) 本文内容简介 这篇文章主要介绍以下内容: 快速查询表的总记录数 非递归查询树形结构表的所有子节点 清除查询缓存 编程中构建Where语句的小技巧 如何进行跨服务器的