一.前言

很久之前已经对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进行配置

  1. <?xml version='1.0' encoding='UTF-8'?>
  2. <!DOCTYPE hibernate-configuration PUBLIC
  3. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
  5. <!-- Generated by MyEclipse Hibernate Tools. -->
  6. <hibernate-configuration>
  7. <session-factory>
  8.  
  9. <!-- 方言:告诉hibernate,所连接的是oracle数据库,需要根据oracle数据库做sql语句优化 -->
  10. <property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
  11.  
  12. <!-- 数据库JDBC连接信息 -->
  13. <property name="connection.url">jdbc:oracle:thin:@127.0.0.1:1521:orcl</property>
  14. <property name="connection.username">hongwz</property>
  15. <property name="connection.password">abc123</property>
  16. <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
  17. <property name="show_sql">true</property>
  18. <property name="format_sql">true</property>
  19. <property name="myeclipse.connection.profile">
  20. my-oracle 12 C
  21. </property>
  22. <!--配置注解-->
  23. <property name="configurationClass">org.hibernate.cfg.AnnotationConfiguration</property>
  24. <!--po映射-->
  25. <mapping class="com.shine.goodsmgr.po.CategoryPO"/>
  26.  
  27. </session-factory>
  28.  
  29. </hibernate-configuration>

五.创建PO简单java对象类

  1. package com.shine.goodsmgr.po;
  2.  
  3. import java.io.Serializable;
  4.  
  5. import javax.persistence.Column;
  6. import javax.persistence.Entity;
  7. import javax.persistence.GeneratedValue;
  8. import javax.persistence.Id;
  9. import javax.persistence.Table;
  10.  
  11. import org.hibernate.annotations.Parameter;
  12.  
  13. /**
  14. * 方法说明:商品类别PO.
  15. */
  16. @Entity
  17. @org.hibernate.annotations.GenericGenerator(name = "seq_category_id", strategy = "sequence", parameters = {
  18. @Parameter(name = "sequence", value = "seq_category_id") })
  19. @Table(name = "CATEGORY")
  20. public class CategoryPO implements Serializable {
  21.  
  22. /**
  23. * 序列化版本.
  24. */
  25. private static final long serialVersionUID = 1L;
  26.  
  27. /**
  28. * 类别id.
  29. */
  30. private Long id;
  31.  
  32. /**
  33. * 类别名称.
  34. */
  35. private String name;
  36.  
  37. public CategoryPO() {
  38. super();
  39. }
  40.  
  41. public CategoryPO(Long id, String name) {
  42. super();
  43. this.id = id;
  44. this.name = name;
  45. }
  46.  
  47. /**
  48. * 获取id.
  49. */
  50. @Id
  51. @GeneratedValue(generator = "seq_category_id")
  52. @Column(name = "ID",precision = 16,scale = 0)
  53. public Long getId() {
  54. return id;
  55. }
  56.  
  57. /**
  58. * 设置id.
  59. */
  60. public void setId(Long id) {
  61. this.id = id;
  62. }
  63.  
  64. /**
  65. * 获取名称.
  66. */
  67. @Column(name = "NAME")
  68. public String getName() {
  69. return name;
  70. }
  71.  
  72. /**
  73. * 设置名称.
  74. */
  75. public void setName(String name) {
  76. this.name = name;
  77. }
  78.  
  79. @Override
  80. public String toString() {
  81. return "商品类别id:"+this.id+",商品类别名称:"+this.name;
  82. }
  83.  
  84. }

 特别说明:对PO,以及注解配置不了解的,可以参考前面的博文,进行学习,在java分类里面。

六. 数据库创建

一般在项目开始之前,要进行数据库的设计,在进行java代码的编写,进行在才能对po类进行编写,java是面向对象的编程,所以java中对象是java 的核心。

  1. --商品类别表
  2. create table category(
  3. id int primary key ,
  4. name varchar2(254) not null
  5. );
  6.  
  7. --商品类别序列
  8. create sequence seq_category_id;
  9.  
  10. --商品表
  11. create table goods(
  12. id int primary key,
  13. name varchar2(254) not null,
  14. price number(6,2) not null,
  15. category int not null,
  16. constraint FK_GOODS_CATEGORY FOREIGN KEY (category) references category(id)
  17. );
  18.  
  19. --商品序列
  20. create sequence seq_goods_id;

