分享
 
 
 

Hibernate 入门

王朝other·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

Hibernate 入门(原创) 2004/08/22

作者:雨伞(geezer)

----------------------------------------------

本文配置环境:

JBuilder X

jdk 1.4.2

mysql 4.0.11 驱动:mm.mysql-2.0.4-bin.jar(org.gjt.mm.mysql.Driver)

Hibernate 2.1

解压Hibernate

打开JB,新建工程,名为:hibernate

加入Hibernate需要的包与MYSQL驱动

步骤:file->new project->name中输入hibernate,Directory选择你要存放本工程的路径->next

->required libraries->add->new->name中输入你要设置的hibernate包名

->add->选择你hibernate解压到的目录,选中该目录下的hibernate2.jar与lib目录下的所有jar包,再把你的MYSQL驱动包也加进去

然后一直按OK,next。

新建一个类,名为Hello_Bean.Java,代码如下:

package hibernate;

import java.io.Serializable;

/**

* @author geezer

* QQ:9986986 MSN:geezer_hot@hotmail.com

*/

public class Hello_Bean implements Serializable {

private String name;//这里name与address和id的名字可以自己定,不会有什么影响.但get与set方法不可以。因为那得跟数据库与配置文件对应。

private String address;

private int id;

public Hello_Bean() {

}

public Hello_Bean(String name, String address) {//构造函数,看完本章以后相信你会明白的了

this.name = name;

this.address = address;

}

public String getName() {//此方法名必须与Hello_Bean.hbm.XML文件里的对应的名字一样,下面会具体讲

return name;

}

public void setName(String name) {

this.name = name;

}

public String getAddress() {

return address;

}

public void setAddress(String address) {

this.address = address;

}

public int getId() {//必须的方法

return id;

}

public void setId(int id)//必须的方法

{

this.id = id;

}

}

完成这一步以后编译

将hibernate解压后的目录下的src文件夹里的hibernate.properties与log4j.properties文件复制到你的工程目录的classes目录下

(例如hibernateclasses目录下),

打开hibernate.properties文件,找到

## HypersonicSQL

hibernate.dialect net.sf.hibernate.dialect.HSQLDialect

hibernate.connection.driver_class org.hsqldb.jdbcDriver

hibernate.connection.username sa

hibernate.connection.passWord

hibernate.connection.url jdbc:hsqldb:hsql://localhost

hibernate.connection.url jdbc:hsqldb:test

hibernate.connection.url jdbc:hsqldb:.

改为

## HypersonicSQL

#hibernate.dialect net.sf.hibernate.dialect.HSQLDialect

#hibernate.connection.driver_class org.hsqldb.jdbcDriver

#hibernate.connection.username sa

#hibernate.connection.password

#hibernate.connection.url jdbc:hsqldb:hsql://localhost

#hibernate.connection.url jdbc:hsqldb:test

#hibernate.connection.url jdbc:hsqldb:.

再找到

## MySQL

#hibernate.dialect net.sf.hibernate.dialect.MySQLDialect

#hibernate.connection.driver_class org.gjt.mm.mysql.Driver

#hibernate.connection.driver_class com.mysql.jdbc.Driver

#hibernate.connection.url jdbc:mysql:///test

#hibernate.connection.username root

#hibernate.connection.password

改为

## MySQL

hibernate.dialect net.sf.hibernate.dialect.MySQLDialect

hibernate.connection.driver_class org.gjt.mm.mysql.Driver

hibernate.connection.url jdbc:mysql://localhost:3306/test

hibernate.connection.username root

hibernate.connection.password

上面的URL请改为你自己的

完成以后创建一个空的文件,保存在你工程的类文件同个文件夹里(例如hibernateclasseshibernate目录下),文件名为:Hello_Bean.hbm.xml

内容如下:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC

"-//Hibernate/Hibernate Mapping DTD 2.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

<hibernate-mapping>

<class name="hibernate.Hello_Bean" table="test_hibernate" >

