日期:2014-05-16  浏览次数:20458 次

Swing + hibernate + mysql动态写DB配置
java应用的运行环境有受管理环境(webSphere)和不受管理环境(swing,tomcat-这只猫只管理Servlet容器和连接池不管理事务)。hibernate可以与上述任何一种java应用的运行环境集成。只为彻底了解hibernate,这里使用Swing + hibernate + mysql的结构。
这种结构作为家庭作业可以,作为工具可以,作为项目/产品不行。原因有2:
1.项目框架的组织要求扬长避短。Swing的优势在于定制界面的灵活性和作为JAVA基类(鸡肋)的简单性, 辅以socket和多线程也有好的作为。而hibernate用来实现数据持久,是解决重量级容器的一种缓冲方法,达到程序的相对轻重平衡。这点没做到。
2.数据持久化从另一个方面可以理解为长期的大量内存占有。尤其峰值数据不通过专门的应用服务器去管理,很难保证程序健壮。而java的JVM只能管理1-2G的内存(根据版本不同 ),而且内存越大反应越慢。这点又PASS了。

这里是为什么故事的一个分支。今天的答案是struts + hibernate/ibats + spring就是一盘炒菜,各个食材的味道参杂在一起,模糊了彼此自己的特色。今天重点只在hibernate环境上,他的事务处理介绍会另作一份菜。



闲话少说,开始搭环境。
需要的环境:
    IDE:eclipse;
    db:mysql;
    lib包:hibernate和mysql相关的lib包;
    第三方工具:ultraEdit,mysql-front;
    mysql-front资源在附件中。
目标:
    通过swing按钮进行hibernate连接数据库测试。测试成功状态更新为连接成功;
    否则状态更新为连接失败。
hibernate机制:
    1.config加载db连接属性和需要持久化类的配置XML及持久化类本身(Menu);
    2.根据config生成sessionFactory的线程,数据库表和java的持久化类之间的一一对应关系被sessionFactory持有;
    3.sessionFactory生成一个新的session线程;
    4.session线程读取sessionFactory加载的db连接属性通过db表和持久化类的映射进行数据库操作,并持有该结果;这里起事务,提交或回滚。
    5.关闭session和sessionFactory,返回结果。
操作步骤如下:
    1.生成java工程、相应的目录结构和swing界面;


目录结构如上图。目录结构说明如下:
    1.1/dbvisit/src/com/toolstorage/example/dto/xml目录:存放JAVABEAN(DTO)和DB相关联的XML文件。
    1.2/dbvisit/src/com/toolstorage/example/dto目录:存放JAVABEAN(DTO)
    1.3/dbvisit/src/com/toolstorage/example/frame目录:存放界面和事件处理
    1.4/dbvisit/src/com/toolstorage/example/opt目录:存放操作数据库的类。
    1.5和SRC同级的CONFIG目录存放hibernate加载配置文件(动态变更数据库的关键)

    2.引入hibernate和mysql需要的lib包。


    3.构建JAVABEAN(DTO)和DB及两者的配置关系。


说明:其实就是写javabean、建数据库表、构建hibernate的关联配置XML。
     3.1(图一)建立一个Menu类用来存放菜谱(getxxx,setxxx);
     3.2(图三)建立数据库和menu表;
     3.2(图一)建立Menu.hbm.xml,映射Menu类和menu表字段的映射关系。

     4.构建hibernate.hbm.xml文件和hibernate.properties文件。
     4.1文件hibernate.hbm.xml放在src目录下,session-factory中只存放
<mapping resource="com/toolstorage/example/dto/xml/Menu.hbm.xml"/>
     4.2文件hibernate.properties放在config目录下,里面存放数据库连接配置相关的信息。


程序运行:
1. 运行Dbvisit里面的main方法生成如下界面:

2. 点击db test按钮,输入参数正确的话查到结果(图六);错误的话提示为成功并报出异常(图七)。如果要连接不同的数据库,就可以在这里修改参数。




小插曲1:DB或JAVA命名的时候需要注意关键字的规避。起先在DB中定义了explain作为菜单的解释说明字段,但在测试中怎么去连接怎么报错。按报错信息一步一步排查的时候发现是字段名用成关键字了,之后把explain改为explain2就好了。

小插曲2:javabean、数据库表、hibernate的关联配置XML三者任何一个先完成,剩余两个都可以用工具生成。但我这例子一来简单二来练练手,所以这些文件都是自己敲代码敲出来的。这种学习的方法推荐给大家,加深理解和增加经验都不错的。

小插曲3:开始的时候使用new Configuration().configure(String resource),希望可以加载
Hibernate.properties文件。但后来发现这个resource必须是hibernate特定的XML格式的文件。于是只好用new Configuration().setProperties(properties).configure()进行加载。

小插曲4:如果在hibernate.cfg.xml中配置了<mapping resource=”xxx”/>,那么Configuration对象在进行config.addClass(xxx)操作后,会报hibernate.cfg.xml中mapping的xxx找不到异常。(原因很简单看