一、各种包的准备
1.Spring包下载
到官网 http://www.springsource.org 主页拉到最下面,找到Spring Framework 点进去之后好像还要注册才能下载,注册内容就随便填好了,下载后的文件名字大概是
spring-framework-x.x.x.RELEASE.dict.zip
2.Hibernate包下载
这个貌似在官网上的连接挺奇怪的,所以直接到sourceforge下就好了
http://nchc.dl.sourceforge.net/project/hibernate/
最新的版本是hibernate4,但是本文使用的hibernate3,3和4的区别还是挺大的,所以如果是想看本文配hibernate的童鞋最好用3.x 版本的hibernate
我下的是 hibernate-distribution-3.6.10.Final-dist.zip
3.Struct 包下载
也是到官网下载
http://struts.apache.org/release/2.3.x/ 点download , 然后下
Full Distribution
我下的是 struts-2.3.15.1-all.zip
下完以上三个包我们的准备工作就基本就绪了
二、配置hibernate
好像网上的教程都是先配spring ,再配其他两个,但是我觉得hibernate和structs 的耦合性相对弱一些,所以想要糙快猛的同学可以尝试先配hibernate和structs
0.假定你用的是eclipse,并且已经建好了一个tomcat工程(或者配好Dynamic Web工程了),并且已经按照网上的教程写好了一个hello world(好吧,这里贴张图吧,就是在工程根目录下建个index.html文件,写入以下内容,其中的DOCTYPE声明了这个文件的类型,html下的那个网址先无视,body里面的东西就是要输出的Hello World!文字,用p包着表示这是一个passage)。同时假设你已经配好了一个数据库(可以参考我的上一篇博客)
1.现在在工程根目录下新建一个src文件夹,并在eclipse中把这个文件夹设为Source Folder (就是文件夹点右键,build path->Use as Source Folder)。
这里我必须吐槽一下Eclipse的编译机制,有时候用IDE就是会被一些底层的细节坑啊。。。
实际上我们接下来写的各种xml不应该放在/src文件夹里,而应该放在/WEB-INF/classes里面,并且在Tomcat 启动的时候被自动读取配置。但是我们写的时候实际上是在/src文件夹里写这些东西的。其实查看一下你工程根目录下的.classpath 就会发现有个 <classpathentry kind="output" path="WEB-INF/classes"/>,实际上Eclipse在编译的时候会把你的/src(记得要设为source folder)下的.xml给复制过去/WEB-INF/classes,然后一些java的文件会编译成.class给送过去。
但是Eclipse用的是自动编译,有时候会抽风(比如说在工程上有个红叉,就表示有些代码有语法错误或者无法连接什么的,有时候会有红感叹号,这是应该是链接的路径出问题了,可以检查一下你的.classpath或者在Eclipse里面检查build path,我之前把原来的WEB-INF/src 删了出现过这种情况),所以在开发的时候你可能会需要不时的重启Eclipse(貌似每次重启它都会很乖的把工程重新编译一遍,当然这个是可以设置的),或者把一些xml文件手动复制到WEB-INF/classes 下面。
2.建数据类。实际上hibernate是把一个类表示一个表,这个类中的各个变量就是组成这个表的各个列。
比如一个简单的Java 数据类如下:
//Path: /src/com/UserBase.java
package com;
public class UserBase {
//ID
Long ID = new Long(0); //即使有了not null的元素,也最好有ID,这个是作为辨认各个项而存在的
//Key Value
String userName=""; //not null
String password=""; //not null
public UserBase(){}
public UserBase( String userName , String password ){
//ID = id;
this.userName = userName;
this.password = password;
}
private void setID( Long i){ //其实最好设置为public
this.ID = i;
}
public void setUserName( String userName ){
this.userName = userName;
}
public void setPassword(String password) {
this.password = password;
}
public Long getID(){
return this.ID;
}
public String getUserName(){
return userName;
}
public String getPassword() {
return password;
}
@Override
public String toString(){
String res = "";
res += ID.toString();
res += " " + userName;
res += " " + password;
return res;
}
}
以及以上的各种getter setter 都是可以在eclipse里自动生成的,点代码右键 Source->Generate Getters and Setters , 就会出现了。
3.然后就是hibernate.cfg.xml文件了,这个各大网站都搜的到,这里我也贴一下我的,注意我用的底层数据库是HSQL,介绍在代码注释里
<!-- Path:src/hibernate.cfg.xml -->
<!-- 我用的是hibernate版本是 3.6 -->
<?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">
<!-- 前面都是些版本号,映射文件的引用,相当于引用库,有兴趣的可以研究一下对应的文件,这里就复制粘贴好了,注意dtd的版本是3.0 -->
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<!--以下四行是配置数据库的,这里的 name 就相当于一个变量名,后面跟的内容就是它的值 -->
<property name="connection.driver_class">org.hsqldb.jdbcDriver</property> <!-- 我用的是hsql,使用相应的jdbcDriver-->
<property name="connection.url">jdbc:hsqldb:E:\tem\EclipseNew\WebTom\DataSave\data</property>
<!-- 这里的URL 前面的可以照抄,后面地址相当于数据库的绝对路径,注意最后的data相当于数据库各种文件的文件名,关于这个URL更加详细的资料可以上网查其他资料 -->
<property name="connection.username">sa</property>
<property name="connection.password"></property>
<!-- 用户名密码随意 -->
<!-- SQL dialect -->
<!-- 这是选择数据库语言,这里我选的是hsql -->
<property name="dialect">org.hibernate.dialect.HSQLDialect</property>
<!-- 这项是是否显示sql日志,我选择开启 -->
<property name="show_sql">true</property>
<!-- hibernate will create a table automatically -->
<!-- 设置为 update 表示数据会以更新的方式插入数据库,而且可以自动建表 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- auto commit the query -->
<!-- 会把指令自动提交给数据库,这项设为自动,不过好像还是有事会抽 -->
<property name="connection.autocommit">true</property>
<!-- mapping 文件的引入 -->
<mapping resource= "UserInfo.hbm.xml"/>
</session-factory>
</hibernate-configuration>
以下是mapping 文件,路径为 Path: src/UserBase.hbm.xml
<?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.UserBase" table="BASE">
<id name="ID" column="USER_ID" type = "long">
<generator class="native"/><!-- 这是ID的产生方式,有的教程里会把这里设为increment,这样其实没简单多少但是容易报错,所以建议大家还是设置成 native,就是自动找对应语言的最合适的ID产生方式 -->
</id>
<property name="userName" type="string" column="USER_NAME" not-null="true"/>
<property name="password" type="string" column="PASSWORD" not-null="true"/>
</class>
</hibernate-mapping>
4.然后引入hibernate的包,注意这里的包引入的地址是 WEB-INF/lib 在开发的时候,同时需要在Eclipse 的build-path 中也引入hibernate的库。两者的区别是,在WEB-INF/lib中引入的是给开Tomcat之后,Tomcat来调用的,而在Eclipse中引入的则是在你写java时要IED提供自动补全,自动编译等服务时需要引用的。
我引用的库大概为:
其中 hsqldb.jar 和 sqltool.jar为我底层数据库的库,不是hibernate的库。
5. 这时候其实可以尝试启动下Tomcat,估计会报各种错,(用Eclipse的Tomcat插件打开会看的明显些)ClassNotFound估计是库没加全,hibernate.cfg.xml的错就是看下自己的xml文件有没有写错,文件名一定要注意,不要弄错了。然后,mapping 记得和hibernate.cfg.xml放在一个文件夹内,同时里面的property 名字不要弄错了,类型也不要弄错了(这里的type和Java 的 type 是有一一对应关系的,不确定的可以上网查查)
6.这时可以编个测试文件测试 Hibernate是否成功设置。如下:
//Path: src/com/HibernateUtil
package com;
import org.hibernate.*;
import org.hibernate.cfg.*;
public class HibernateUtil {
public static SessionFactory sessionFactory;
static public SessionFactory getSessionFactory(){
return sessionFactory;
}
static public void setSessionFactory( SessionFactory sf ){
sessionFactory = sf;
}
static {
try {
// Create the SessionFactory from hibernate.cfg.xml
sessionFactory = new Configuration().configure().buildSessionFactory();
//这里其实也可以直接指定配置文件的位置,如下
/*File configFile = new File("src/hibernate.cfg.xml");
if ( configFile.exists() == false )
configFile = new File("http://localhost:8080/src/hibernate.cfg.xml");
sessionFactory = new Configuration().configure(configFile).buildSessionFactory();*/
} catch (Throwable ex) {
// Make sure you log the exception, as it might be swallowed
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static ThreadLocal session = new ThreadLocal();
public static Session getSession() throws HibernateException {
Session s = (Session) session.get();
// Open a new Session, if this thread has none yet
if (s == null) {
s = sessionFactory.openSession();
// Store it in the ThreadLocal variable
session.set(s);
}
return s;
}
public static void setSession( Session s ){
session.set(s);
}
public static void closeSession() throws HibernateException {
Session s = (Session) session.get();
if (s != null)
s.close();
session.set(null);
}
}
好了,Hibernate的Factory 就封装好了,下面是测试类:
//Path : src/com/Test.java
package com;
import java.util.List;
import org.apache.jsp.index_jsp;
import org.hibernate.Session;
import org.hibernate.Transaction;
public class Test {
public static void main(String[] args) {
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
UserBase userBase = new UserBase("USER_NAME", "PASSWORD");
session.save(userBase);
List<UserBase> list = session.createQuery("from UserBase").list();
for( UserBase ub: list )
{
System.out.println(ub.toString());
}
tx.commit();
HibernateUtil.closeSession();
}
}
运行出现类似下面的结果就说明hibernate 配置成功了:
Hibernate: insert into BASE (USER_ID, USER_NAME, PASSWORD) values (default, ?, ?)
Hibernate: select userbase0_.USER_ID as USER1_2_, userbase0_.USER_NAME as USER2_2_, userbase0_.PASSWORD as PASSWORD2_ from BASE userbase0_
1 USER_NAME PASSWORD
Hibernate: select userbase0_.USER_ID as USER1_2_, userbase0_.USER_NAME as USER2_2_, userbase0_.PASSWORD as PASSWORD2_ from BASE userbase0_
1 USER_NAME PASSWORD
当然,这结果好像和我们的预期有些不符,注意到我们打印 表里内容的时候,保存的语句还没被执行(tx.commit())
同时hibernate 可以建表,但是不负责建库,所以事先得用数据库提供的工具建库,如我用的hsql有提供工具sqltool 来管理数据库,可以用这个建库。
(大家复制代码的时候记得把中文注释去掉,可能会引发不知名的错误)