HiberNate学习-1入门

一、Hibernate必须包(3.2)
hibernate3.jar:Hibernate的核心库
cglib-2.1.3.jar:
Hibernate用它来实现PO字节码的动态生成,非常核心的库

asm.jar:cglib所使用的库
asm-attrs.jar:
cglib所使用的库
dom4j-1.6.1.jar:Hibernate用它来读写配置文件
commons-logging-1.0.4.jar:用于日志管理
commons-collections-2.1.1.jar:
包含了一些Apache开发的集合类,功能比java.util.*强大
antlr-2.7.6.jar:是语法分析生成器

 

二、配置hibernate.cfg.xml

Hibernate.cfg.xml代码 复制代码 收藏代码
  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. <hibernate-configuration>
  6. <session-factory>
  7. <property name="dialect">
  8. org.hibernate.dialect.MySQLDialect
  9. </property>
  10. <property name="connection.url">
  11. jdbc:mysql://localhost:3306/jpa?useUnicode=true&amp;characterEncoding=UTF-8
  12. </property>
  13. <property name="connection.username">root</property>
  14. <property name="connection.password">root</property>
  15. <property name="connection.driver_class">
  16. com.mysql.jdbc.Driver
  17. </property>
  18. <!-- hibernate属性 -->
  19. <!-- 是否显示执行的sql语句 -->
  20. <property name="show_sql">true</property>
  21. <!-- 显示执行的sql语句是否格式化 -->
  22. <property name="format_sql">true</property>
  23. <!-- 根据配置文件创建表 -->
  24. <property name="hbm2ddl.auto">update</property>
  25. <mapping resource="com/tao/hibernate/Student.hbm.xml"/>
  26. </session-factory>
  27. </hibernate-configuration>
<?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">

<hibernate-configuration>

	<session-factory>
		<property name="dialect">
			org.hibernate.dialect.MySQLDialect
		</property>
		<property name="connection.url">
			jdbc:mysql://localhost:3306/jpa?useUnicode=true&amp;characterEncoding=UTF-8
		</property>
		<property name="connection.username">root</property>
		<property name="connection.password">root</property>
		<property name="connection.driver_class">
			com.mysql.jdbc.Driver
		</property>

		<!-- hibernate属性 -->
		<!-- 是否显示执行的sql语句 -->
		<property name="show_sql">true</property>
		<!-- 显示执行的sql语句是否格式化 -->
		<property name="format_sql">true</property>
		<!-- 根据配置文件创建表 -->
		<property name="hbm2ddl.auto">update</property>
		
		<mapping resource="com/tao/hibernate/Student.hbm.xml"/>

	</session-factory>

</hibernate-configuration>

 

三、配置ORM映射

1.创建java类

Student.java代码 复制代码 收藏代码
  1. package com.tao.hibernate;
  2. import java.io.Serializable;
  3. @SuppressWarnings("serial")
  4. public class Student implements Serializable {
  5. private Integer id;
  6. private String name;
  7. public Student() {
  8. super();
  9. }
  10. public Integer getId() {
  11. return id;
  12. }
  13. public void setId(Integer id) {
  14. this.id = id;
  15. }
  16. public String getName() {
  17. return name;
  18. }
  19. public void setName(String name) {
  20. this.name = name;
  21. }
  22. }
package com.tao.hibernate;

import java.io.Serializable;

@SuppressWarnings("serial")
public class Student implements Serializable {
	private Integer id;
	private String name;

	public Student() {
		super();
	}

	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;
	}
}

2.配置表映射文件

Student.hbm.xml代码 复制代码 收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  4. <hibernate-mapping>
  5. <class name="com.tao.hibernate.Student" table="student" schema="jpa">
  6. <id name="id" type="java.lang.Integer" column="id">
  7. <generator class="identity" />
  8. </id>
  9. <property name="name" type="java.lang.String">
  10. <column name="name" length="16" />
  11. </property>
  12. </class>
  13. </hibernate-mapping>