<id name="id" column="id">

<generator class="identity"/>

</id>

<property name="name" type="string" update="true" insert="true" column="name" />

<property name="address" type="string" update="true" insert="true" column="address" />

</class>

</hibernate-mapping>

稍微解释一下,<class name="hibernate.Hello_Bean" table="test_hibernate" >里的name指你的生成表的类,

table则指定你要创建的数据库表的名字,可以自由修改,没有影响.

<id name="id" column="id">设置主键ID,这里name的值id跟Hello_Bean.java里的方法getId与setId对应,不用管这个,hibernate会自动调用,配置好就可以了,column的值为要生成的字段名,可以自由修改,没有影响。

<generator class="identity"/>属性让主键的ID自增(插入数据的时候自动加1)

<property name="name" type="string" update="true" insert="true" column="name" />这里的name值"name"跟Hello_Bean.java里的getName方法对应,column为要生成的字段名

<property name="address" type="string" update="true" insert="true" column="address" />

分别添加一个字段name与address,注重这里的type属性类型为string,假如这里的类型与Hello_Bean.java里设置的类型不一样会出错。

修改完以后保存。

最后在JB里新建一个类,名字为Hello.java,我会一步步解释,代码如下:

package hibernate;

import net.sf.hibernate.cfg.Configuration;

import net.sf.hibernate.SessionFactory;

import net.sf.hibernate.tool.hbm2ddl.SchemaEXPort;

import net.sf.hibernate.Session;

import net.sf.hibernate.Query;

import net.sf.hibernate.Hibernate;

import net.sf.hibernate.type.LongType;

import net.sf.hibernate.Transaction;

import net.sf.hibernate.ScrollableResults;

import java.util.*;

/**

* @author geezer

* QQ:9986986 MSN:geezer_hot@hotmail.com

*/

