Spring + Hibernate3+ Struct2 (一)配置

1 篇文章 0 订阅
1 篇文章 0 订阅

一、各种包的准备

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

当然,这结果好像和我们的预期有些不符,注意到我们打印 表里内容的时候,保存的语句还没被执行(tx.commit())

同时hibernate 可以建表,但是不负责建库,所以事先得用数据库提供的工具建库,如我用的hsql有提供工具sqltool 来管理数据库,可以用这个建库。

(大家复制代码的时候记得把中文注释去掉,可能会引发不知名的错误)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值