纯手工编写第一个Hibernate程序
转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://legend2011.blog.51cto.com/3018495/723154
Hibernate是目前很流行的一个对象/关系映射(Object/Relation Mapping,ORM)框架,在企业级应用开发中得到了广泛的应用。那么什么是ORM呢?
public class User {
private int id;
private String name;
private int age;
private String gender;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender()
{
return gender;
}
public void setGender(String gender)
{
this.gender = gender;
}
}
写好后,将User.java文件保存在FirstHibernate目录下。
<?xml version="1.0" encoding="gb2312"?>
<!--上面这行的encoding="gbk"指定本文件的编码类型。
这一行信息必须出现在文件的首行,即使前面有空行或注释都不行。
否则会报错。
-->
<!--指定相关的DTD信息,例行的信息,照抄即可。-->
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!--在hibernate-mapping元素中指定映射关系-->
<hibernate-mapping>
<!--用一个class元素指定用户属性与users表字段之间的映射关系-->
<!--name指定代表用户的User类。本应带包名,但User类没有package
声明,故可省略。table指明与之映射的数据库中的表。-->
<class name="User" table="users">
<!--
id元素指定用户标识属性到users表主键的映射。
标识属性用于唯一地标识一个用户。id元素中的name
的值即为User类中用于标识用户的属性名,在这里为id。
type指定数据类型,注意不要忘了完整的包名。
column指定User类的id属性与users表中的ID这个字段(主键)
映射。两者数据类型要一致。
-->
<id name="id" type="java.lang.Integer" column="ID">
<!--
generator元素指定主键生成策略。在这里设为identity。
指由数据库的标识列生成。还记得我们把users表的ID字段
设为标识(identity)列吗?这样往users表中插入一条记录时,
将由数据库根据自增策略为这条记录生成一个主键。
-->
<generator class="identity"/>
</id>
<!--
以下三个property元素用来指定User类的普通属性到表字段之间的映射。
name指定User类中的属性,column属性指定与其映射的字段。
如第一个property元素表示User类的age属性映射到users表的age
字段。由于两者名字相同,所以其实可以不指定column的值,就像后
两个property元素那样。
注意:这三个property元素都没有指定type的值,那么将由hibernate
自行判定类属性和表字段之间的属性转换。这在本例中会正确执行。
-->
<property name="age" column="age"/>
<property name="name"/>
<property name="gender"/>
</class>
</hibernate-mapping>
根据上面映射文件的id元素和property元素,hibernate就知道了该使用哪个getter和setter方法对User对象的属性进行操作。
<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<!--hibernate-configuration是配置文件的根元素,配置信息都在此元素内。-->
<hibernate-configuration>
<!--session-factory子元素。-->
<session-factory>
<!-- 指定连接SQL Server 2008的驱动类。需提供相关的JAR包,可在微软官方
网站下载。-->
<property name="connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
<!--连接URL-->
<property name="connection.url">jdbc:sqlserver://localhost;databaseName=mydb</property>
<!--用户名和密码-->
<property name="connection.username">sa</property>
<property name="connection.password">admin123</property>
<!-- 使用内置连接池,大小为1 -->
<property name="connection.pool_size">1</property>
<!-- 由于不同数据库之间存在差异,hibernate就需要相关的数据库方言
来处理这种差异性。如下指定了针对于SQL Server的数据库方言。
-->
<property name="dialect">org.hibernate.dialect.SQLServerDialect</property>
<property name="current_session_context_class">thread</property>
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<!-- 向标准输出设备输出hibernate为我们生成的SQL语句。 -->
<property name="show_sql">true</property>
<!--指定要用到的映射文件,就是我们刚才创建的。-->
<mapping resource="User.hbm.xml" />
</session-factory>
</hibernate-configuration>

//从JAR包中引入hibernate的相关接口、类。
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import java.util.Random;
public class TestHibernate {
public static void main(String[] args) {
//创建Configuration对象,此对象代表了我们的程序到数据库
//的hibernate配置。调用其configure()方法,此方法会自动
//搜索hibernate.cfg.xml配置文件。
Configuration cfg = new Configuration().configure();
//调用Configuration对象的buildSessionFactory()方法来
//创建会话工厂(SessionFactory)对象。
SessionFactory factory = cfg.buildSessionFactory();
//从会话工厂获得会话(Session)对象
Session session = factory.getCurrentSession();
//开始事务
session.beginTransaction();
User user = new User();
user.setName("阿汤哥");
user.setAge(new Random().nextInt(21) + 20);
user.setGender("男");
//将此用户保存到数据库中的users表。在这里hibernate将用到
//映射文件User.hbm.xml中的信息。直接保存user对象,是不是
//比我们自己分别保存姓名、年龄等信息要简单、形象多了呢?
//Hibernate将自动为我们生成insert语句。
session.save(user);
//提交事务。
session.getTransaction().commit();
//关闭SessionFactory
factory.close();
}
}
实际上,放置在lib目录下的每个JAR包都要用到。上面的方法解决了类org.dom4j.DocumentException的问题后,但还会有很多 Hibernate要用到的,或被Hibernate调用的其他模块要用到的类找不到。这些类都包含在剩下的那些JAR包中。读者可以自己试一下,如果现 在运行程序,它还会报错说XX类找不到,我们就又得把这个类所在的JAR包添加到classpath环境变量里。然后又会报错说YY类找不到,直到我们把 所有的JAR包都添加进去。为把这些JAR包一次性地添加到classpath中,笔者写了一个批处理文件setclasspath.bat,放置在 FirstHibernate目录下。如果你建立的目录和目录结构,以及各文件的存放位置,都与笔者完全一致(包括所在的盘,我这里是E盘),那么这个批 处理文件你就可以直接使用。其源码如下(用UltraEdit或Windows记事本等文本编辑器创建一个文本文件,然后将其后缀名改为bat,就能创建 一个批处理文件。再用文本编辑器打开就能输入想要执行的DOS命令)
set classpath=.;E:\DemoPrograms\FirstHibernate\lib\hibernate3.jar;E:\DemoPrograms\FirstHibernate\lib\sqljdbc4.jar;E:\DemoPrograms\FirstHibernate\lib\dom4j-1.6.1.jar;E:\DemoPrograms\FirstHibernate\lib\slf4j-api-1.6.2.jar;E:\DemoPrograms\FirstHibernate\lib\slf4j-simple-1.6.2.jar;E:\DemoPrograms\FirstHibernate\lib\hibernate-jpa-2.0-api-1.0.1.Final.jar;E:\DemoPrograms\FirstHibernate\lib\cglib-2.2.jar;E:\DemoPrograms\FirstHibernate\lib\commons-collections-3.1.jar;E:\DemoPrograms\FirstHibernate\lib\javassist-3.12.0.GA.jar;E:\DemoPrograms\FirstHibernate\lib\jta-1.1.jar
现在再来运行程序。
浙公网安备 33010602011771号