public class Hello {

public Hello() {

}

public static void main(String[] args) throws Exception {

Configuration cfg = new Configuration().addClass(Hello_Bean.class);//用Hello_Bean.class类初始化

SessionFactory sessions = cfg.buildSessionFactory();//用buildSessionFactory方法得到一个SessionFactory对象

Session session = sessions.openSession();//再用SessionFactory的openSession方法得到一个session

new SchemaExport(cfg).create(true, true);//这句意思是创建表,第一次运行以后,就是创建完表以后再把这行加上注释。假如建表以后不把这一句注释掉的话会删掉以前创建的表再重新建一个。

Hello_Bean my_hibernate = new Hello_Bean();//得到一个Hello_Bean对象

my_hibernate.setName("my_name");//设置Hello_Bean对象的name值为my_name,这里其实就是说把字符串my_name当作数据库字段name的值.数据库字段name与Hello_Bean类里的getName,setName方法是对应的。形成一个映射关系。

my_hibernate.setAddress("my_address");//如上

session.save(my_hibernate);//这句很重要,将my_hibernate对象写进数据库(my_hibernate对象里的name与address我们刚刚已经设置了值了,会直接把name,address的值写进数据库去)

session.flush();

session.close();

//上面是一个简单的插入数据与第一次运行建表的介绍,下面我再介绍删除与修改的方法,下面的代码我都加了注释,自己需要什么方法(删除,修改,循环数据库的值)就把注释去掉就可以了

HSQL比较简单,大家看一下例子就应该明白了,这里就不讲了。

遍历数据库的方法有三种,分别是Query,find,iterate,Query和find返回一个List接口,iterate返回一个Iterator,具体方法可以查看这些类得知。

//删除数据

/*

int a=session.delete("from Hello_Bean where id=1");//假如没有找到id为1的数据那么返回0,假如找到返回1,这里的Hello_Bean是我们的Hello_Bean类,他跟数据库表对应,所以我们在这里是直接用Hello_Bean来代码数据库表的。

System.out.println(a);

session.flush();

session.close();

*/

//Query方法查询数据

/*

Hello_Bean my_hibernate = null;

Query q = session.createQuery("from Hello_Bean");

// Query q = session.createQuery("from Hello_Bean where name=?");//这里的?跟JDBC的PreparedStatement方法的差不多,只不过这里的是以0开始,jdbc的是1开始。

// q.setString(0,"my_name");

// q.setFirstResult(0);//这句话的意思是说查询结果从第几行开始列出数据

// q.setMaxResults(3);//这句话的意思是取多少条数据,就跟SQL SERVER的TOP方法和MYSQL的LIMIT方法一样的意思。

// ScrollableResults sc=q.scroll();//得到一个ScrollableResults,可滚动的,假如你的数据库支持游标自由移动的话可以加上,也就是说可以判定查询结果有没有值,或者移动到下一行记录等等。

// if(!sc.next())

// {

// System.out.println("没有找到你需要的数据");

// }

session.flush();//假如使用了ScrollableResults的话请把这行注释掉

session.close();//假如使用了ScrollableResults的话请把这行注释掉

List l=q.list();//返回一个List接口,用来遍历结果集

for(int i=0;i<l.size();i++){

my_hibernate = (Hello_Bean) l.get(i);//从List中取得一个my_hibernate对象

System.out.println(my_hibernate.getName());//调用my_hibernate对象的getName方法取得数据库name字段的值

}

*/

//find方法查询数据

/*

Hello_Bean my_hibernate = null;

List q = session.find("from Hello_Bean");

session.flush();

session.close();

for(int i=0;i<q.size();i++)

{

my_hibernate = (Hello_Bean) q.get(i);

System.out.println(my_hibernate.getName());

}

*/

//iterate方法查询数据

/*

Hello_Bean my_hibernate = null;

Iterator q = session.iterate("from Hello_Bean");

while(q.hasNext())

{

my_hibernate = (Hello_Bean) q.next();

System.out.println(my_hibernate.getName());

}

*/

//修改数据

/*

Query qq=session.createQuery("from Hello_Bean");

Hello_Bean my_hibernate=(Hello_Bean)session.load(Hello_Bean.class,new Integer(2));

//这里的new Integer(2)意思是修改表中id为2的那一行数据,必须是一个包装类的对象,假如使用int的话会出错。

my_hibernate.setName("geezer");//把id为2的那一行数据的name字段值改为"geezer"

session.flush();

session.close();

*/

}

}

最后运行就可以了。

假如大家有什么不清楚的,可以下载这篇文章的例子看看,运行一下。

下载地址:http://www.PHPx.com/happy/attachment.php?s=&postid=599353

下载完以后用JB打开hibernate.jpx就可以了。用之前把hibernate和MYSQL的驱动加进去,方法假如不知道再看看本章开头部分。

常见错误:

Caused by: org.dom4j.DocumentException: Invalid byte 2 of 2-byte UTF-8 sequence. Nested exception: Invalid byte 2 of 2-byte UTF-8 sequence.

假如出现这行错误说明你的xml配置文件有不规范的字符,检查下。

net.sf.hibernate.MappingException: Error reading resource: hibernate/Hello_Bean.hbm.xml

假如出现这行错误说明你的hibernate的XML配置文件有错

net.sf.hibernate.MappingException: Resource: hibernate/Hello_Bean.hbm.xml not found

假如出现这行错误说明hibernate的XML配置文件没有找到,你应该把XML文件放在与你的类文件同个目录下,本文中是放在hibernateclasseshibernate目录下,也就是跟Hello_Bean.class类文件一起。

net.sf.hibernate.PropertyNotFoundException: Could not find a setter for property name in class hibernate.Hello_Bean

假如出现这行错误说明你的xml文件里设置的字段名name的值与Hello_Bean.java类里的getXXX或setXXX方法不一致。

net.sf.hibernate.HibernateException: JDBC Driver class not found: org.gjt.mm.mysql.Driver

假如出现这行错误说明你的MYSQL驱动没有加进JB库里或者不在CLASSPATH里。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有