七.log4j.properties说明

log4j.properties是在控制台打印hibernate执行的sql以日志,等其他的信息。有兴趣可以去了解一下log4j.properties的具体配置信息。

八.创建HibernateUtil

主要的作用是:把获取Session,关闭Session的方法,获取出来存放在工具类中,方便调用。

  1. /**
  2. * 类说明:Hibernate工具类.
  3. */
  4. public class HibernateUtil {
  5.  
  6. private static SessionFactory factory = null;
  7.  
  8. static{
  9. Configuration configuration = new AnnotationConfiguration(); //创建一个配置器
  10. configuration.configure("com/shine/goodsmgr/config/hibernate.cfg.xml");
  11. factory = configuration.buildSessionFactory(); //构建session工厂
  12. }
  13.  
  14. /**
  15. * 方法说明:获取Session.
  16. */
  17. public static Session openSession(){
  18. return factory.openSession();
  19. }
  20.  
  21. /**
  22. *方法说明:关闭Session.
  23. */
  24. public static void closeSession(Session session){
  25. session.close();
  26. }
  27. }

九.创建测试类,基于junit4的测试

  1. package com.shine.goodsmgr.test;
  2.  
  3. import static org.junit.Assert.assertNotNull;
  4.  
  5. import java.util.HashMap;
  6. import java.util.List;
  7. import java.util.Map;
  8.  
  9. import org.apache.commons.lang3.StringUtils;
  10. import org.hibernate.HibernateException;
  11. import org.hibernate.SQLQuery;
  12. import org.hibernate.Session;
  13. import org.hibernate.Transaction;
  14. import org.hibernate.transform.Transformers;
  15. import org.junit.Before;
  16. import org.junit.Test;
  17.  
  18. import com.shine.goodsmgr.po.CategoryPO;
  19. import com.shine.goodsmgr.utils.HibernateUtil;
  20.  
  21. public class CategoryTest {
  22.  
  23. private Session session = null;
  24.  
  25. @Before
  26. public void setUp() throws Exception {
  27. session = HibernateUtil.openSession();
  28. }
  29.  
  30. @Test
  31. public void testAddCategory() throws Exception{
  32.  
  33. CategoryPO categoryPO = new CategoryPO();
  34. categoryPO.setName("母婴用品");
  35.  
  36. Transaction transaction = null;
  37.  
  38. try{
  39. assertNotNull("商品类别不能为空!", categoryPO);
  40.  
  41. transaction = session.beginTransaction(); //开启事务
  42. Long categoryId = (Long) session.save(categoryPO);
  43. System.out.println("商品类别的id为:"+categoryId);
  44.  
  45. transaction.commit(); //提交事务
  46. }catch (HibernateException e) {
  47. transaction.rollback(); //回滚事务
  48. e.printStackTrace();
  49. }finally{
  50. HibernateUtil.closeSession(session);
  51. }
  52.  
  53. }
  54.  
  55. @Test
  56. public void testLoadCategorts() throws Exception{
  57.  
  58. Transaction transaction = null;
  59.  
  60. try{
  61. transaction = session.beginTransaction();
  62.  
  63. //方法一.
  64. CategoryPO categoryPO = (CategoryPO) session.get(CategoryPO.class, 1L);
  65. System.out.println(categoryPO);
  66.  
  67. }catch (HibernateException e) {
  68. transaction.rollback();
  69. e.printStackTrace();
  70. }finally{
  71. HibernateUtil.closeSession(session);
  72. }
  73.  
  74. }
  75.  
  76. @SuppressWarnings("unchecked")
  77. @Test
  78. public void testGetCategort() throws Exception{
  79.  
  80. Transaction transaction = null;
  81.  
  82. Long id = 1L;
  83. String name = "电子";
  84.  
  85. try{
  86. transaction = session.beginTransaction();
  87.  
  88. StringBuilder sqlSB = new StringBuilder();
  89. sqlSB.setLength(0);
  90. sqlSB.append("SELECT * \n");
  91. sqlSB.append(" FROM CATEGORY \n");
  92. sqlSB.append(" WHERE ID = :ID \n");
  93. sqlSB.append(" AND NAME LIKE :NAME \n");
  94.  
  95. Map<String,Object> map = new HashMap<String,Object>();
  96. if(null != id){
  97. map.put("ID", id);
  98. }
  99. if(StringUtils.isNotBlank(name)){
  100. map.put("NAME", '%'+name+'%');
  101. }
  102.  
  103. SQLQuery query = session.createSQLQuery(sqlSB.toString());
  104. //Hibernate是默认返回对象类型,需要其他类型手动转换为
  105. query.addEntity(CategoryPO.class);
  106. query.setProperties(map);
  107.  
  108. List<CategoryPO> categoryPOs = query.list();
  109.  
  110. for (CategoryPO categoryPO : categoryPOs) {
  111. System.out.println(categoryPO.toString());
  112. }
  113.  
  114. }catch (HibernateException e) {
  115. transaction.rollback();
  116. e.printStackTrace();
  117. }finally{
  118. HibernateUtil.closeSession(session);
  119. }
  120.  
  121. }
  122.  
  123. }

 编写比较匆忙,一些细节没有进行详细的说明,在后面的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. sqlite建表语句(特别是外键问题)

    原创  sqlite建表语句(特别是外键问题) 下面图表示两个表关系: //表1User_invitecreate table User_invite(Invite_id INTEGER PRIMAR ...

  2. 三、jQuery--jQuery插件--jQuery插件——Validation Plugin

    简介: 客户端验证:现代网站填写表单时,几乎一定会采用的方式. 优点:1.可以减少服务器压力 2.缩短用户等待时间和提升用户体验 jQuery有很多表单验证插件:https://plugins.jqu ...

  3. VCC、VDD、VSS、 VEE 和VPP的区别

    在电子电路中,常可以看到VCC.VDD和VSS三种不同的符号,它们有什么区别呢? 一.解释 VCC:C=circuit 表示电路的意思, 即接入电路的电压: VDD:D=device 表示器件的意思, ...

  4. php导出excel封装类

    因为实际情况的需要,导出excel表格在后台开发的过程中会经常用到.下面是我在实际应用中自己整理的一个导出excel类,需要PHPExcel支持,本类很好的完成导出表格的基本样式,保存路径,切换工作薄 ...

  5. Java中读取xml方法

    package zaxiang; import java.io.*; import javax.xml.parsers.DocumentBuilder; import javax.xml.parser ...

  6. logstash之multiline插件,匹配多行日志

    在外理日志时,除了访问日志外,还要处理运行时日志,该日志大都用程序写的,比如log4j.运行时日志跟访问日志最大的不同是,运行时日志是多行,也就是说,连续的多行才能表达一个意思. 在filter中,加 ...

  7. 无废话Android之activity的生命周期、activity的启动模式、activity横竖屏切换的生命周期、开启新的activity获取他的返回值、利用广播实现ip拨号、短信接收广播、短信监听器(6)

    1.activity的生命周期 这七个方法定义了Activity的完整生命周期.实现这些方法可以帮助我们监视其中的三个嵌套生命周期循环: (1)Activity的完整生命周期 自第一次调用onCrea ...

  8. [webkit移动开发笔记]之如何去除android上a标签产生的边框(转)

    转载地址:http://www.cnblogs.com/PeunZhang/archive/2013/02/28/2907708.html 去年年底,做完最后一个项目就可以开开心心回家,可是在测试阶段 ...

  9. 在python中使用concurrent.futures实现进程池和线程池

    #!/usr/bin/env python # -*- coding: utf-8 -*- import concurrent.futures import time number_list = [1 ...

  10. 分佈式事務故障處理暨ORA-24756: transaction does not exist處理

    ORA-24756处理 看到警告日誌一直報ORA-24756錯誤 Errors in file /oracle/admin/NHMIX01/bdump/nhmix01_reco_4959.trc: O ...