<?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.tao.hibernate.Student" table="student" schema="jpa">
		<id name="id" type="java.lang.Integer" column="id">
			<generator class="identity" />
		</id>
		<property name="name" type="java.lang.String">
			<column name="name" length="16" />
		</property>
	</class>
</hibernate-mapping>

注:映射文件已经在二中加入了。如果没有加入,自己手动加入。

四、数据操作类

Java代码 复制代码 收藏代码
  1. package com.tao.hibernate;
  2. import java.util.List;
  3. import org.hibernate.Query;
  4. import org.hibernate.Session;
  5. import org.hibernate.SessionFactory;
  6. import org.hibernate.Transaction;
  7. import org.hibernate.cfg.Configuration;
  8. publicclass StudentDAO {
  9. private Session session = null;
  10. public StudentDAO() {
  11. //创建一个Configuration对象,此时Hibernate会默认加载classpath中的配置文件hibernate.properties
  12. //<span style="color: rgb(0, 0, 0); font-size: x-small;">configura()方法:用于告诉Hibernate加载hibernate.cfg.xml文件。</span>
  13. Configuration config = new Configuration().configure();
  14. SessionFactory factory = config.buildSessionFactory();
  15. session = factory.openSession();
  16. }
  17. publicvoid save(Student student) {
  18. Transaction tran = session.getTransaction();
  19. tran.begin();
  20. session.save(student);
  21. tran.commit();
  22. }
  23. publicvoid update(Student student) {
  24. Transaction tran = session.beginTransaction();
  25. tran.begin();
  26. session.update(student);
  27. tran.commit();
  28. }
  29. publicvoid delete(Integer id) {
  30. String hql = "delete from Student o where o.id = ?";
  31. Transaction tran = session.beginTransaction();
  32. tran.begin();
  33. Query query = session.createQuery(hql);
  34. query.setParameter(0, id);
  35. query.executeUpdate();
  36. tran.commit();
  37. }
  38. @SuppressWarnings("unchecked")
  39. public Student getModel(Integer id) {
  40. String hql = "from Student o where id = :id";
  41. Query query = session.createQuery(hql);
  42. query.setParameter("id", id);
  43. List list = query.list();
  44. if (list != null && list.size() == 1) {
  45. return (Student) list.get(0);
  46. } else {
  47. returnnull;
  48. }
  49. }
  50. @SuppressWarnings("unchecked")
  51. public List getPagination(int maxResults, int firstResult) {
  52. String hql = "from Student o";
  53. Query query = session.createQuery(hql);
  54. query.setFirstResult(firstResult);
  55. query.setMaxResults(maxResults);
  56. return query.list();
  57. }
  58. }
package com.tao.hibernate;

import java.util.List;

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

public class StudentDAO {
	private Session session = null;

	public StudentDAO() {
                //创建一个Configuration对象,此时Hibernate会默认加载classpath中的配置文件hibernate.properties
                //configura()方法:用于告诉Hibernate加载hibernate.cfg.xml文件。

		Configuration config = new Configuration().configure();
		SessionFactory factory = config.buildSessionFactory();
		session = factory.openSession();
	}

	public void save(Student student) {
		Transaction tran = session.getTransaction();
		tran.begin();
		session.save(student);
		tran.commit();
	}

	public void update(Student student) {
		Transaction tran = session.beginTransaction();
		tran.begin();
		session.update(student);
		tran.commit();
	}

	public void delete(Integer id) {
		String hql = "delete from Student o where o.id = ?";
		Transaction tran = session.beginTransaction();
		tran.begin();
		Query query = session.createQuery(hql);
		query.setParameter(0, id);
		query.executeUpdate();
		tran.commit();
	}

