一.前言

很久之前已经对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 * \n");
sqlSB.append(" FROM CATEGORY \n");
sqlSB.append(" WHERE ID = :ID \n");
sqlSB.append(" AND NAME LIKE :NAME \n"); 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博文里面,会在进行详细的说明。 

创建第一个Hiberntae工程的更多相关文章

  1. Go入门:创建第一个Go工程

    前言 我是一名iOS开发. 因为公司后台都用的Go. 因为对服务端不了解. 所以想自己学习学习. 环境 因为自己的电脑是mac.然后在阿里云买的是centOS的服务器. 所以下面搭建的环境都是在cen ...

  2. 利用IntelliJ IDEA创建第一个Groovy工程

    因为某些原因,需要学习一下Groovy.关于Groovy的入门教程请看这篇文章http://www.ibm.com/developerworks/cn/education/java/j-groovy/ ...

  3. 终于用scons创建了一个MDK工程

    这几天我在学着怎么使用RT-Thread.起初只想用一下里面的RTGUI,却一直没成功,功力实在不行啊. RT-Thread用了scons来创建工程,似乎还能编译,还有很多可配置项,很是方便.于是我想 ...

  4. UE4 Hello World 创建第一个UE4工程

    首先先熟悉几个UE4常用的类 AGameMode(控制整个项目的逻辑) The GameMode defines the game being played. It governs thegame r ...

  5. Android Things:撸起袖子来创建第一个Things工程

    http://blog.csdn.net/p106786860/article/details/60161020 ——————————————————————————————————————————— ...

  6. VS中创建自定义一个VC工程为基础的开发向导的总结

    作者:朱金灿 来源:http://blog.csdn.net/clever101 VS允许用户进行自定义开发向导.自定义开发向导的好处在于将常用的设置都通过向导生成,从而大大提供开发效率.特别是在开发 ...

  7. 到spring官网创建第一个springboot工程

    登录到spring的官网,直接生成一个,然后倒入本地工程就可以了. https://start.spring.io/ 点击创建的时候. 就等于下载了这个工程. 下载后,倒入到我们的maven工程可以直 ...

  8. 创建第一个django工程

    一.环境搭建 使用anaconda + pycharm的环境. 1.创建虚拟环境并安装django1.8的包 # 创建虚拟环境 conda create -n django python=3.6 # ...

  9. Spring Boot系列教程二:创建第一个web工程 hello world

    一.创建工程 创建名称为"springboot_helloworld"的spring boot工程, new->Spring Starter Project,直接上图     ...

随机推荐

  1. 优化MyBatis配置文件中的配置

    一.为实体类定义别名,简化sql映射xml文件中的引用 之前,我们在sql映射xml文件中的引用实体类时,需要写上实体类的全类名(包名+类名),如下: <!-- 创建用户(Create) --& ...

  2. 【转载】Python编写简易木马程序

    转载来自: http://drops.wooyun.org/papers/4751?utm_source=tuicool 使用Python编写一个具有键盘记录.截屏以及通信功能的简易木马. 首先准备好 ...

  3. Qt Designer 修改窗体大小改变控件位置

    一.新建一个窗体 用qt designer 新建一个QWidget窗体, 在窗体中右键 选择布局, 发现布局是选择不了的,这个是因为窗体里面没有添加控件, 任意添加空间后便可选择 右键-- 布局-- ...

  4. python实现支持并发、断点续传的Ftp程序

    一.要求 1.用户md5认证 2.支持多用户同时登陆(并发) 3.进入用户的命令行模式,支持cd切换目录,ls查看目录子文件 4.执行命令(ipconfig) 5.传输文件: a.支持断点续传 b.传 ...

  5. babyClock 1.0发布(Android2.2以上)

    [总体说明] babyClock是以天为单位,进行提醒的小工具:可以设置多个闹钟,每个闹钟又按照频率分为多个提醒:过期后自动设置到明天该时刻进行提醒. 一个闹钟包含时间区段.提醒频率:进入时间区段时, ...

  6. java compiler level does not match the version of the installed java project

    修改:工程/.settings/”目录下找到名为 org.eclipse.wst.common.project.facet.core.xml

  7. 解决oracle11g 空表不能exp导出的问题

    在使用exp备份数据库,然后使用imp导入的时候出现了好多表或者视图不存在的错误信息. 究其原因,是11G中增加了一个新的特性:数据条数是0时不分配segment,所以就不能被导出. 解决思路:就是向 ...

  8. Linux發送郵件

    1.直接使用shell當編輯器 [root@phburdb1 mail]# mail -s "Hello World" juncai.chen@innolux.comHello j ...

  9. JavaScript - 变量,作用域,内存

    JavaScript 变量可以用来保存两种类型的值:基本类型值和应用类型值.基本类型的值源自以下5种基本数据类型:Undefined.Null.Bollean.Number和String. 所有变量都 ...

  10. C++Primer快速浏览笔记-复合类型

    C++Primer2.3节介绍了两种复合类型:引用和指针 1.引用 引用并非对象,它只是为一个已经存在的对象所起的别名. 一旦初始化完成,引用将和它的初始值对象一直绑定在一起,不能重新绑定到另一个对象 ...