一.前言
很久之前已经对Hibernate有所了解,在项目中进行过简单的应用,基本了解hibernate的简单应用,没有深入的了解,来Shine公司快三个月了,公司的ORM框架就是用Hiberante,只是对Hibernate框架应用都进行了简单的封装,提升开发的效率。今天深入了看了一些Hiberbate基于原生态SQL查询,收获了不少,所以决定搭建一个Hibernate的小应用例子,进行深入的学习。
二.例子说明
这个小例子是基于商品类别、商品两张表进行搭建的,就是一个普通的java工程,项目结构如下图:
三.开发前准备
这个小例子是基于jdk1.7创建的,采用的基于PO的注解来减少Hibernate的配置文件,为什么采用注解的方式,因为以前在项目一直使用的hibernate的配置文件来配置ORM映射的数据的配置文件,但是在企业开发一般都是采用注释的方式来开发,减少配置文件,使用代码结构化清晰,有利于团队开发。
1.创建一个普通的java的工程,在根目录下面,创建两个文件夹,docs、lib,docs一个来存放在文档,里面包含了开发备注说明,数据库创建基本。lib存的是jar包。
2.创建完成工程,我们就应该想到的是下载hiberbate开发所需要的jar包,hibernate-3.2.6.ga.jar是hibernate必须的jar,
这个小例子采用的是注解的方式来开发,所还需要注解所需要的jar包,ejb3-persistence.jar、hibernate-annotations.jar、hibernate-commons-annotations- 3.3.0.ga.jar、hibernate-entitymanager.jar;
其ojdbc7.jar为oracle的驱动jar包;
其他的那几个是为了打印控制台日志所需要的jar。
创建对应的包结构来存放在不同class以及配置文件,本项目比较简单,就 不介绍具体包下对应的class或者配置文件了。
四.hibernate的配置文件说明
在config中创建一个名为:hibernate.cfg.xml的xml文件,对hinernate进行配置
<?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <!-- Generated by MyEclipse Hibernate Tools. --> <hibernate-configuration> <session-factory> <!-- 方言:告诉hibernate,所连接的是oracle数据库,需要根据oracle数据库做sql语句优化 --> <property name="dialect">org.hibernate.dialect.Oracle9Dialect</property> <!-- 数据库JDBC连接信息 --> <property name="connection.url">jdbc:oracle:thin:@127.0.0.1:1521:orcl</property> <property name="connection.username">hongwz</property> <property name="connection.password">abc123</property> <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property> <property name="show_sql">true</property> <property name="format_sql">true</property> <property name="myeclipse.connection.profile"> my-oracle 12 C </property> <!--配置注解--> <property name="configurationClass">org.hibernate.cfg.AnnotationConfiguration</property> <!--po映射--> <mapping class="com.shine.goodsmgr.po.CategoryPO"/> </session-factory> </hibernate-configuration>
五.创建PO简单java对象类
package com.shine.goodsmgr.po; import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; import org.hibernate.annotations.Parameter; /** * 方法说明:商品类别PO. */ @Entity @org.hibernate.annotations.GenericGenerator(name = "seq_category_id", strategy = "sequence", parameters = { @Parameter(name = "sequence", value = "seq_category_id") }) @Table(name = "CATEGORY") public class CategoryPO implements Serializable { /** * 序列化版本. */ private static final long serialVersionUID = 1L; /** * 类别id. */ private Long id; /** * 类别名称. */ private String name; public CategoryPO() { super(); } public CategoryPO(Long id, String name) { super(); this.id = id; this.name = name; } /** * 获取id. */ @Id @GeneratedValue(generator = "seq_category_id") @Column(name = "ID",precision = 16,scale = 0) public Long getId() { return id; } /** * 设置id. */ public void setId(Long id) { this.id = id; } /** * 获取名称. */ @Column(name = "NAME") public String getName() { return name; } /** * 设置名称. */ public void setName(String name) { this.name = name; } @Override public String toString() { return "商品类别id:"+this.id+",商品类别名称:"+this.name; } }
特别说明:对PO,以及注解配置不了解的,可以参考前面的博文,进行学习,在java分类里面。
六. 数据库创建
一般在项目开始之前,要进行数据库的设计,在进行java代码的编写,进行在才能对po类进行编写,java是面向对象的编程,所以java中对象是java 的核心。
--商品类别表 create table category( id int primary key , name varchar2(254) not null ); --商品类别序列 create sequence seq_category_id; --商品表 create table goods( id int primary key, name varchar2(254) not null, price number(6,2) not null, category int not null, constraint FK_GOODS_CATEGORY FOREIGN KEY (category) references category(id) ); --商品序列 create sequence seq_goods_id;
七.log4j.properties说明
log4j.properties是在控制台打印hibernate执行的sql以日志,等其他的信息。有兴趣可以去了解一下log4j.properties的具体配置信息。
八.创建HibernateUtil
主要的作用是:把获取Session,关闭Session的方法,获取出来存放在工具类中,方便调用。
/** * 类说明:Hibernate工具类. */ public class HibernateUtil { private static SessionFactory factory = null; static{ Configuration configuration = new AnnotationConfiguration(); //创建一个配置器 configuration.configure("com/shine/goodsmgr/config/hibernate.cfg.xml"); factory = configuration.buildSessionFactory(); //构建session工厂 } /** * 方法说明:获取Session. */ public static Session openSession(){ return factory.openSession(); } /** *方法说明:关闭Session. */ public static void closeSession(Session session){ session.close(); } }
九.创建测试类,基于junit4的测试
package com.shine.goodsmgr.test; import static org.junit.Assert.assertNotNull; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.lang3.StringUtils; import org.hibernate.HibernateException; import org.hibernate.SQLQuery; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.transform.Transformers; import org.junit.Before; import org.junit.Test; import com.shine.goodsmgr.po.CategoryPO; import com.shine.goodsmgr.utils.HibernateUtil; public class CategoryTest { private Session session = null; @Before public void setUp() throws Exception { session = HibernateUtil.openSession(); } @Test public void testAddCategory() throws Exception{ CategoryPO categoryPO = new CategoryPO(); categoryPO.setName("母婴用品"); Transaction transaction = null; try{ assertNotNull("商品类别不能为空!", categoryPO); transaction = session.beginTransaction(); //开启事务 Long categoryId = (Long) session.save(categoryPO); System.out.println("商品类别的id为:"+categoryId); transaction.commit(); //提交事务 }catch (HibernateException e) { transaction.rollback(); //回滚事务 e.printStackTrace(); }finally{ HibernateUtil.closeSession(session); } } @Test public void testLoadCategorts() throws Exception{ Transaction transaction = null; try{ transaction = session.beginTransaction(); //方法一. CategoryPO categoryPO = (CategoryPO) session.get(CategoryPO.class, 1L); System.out.println(categoryPO); }catch (HibernateException e) { transaction.rollback(); e.printStackTrace(); }finally{ HibernateUtil.closeSession(session); } } @SuppressWarnings("unchecked") @Test public void testGetCategort() throws Exception{ Transaction transaction = null; Long id = 1L; String name = "电子"; try{ transaction = session.beginTransaction(); StringBuilder sqlSB = new StringBuilder(); sqlSB.setLength(0); sqlSB.append("SELECT * "); sqlSB.append(" FROM CATEGORY "); sqlSB.append(" WHERE ID = :ID "); sqlSB.append(" AND NAME LIKE :NAME "); Map<String,Object> map = new HashMap<String,Object>(); if(null != id){ map.put("ID", id); } if(StringUtils.isNotBlank(name)){ map.put("NAME", '%'+name+'%'); } SQLQuery query = session.createSQLQuery(sqlSB.toString()); //Hibernate是默认返回对象类型,需要其他类型手动转换为 query.addEntity(CategoryPO.class); query.setProperties(map); List<CategoryPO> categoryPOs = query.list(); for (CategoryPO categoryPO : categoryPOs) { System.out.println(categoryPO.toString()); } }catch (HibernateException e) { transaction.rollback(); e.printStackTrace(); }finally{ HibernateUtil.closeSession(session); } } }
编写比较匆忙,一些细节没有进行详细的说明,在后面的hibernate博文里面,会在进行详细的说明。