	@SuppressWarnings("unchecked")
	public Student getModel(Integer id) {
		String hql = "from Student o where id = :id";
		Query query = session.createQuery(hql);
		query.setParameter("id", id);
		List list = query.list();
		if (list != null && list.size() == 1) {
			return (Student) list.get(0);
		} else {
			return null;
		}
	}

	@SuppressWarnings("unchecked")
	public List getPagination(int maxResults, int firstResult) {
		String hql = "from Student o";
		Query query = session.createQuery(hql);
		query.setFirstResult(firstResult);
		query.setMaxResults(maxResults);
		return query.list();
	}
}

 

五、测试代码类

Java代码 复制代码 收藏代码
  1. package com.tao.hibernate;
  2. import java.util.List;
  3. publicclass Test {
  4. @SuppressWarnings("unchecked")
  5. publicstaticvoid main(String[] args) {
  6. StudentDAO dao = new StudentDAO();
  7. // 添加
  8. // for (int i = 0; i < 10; i++) {
  9. // Student student = new Student();
  10. // student.setName("Tao" + i);
  11. // dao.save(student);
  12. // }
  13. // 删除
  14. // dao.delete(2);
  15. // 修改
  16. // Student student = new Student();
  17. // student.setId(4);
  18. // dao.update(student);
  19. // 单个查询
  20. // Student s = dao.getModel(4);
  21. // System.out.println(s.getName());
  22. // 分布查询
  23. List list = dao.getPagination(4, 1);
  24. for (int i = 0; i < list.size(); i++) {
  25. Student std = (Student) list.get(i);
  26. System.out.println(std.getName());
  27. }
  28. }
  29. }

Hibernate SQL方言 (hibernate.dialect)

如果出现如下错误,则可能是Hibernate SQL方言 (hibernate.dialect)设置不正确。
Caused by: java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]'last_insert_id' 不是可以识别的 函数名。

RDBMS 方言
DB2 org.hibernate.dialect.DB2Dialect
DB2 AS/400 org.hibernate.dialect.DB2400Dialect
DB2 OS390 org.hibernate.dialect.DB2390Dialect
PostgreSQL org.hibernate.dialect.PostgreSQLDialect
MySQL org.hibernate.dialect.MySQLDialect
MySQL with InnoDB org.hibernate.dialect.MySQLInnoDBDialect
MySQL with MyISAM org.hibernate.dialect.MySQLMyISAMDialect
Oracle (any version) org.hibernate.dialect.OracleDialect
Oracle 9i/10g org.hibernate.dialect.Oracle9Dialect
Sybase org.hibernate.dialect.SybaseDialect
Sybase Anywhere org.hibernate.dialect.SybaseAnywhereDialect
Microsoft SQL Server org.hibernate.dialect.SQLServerDialect
SAP DB org.hibernate.dialect.SAPDBDialect
Informix org.hibernate.dialect.InformixDialect
HypersonicSQL org.hibernate.dialect.HSQLDialect
Ingres org.hibernate.dialect.IngresDialect
Progress org.hibernate.dialect.ProgressDialect
Mckoi SQL org.hibernate.dialect.MckoiDialect
Interbase org.hibernate.dialect.InterbaseDialect
Pointbase org.hibernate.dialect.PointbaseDialect
FrontBase org.hibernate.dialect.FrontbaseDialect
Firebird org.hibernate.dialect.FirebirdDialect
 
 

HiberNate的基本映射

 

实体类--表

实体类中的普通属性--表字段

 

采用<class>标签映射数据库表,通过<porperty>标签将普通属性映射成表字段。

所谓普通属性指不包括自定义类、集合、数组等。

 

注意:如果实体类和实体类的属性和SQL中的关键字重复,必须使用table或column重新命名。

 

实体类的设计原则:

(1):实现一个默认的(即无参数的)构造方法(constructor)

(2):提供一个标识属性(identifier property)(可选)

(3): 使用非final的类 (可选)

(4):为持久化字段声明访问器(accessors)和是否可变的标志(mutators)(可选)

 

