• 创建第一个Hiberntae工程


    一.前言

        很久之前已经对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博文里面,会在进行详细的说明。 

  • 相关阅读:
    python 网络爬虫(三)
    python 网络爬虫(二)
    python 网络爬虫(一)
    python 爬虫原理
    (转)栈的生长方向
    CRC校验
    extern关键字
    E
    The Super Powers UVA
    V
  • 原文地址:https://www.cnblogs.com/hongwz/p/5475401.html
Copyright © 2020-2023  润新知