`
javakuang
  • 浏览: 2837 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

况家娃Hibernate一步一步学习笔记(01)

阅读更多

  很早就接触过Hibernate,可由于项目组中一直没有对Hibernate调优特别精通的牛人,所以后来做的系统大多因为是遗留系统,最终还是放弃了Hibernate,转而采用JDBC+连接池+Apache dbUtil等灵活的方法,自己控制连接池连接的关闭,使用dbUtil实现批量操作,效率也还是凑合的。今年换了一家公司,做产品,其中大量用到了Hibernate,我也早认为有必要好好学习一下Hibernate,于是把学习的心得帖出来,希望和想学Hibernate的朋友们一起进步,共同成长。老鸟看见我们有什么错误,欢迎斧正,不吝赐教,可千万别笑话我们呵呵。

  好了言归正传,我的第一个HibernateDemo:
  打开Eclipse,我用的是MyEclipse插件,加入【图一】(图一见页尾)所示的jar包到构建路径。注:我用的是Mysql数据库,相应的数据库Jar是mysql-connector-java-5.1.6-bin.jar,可以在MySql网站下载最新版。

1)新建数据库Table

CREATE TABLE `user` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(100) NOT NULL default '',
  `age` int(11) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


注:
    关于Mysql表类型,这里为了方便后期使用事务,用了InnoDB型。下面查到了一点参考,以后再遇到时,再详细探讨。

http://blog.csdn.net/hzsasheng/archive/2007/08/04/1725700.aspx 写道
MyISAM:
这个是Mysql表的默认类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法.与其他存储引擎比较,MyISAM具有检查和修复表格的大多数工具. MyISAM表格可以被压缩,而且它们支持全文搜索.它们不是事务安全的,而且也不支持外键。如果事物回滚将造成不完全回滚,不具有原子性。如果执行大量的SELECT,MyISAM是更好的选择。

InnoDB:
这种类型是事务安全的.它与BDB类型具有相同的特性,它们还支持外键.InnoDB表格速度很快.具有比BDB还丰富的特性,因此如果需要一个事务安全的存储引擎,建议使用它.如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。对于支持事物的InnoDB类型的标,影响速度的主要原因是AUTOCOMMIT默认设置是打开的,而且程序没有显式调用BEGIN 开始事务,导致每插入一条都自动Commit,严重影响了速度。可以在执行sql前调用begin,多条sql形成一个事物(即使autocommit打开也可以),将大大提高性能。

2)新建JavaBean,不要忘记要有一个无参数的默认构造函数。

package com.seeyon.bean;

/**
 * User实体类
 * 
 * @author Kuang.Hs
 * @version <b>V1.0</b> 2008-4-28 下午06:12:13
 */
public class User {

	private Integer id;// 编号

	private String name;// 姓名

	private Integer age;// 年龄

	public Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public User() {
	}

}

3)新建Hibernate 实体类映射文件,注意主键的生成方式。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping     PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"     
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="com.seeyon.bean.User" table="user">
		<id name="id" column="id" type="java.lang.Integer" unsaved-value="null">
			<generator class="native" />
		</id>
		<property name="name" column="name" type="java.lang.String" />
		<property name="age" column="age" type="java.lang.Integer" />
	</class>
</hibernate-mapping>

4)新建Hibernate 的配置文件。

<?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>

	<!-- DB参数 -->
	<property name="connection.username">root</property>
	<property name="connection.url">jdbc:mysql://127.0.0.1/hbnt?useUnicode=true&characterEncoding=utf8</property>
	<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
	<property name="myeclipse.connection.profile">hbnt_mysql</property>
	<property name="connection.password">123456</property>
	<property name="connection.driver_class">
		com.mysql.jdbc.Driver
	</property>
	<property name="hibernate.show_sql">true</property>
	<property name="hibernate.format_sql ">true</property>
	
	<!-- 连接池参数设置 指定使用C3P0,Hibernate默认的连接池有Bug-->
	<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>

	<!-- 连接池详细参数 
		<property name="c3p0.min_size">6</property>
		<property name="c3p0.max_size">60</property>
		<property name="c3p0.timeout">1800</property>
		<property name="c3p0.max_statements">80</property> -->

	<!-- 实体类mapping映射 -->
	<mapping resource="com/seeyon/bean/User.hbm.xml" />

</session-factory>

</hibernate-configuration>

 注:

       useUnicode=true&characterEncoding=utf8 是为了强制连接Mysql时使用UTF-8.

4)MyEclipse默认生成的HibernateSessionFactory 也帖一下吧,熟悉的就不用看了,帖出来主要是为了防止没有此文件给大家产生疑惑。

package com.seeyon.hibernate;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.cfg.Configuration;

/**
 * Configures and provides access to Hibernate sessions, tied to the
 * current thread of execution.  Follows the Thread Local Session
 * pattern, see {@link http://hibernate.org/42.html }.
 */
public class HibernateSessionFactory {

	/** 
	 * Location of hibernate.cfg.xml file.
	 * Location should be on the classpath as Hibernate uses  
	 * #resourceAsStream style lookup for its configuration file. 
	 * The default classpath location of the hibernate config file is 
	 * in the default package. Use #setConfigFile() to update 
	 * the location of the configuration file for the current session.   
	 */
	private static String CONFIG_FILE_LOCATION = "/com/seeyon/hibernate/hibernate.cfg.xml";

	private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();

	private static Configuration configuration = new Configuration();

	private static org.hibernate.SessionFactory sessionFactory;

	private static String configFile = CONFIG_FILE_LOCATION;

	static {
		try {
			configuration.configure(configFile);
			sessionFactory = configuration.buildSessionFactory();
		} catch (Exception e) {
			System.err.println("%%%% Error Creating SessionFactory %%%%");
			e.printStackTrace();
		}
	}

	private HibernateSessionFactory() {
	}

	/**
	 * Returns the ThreadLocal Session instance.  Lazy initialize
	 * the <code>SessionFactory</code> if needed.
	 *
	 *  @return Session
	 *  @throws HibernateException
	 */
	public static Session getSession() throws HibernateException {
		Session session = (Session) threadLocal.get();

		if (session == null || !session.isOpen()) {
			if (sessionFactory == null) {
				rebuildSessionFactory();
			}
			session = (sessionFactory != null) ? sessionFactory.openSession()
					: null;
			threadLocal.set(session);
		}

		return session;
	}

	/**
	 *  Rebuild hibernate session factory
	 *
	 */
	public static void rebuildSessionFactory() {
		try {
			configuration.configure(configFile);
			sessionFactory = configuration.buildSessionFactory();
		} catch (Exception e) {
			System.err.println("%%%% Error Creating SessionFactory %%%%");
			e.printStackTrace();
		}
	}

	/**
	 *  Close the single hibernate session instance.
	 *
	 *  @throws HibernateException
	 */
	public static void closeSession() throws HibernateException {
		Session session = (Session) threadLocal.get();
		threadLocal.set(null);

		if (session != null) {
			session.close();
		}
	}

	/**
	 *  return session factory
	 *
	 */
	public static org.hibernate.SessionFactory getSessionFactory() {
		return sessionFactory;
	}

	/**
	 *  return session factory
	 *
	 *	session factory will be rebuilded in the next call
	 */
	public static void setConfigFile(String configFile) {
		HibernateSessionFactory.configFile = configFile;
		sessionFactory = null;
	}

	/**
	 *  return hibernate configuration
	 *
	 */
	public static Configuration getConfiguration() {
		return configuration;
	}

}

 5)简单准备了一个生成随机用户对象的类,供后面调用。这个大家可以随意实现。

package com.seeyon.common;

import java.util.ArrayList;
import java.util.Random;

import com.seeyon.bean.User;

/**
 * 生成常用名字
 * 
 * @author Kuang.Hs
 * @version <b>V1.0</b> 2008-5-12 下午02:30:28
 */
public class UserFactory {
	private static Random random = new Random();

	private static ArrayList<String> surnameCache = new ArrayList<String>();// 姓缓存

	private static int surnameCacheSize = 0; // surnameCache 长度缓存一下

	private static ArrayList<String> secondNameCache = new ArrayList<String>();// 名缓存

	private static int secondNameCacheSize = 0; // secondNameCache 长度缓存一下

	private static String[] commonNamesTop50 = { "张伟", "王伟", "王芳", "李伟", "王秀英",
			"李秀英", "李娜", "张秀莲", "刘伟", "张敏", "张丽", "王静", "王丽", "李强", "张静", "李敏",
			"王敏", "王磊", "李军", "刘洋", "李静", "王勇", "张勇", "王艳", "李杰", "张磊", "王强",
			"王军", "张杰", "李娟", "张艳", "张涛", "王涛", "李明", "李艳", "王超", "李勇", "王娟",
			"刘杰", "王秀兰", "李霞", "刘敏", "张军", "李丽", "张强", "王平", "王刚", "王杰", "李桂英",
			"刘芳" };// 公安部统计全国常见姓名前50名

	private static int MIN_USER_AGE = 20; // 员工最小年龄

	private static int MAX_USER_AGE = 35; // 员工最大年龄

	/**
	 * 随机返回公安部统计全国常见姓名前50的姓名之1
	 * 
	 * @return 全国常见姓名前50之1(随机)
	 */
	public static String getCommonNameInTop50ByRandom() {
		return commonNamesTop50[random.nextInt(commonNamesTop50.length)];
	}

	/**
	 * 根据全国常见前50姓名生成常见的姓名
	 * 
	 * @return
	 */
	public static String getRandomCommonName() {
		if (surnameCache.size() == 0 || secondNameCache.size() == 0) {
			for (int i = 0; i < commonNamesTop50.length; i++) {
				String name = commonNamesTop50[i];
				surnameCache.add(name.substring(0, 1));
				secondNameCache.add(name.substring(1, name.length()));
				Logger.debug(name + "\t" + surnameCache.get(i) + "\t"
						+ secondNameCache.get(i));
			}
			surnameCacheSize = surnameCache.size();
			secondNameCacheSize = secondNameCache.size();
		}
		return surnameCache.get(random.nextInt(surnameCacheSize))
				+ secondNameCache.get(random.nextInt(secondNameCacheSize));
	}

	/**
	 * 根据全国常见前50姓名生成常见的用户
	 * 
	 * @return
	 */
	public static User getRandomCommonNameUser() {
		User user = new User();
		user.setName(getRandomCommonName());
		if (MIN_USER_AGE > MAX_USER_AGE) {
			int temp = MIN_USER_AGE;
			MIN_USER_AGE = MAX_USER_AGE;
			MAX_USER_AGE = temp;
			Logger.error("参数 MIN_USER_AGE 的值不能比 MAX_USER_AGE 大,已纠正。");
		}
		user.setAge(MIN_USER_AGE + random.nextInt(MAX_USER_AGE - MIN_USER_AGE));
		return user;
	}
}

  6)开始吧,写我了一个Hibernate调用类。

package com.seeyon.part11;

import java.util.Date;
import java.util.Scanner;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

import com.seeyon.bean.User;
import com.seeyon.common.Log4jInit;
import com.seeyon.common.Logger;
import com.seeyon.common.UserFactory;

/**
 * 主线:Hibernate简单插入数据。
 * <p>
 * 扩展:简单插入size条数据,了解Hibernate性能。
 * 
 * @author Kuang.Hs
 * @version <b>V1.2</b> 2008-4-28 下午06:10:26
 */

public class HibernateDemo1 {
	public static int getInputValue() {

		Scanner sc = new Scanner(System.in);
		int value = 0;
		try {
			value = sc.nextInt();
		} catch (RuntimeException e) {
			Logger.error(e);
			System.out.println("輸入有誤,請重新輸入:");
			return getInputValue();
		}

		return value;
	}

	public static void main(String[] args) {

		new Log4jInit().init();

		System.out.println("請輸入要插入數據的條數:");
		int size = getInputValue();

		Date date_start = new Date();
		Logger.info("插入" + size + "条数据的起始时间:" + date_start);

		// Configuration 负责管理 Hibernate配置信息
		Configuration config = new Configuration()
				.configure("/com/seeyon/hibernate/hibernate.cfg.xml");

		// config 建立 SessionFactory
		// SessionFactory 將用於建立 Session
		SessionFactory sessionFactory = config.buildSessionFactory();

		// 开Session,相当于JDBC的Connection
		Session session = sessionFactory.openSession();
		
		// 打开事务
		Transaction tx = session.beginTransaction();

		// 將对象映射至数据库表格中保存
		for (int i = 0; i < size; i++) {
			// 將持久化的物件
			User user = UserFactory.getRandomCommonNameUser();
			session.save(user);
			if (i % 100 == 0) {
				session.flush();
				session.clear();
			}
		}
		
		tx.commit();
		session.close();
		sessionFactory.close();
		Date date_end = new Date();
		Logger.info("插入" + size + "条数据的结束时间:" + date_end);
		Logger.info("插入" + size + "条数据,共耗时:"
				+ (date_end.getTime() - date_start.getTime()) + "ms");

	}
}

 好啦,到此就全部结束啦,运行一下HibernateDemo1 就有结果啦。还是很简单的吧。Hibernate的难,不是难在Api的学习,而是对ORM思想的理解,和性能的调优配置。

  • 描述: 图一
  • 大小: 21.3 KB
分享到:
评论
3 楼 风雪涟漪 2008-05-18  
小况终于搞 HIBERNATE 了。^_^ 坚持下去。
2 楼 wujiekangyun 2008-05-18  
觉得比较基础,期待LZ的高级应用和调优的文章
1 楼 wdlfellow 2008-05-15  
很详细,多谢!

相关推荐

    Hibernate学习笔记

    Hibernate学习笔记 Hibernate学习笔记 Hibernate学习笔记 Hibernate学习笔记

    Hibernate学习笔记整理

    Hibernate学习笔记整理 以下是 Hibernate 框架的详细知识点: Hibernate 介绍 Hibernate 是一个 ORM(Object-Relational Mapping)框架,用于将 Java 对象映射到数据库表中。它提供了一个简洁的方式来访问和操作...

    Hibernate学习笔记特别详细

    《Hibernate学习笔记特别详细》 Hibernate,作为一款开源的Object-Relational Mapping(ORM)框架,为Java开发者提供了强大的数据库操作支持。它简化了数据库访问的复杂性,使得开发人员可以像操作对象一样操作...

    hibernate 学习笔记精要

    hibernate 学习笔记精要hibernate 学习笔记精要hibernate 学习笔记精要hibernate 学习笔记精要

    hibernate学习笔记

    在本篇《Hibernate学习笔记》中,我们将深入探讨Hibernate这一流行的Java对象关系映射(ORM)框架。Hibernate允许开发者以面向对象的方式处理数据库操作,极大地简化了数据存取的复杂性。以下是一些关键知识点: 1....

    Hibernate3 学习笔记.ppt

    【一、O/R Mapping】 O/R Mapping,即对象关系映射,是将对象模型与关系数据库之间进行映射的技术。在Hibernate中,O/R Mapping允许开发者以面向对象的方式...学习和掌握Hibernate有助于提升Java应用的数据管理能力。

    Hibernate 学习笔记(全套)

    这套笔记是我学习Hibernate,进行相关技术点训练时记录下来的,其中包括技术点说明与相关事例,拿出来与大家分享。

    Hibernate_annotation_学习笔记

    Hibernate_annotation_学习笔记 第1课 课程内容 6 第2课 Hibernate UML图 6 第3课 风格 7 第4课 资源 7 第5课 环境准备 7 第6课 第一个示例Hibernate HelloWorld 7 第7课 建立Annotation版本的HellWorld 9 第8课 ...

    hibernate框架开发2016版视频 四天学习笔记完整版

    【hibernate框架开发2016版视频 四天学习笔记完整版】 在软件开发领域,特别是Java Web开发中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它极大地简化了数据库操作,使开发者可以更专注于业务逻辑而不是...

    hibernate个人学习笔记完整版

    【hibernate个人学习笔记完整版】是一份详尽的资料,涵盖了Hibernate框架的基础到高级应用,旨在帮助学习者深入理解和掌握这一强大的Java对象关系映射(ORM)工具。Hibernate作为Java开发中的主流ORM框架,它极大地...

    hibernate4框架学习笔记

    【hibernate4框架学习笔记】 Hibernate是一款强大的ORM(Object-Relational Mapping)框架,它在Java开发中扮演着至关重要的角色,通过提供对象与数据库之间的映射,解决了对象模型和关系模型之间的“阻抗不匹配”...

    hibernate学习笔记01

    ### Hibernate学习笔记01 #### 一、Hibernate简介与安装 **Hibernate** 是一款开源的对象关系映射(Object Relational Mapping, ORM)框架,它能够有效地简化Java应用程序与数据库之间的交互,提供了一种更为优雅...

    hibernate的学习笔记,hibernate所以知识点全,一看就能上手

    hibernate的学习笔记,hibernate所以知识点全,一看就能上手........包含代码和书写格式和图片分析~~~~hibernate的学习笔记,hibernate所以知识点全,一看就能上手........包含代码和书写格式和图片分析~~~~...

    Hibernate学习笔记与总结

    **Hibernate学习笔记与总结** Hibernate 是一款开源的对象关系映射(ORM)框架,它为Java开发者提供了一种在关系数据库上操作对象数据的便捷方式。本文将深入探讨Hibernate的核心概念、配置、实体类、映射文件、...

    Hibernate3.3_学习笔记.doc.zip

    《Hibernate3.3_学习笔记》是一份详细记录了Hibernate3.3版本特性和使用方法的文档,旨在帮助开发者深入理解和应用这一强大的对象关系映射(ORM)框架。Hibernate是Java开发中的一个明星库,它简化了数据库操作,...

    Hibernate学习笔记和资料

    hibernate概述,hibernate入门Demo,hibernate配置文件详解(全局配置,实体类映射配置),配置实体规则,核心API详解(Configuration,sessionFactory,session,Transaction),hibernate中的对象状态以及刷新能缓存机制 ...

    hibernate API帮助文档 及hibernate学习笔记

    这篇文档和学习笔记将深入介绍Hibernate的核心概念、API用法以及最佳实践。 1. **Hibernate核心概念** - **对象关系映射(ORM)**: Hibernate是ORM的一种实现,它允许开发者使用面向对象的方式来操作数据库,而...

    传智播客2016hibernate框架学习笔记

    《传智播客2016 Hibernate框架学习笔记》是一份详实的教程,旨在帮助初学者和进阶者深入理解和掌握Hibernate框架。该资源包含了四天的学习内容,分别是day01、day02、day03和day04,涵盖了从基础到高级的多个主题。...

Global site tag (gtag.js) - Google Analytics