例代码 复制代码 收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  4. <hibernate-mapping package="com.tao.hibernate">
  5. <class name="Student" table="student" schema="jpa">
  6. <id name="id" type="java.lang.Integer" column="id">
  7. <generator class="native" />
  8. </id>
  9. <property name="name" type="java.lang.String">
  10. <column name="name" length="16" />
  11. </property>
  12. </class>
  13. </hibernate-mapping>
<?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 package="com.tao.hibernate">
	<class name="Student" table="student" schema="jpa">
		<id name="id" type="java.lang.Integer" column="id">
			<generator class="native" />
		</id>
		<property name="name" type="java.lang.String">
			<column name="name" length="16" />
		</property>
	</class>
</hibernate-mapping>

 

详细介绍:

一:<hibernate-mapping>标签:

Xml代码 复制代码 收藏代码
  1. <hibernate-mapping
  2. auto-import="true|false"
  3. package="package.name"
  4. />
<hibernate-mapping
	auto-import="true|false"
	package="package.name"
 />

(1):package (可选): 指定一个包前缀,如果在映射文档中没有指定全限定的类名, 就使用这个作为包名。

(2):auto-import(可选 - 默认为 true):指定我们是否可以在查询语言中使用非全限定的类名(仅限于本映射文件中的类)。

 

二:<class>标签:

Sql代码 复制代码 收藏代码
  1. <class
  2. name="ClassName"
  3. table="tableName"
  4. dynamic-update="true|false"
  5. dynamic-insert="true|false"
  6. lazy="true|false"
  7. />
<class
	name="ClassName"  
	table="tableName"        
	dynamic-update="true|false"
	dynamic-insert="true|false"       
	lazy="true|false"       
/>

(1):name (可选): 持久化类(或者接口)的Java全限定名。 如果这个属性不存在,Hibernate将假定这是一个非POJO的实体映射。

(2):table (可选 - 默认是类的非全限定名): 对应的数据库表名。

(3):dynamic-update (可选, 默认为 false): 指定用于UPDATE的SQL将会在运行时动态生成,并且只更新那些改变过的字段。

(4):dynamic-insert (可选, 默认为 false): 指定用于INSERT的 SQL 将会在运行时动态生成,并且只包含那些非空值字段。

(5):lazy (可选): 通过设置lazy="false", 所有的延迟加载(Lazy fetching)功能将被全部禁用(disabled)。

 

三:<id>标签:

Sql代码 复制代码 收藏代码
  1. <id
  2. name="propertyName"
  3. type="typename"
  4. column="column_name"
  5. <generator class="generatorClass"/>
  6. </id>
<id
	name="propertyName" 
	type="typename"
	column="column_name"
	<generator class="generatorClass"/>
</id>

(1):name (可选): 标识属性的名字。

(2):type (可选): 标识Hibernate类型的名字。
(3):column (可选 - 默认为属性名): 主键字段的名字。

 

 

四:<generator>标签:

Sql代码 复制代码 收藏代码
  1. <id name="id" type="long"column="cat_id">
  2. <generator class="org.hibernate.id.TableHiLoGenerator">
  3. <param name="table">uid_table</param>
  4. <param name="column">next_hi_value_column</param>
  5. </generator>
  6. </id>
<id name="id" type="long" column="cat_id">
	<generator class="org.hibernate.id.TableHiLoGenerator">
		<param name="table">uid_table</param>
		<param name="column">next_hi_value_column</param>
	</generator>
</id>

(1):class:主键生成器的名称,Hibernate提供了很多内置的实现:

a.increment:用于为long, short或者int类型生成 唯一标识。只有在没有其他进程往同一张表中插入数据时才能使用。 在集群下不要使用。

b.identity

对DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的内置标识字段提供支持。 返回的标识符是long, short或者int类型的。

c.sequence

在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence), 而在Interbase中使用生成器(generator)。返回的标识符是long, short或者 int类型的。

d.uuid

用一个128-bit的UUID算法生成字符串类型的标识符, 这在一个网络中是唯一的(使用了IP地址)。UUID被编码为一个32位16进制数字的字符串。

e.hilo

使用一个高/低位算法高效的生成long, short或者 int类型的标识符。给定一个表和字段(默认分别是 hibernate_unique_keynext_hi)作为高位值的来源。 高/低位算法生成的标识符只在一个特定的数据库中是唯一的。

f.native

根据底层数据库的能力选择identity, sequence或者hilo中的一个。

g.assigned让应用程序在save()之前为对象分配一个标示符。这是 <generator>元素没有指定时的默认生成策略。

(2):param:生成器实例需要某些配置值或者初始化参数, 用<param>元素来传递

 

五:<property>标签:

Sql代码 复制代码 收藏代码
  1. <property
  2. name="propertyName"
  3. column="column_name"
  4. type="typename"
  5. update="true|false"
  6. insert="true|false"
  7. lazy="true|false"
  8. unique="true|false"
  9. not-null="true|false"
  10. length="L"
  11. />
<property
        name="propertyName"
        column="column_name"
        type="typename"
        update="true|false"
        insert="true|false"
        lazy="true|false"
        unique="true|false"
        not-null="true|false"
        length="L"       
/>

(1):name: 属性的名字,以小写字母开头。

(2):column (可选 - 默认为属性名字): 对应的数据库字段名。 也可以通过嵌套的<column>元素指定。

(3):type (可选): 一个Hibernate类型的名字。

(4):update, insert (可选 - 默认为 true) : 表明用于UPDATE和/或 INSERT的SQL语句中是否包含这个被映射了的字段。这二者如果都设置为false则表明这是一个“外源性(derived)”的属性,它的值来源于映射到同一个(或多个) 字段的某些其他属性,或者通过一个trigger(触发器)或其他程序生成

(5):lazy (可选 - 默认为 false): 指定 指定实例变量第一次被访问时,这个属性是否延迟抓取(fetched lazily)( 需要运行时字节码增强)。

(6):unique (可选): 使用DDL为该字段添加唯一的约束。 同样,允许它作为property-ref引用的目标。

(7):not-null (可选): 使用DDL为该字段添加可否为空(nullability)的约束。

(8):length (可选): 使用DDL为该字段指定长度。

 

 

 

复合主键代码 复制代码 收藏代码
  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping>
  6. <class name="com.bjsxt.hibernate.FiscalYearPeriod" table="t_fiscal_year_period">
  7. <composite-id name="fiscalYearPeriodPK">
  8. <key-property name="fiscalYear"/>
  9. <key-property name="fiscalPeriod"/>
  10. </composite-id>
  11. <property name="beginDate"/>
  12. <property name="endDate"/>
  13. <property name="periodSts"/>
  14. </class>
  15. </hibernate-mapping>
<?xml version="1.0"?>
<!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.bjsxt.hibernate.FiscalYearPeriod" table="t_fiscal_year_period">
		<composite-id name="fiscalYearPeriodPK">
			<key-property name="fiscalYear"/>
			<key-property name="fiscalPeriod"/>	
		</composite-id>
		<property name="beginDate"/>
		<property name="endDate"/>
		<property name="periodSts"/>
	</class>
</hibernate-mapping>
组件映射代码 复制代码 收藏代码
  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping>
  6. <class name="com.bjsxt.hibernate.User" table="t_user">
  7. <id name="id">
  8. <generator class="native"/>
  9. </id>
  10. <property name="name"/>
  11. <component name="contact">
  12. <property name="email"/>
  13. <property name="address"/>
  14. <property name="zipCode"/>
  15. <property name="contactTel"/>
  16. </component>
  17. </class>
  18. </hibernate-mapping>

你可能感兴趣的:(Hibernate)