Hibernate还是比较常用的,于是我研究了一下Hibernate数据库连接,在这里拿出来和大家分享一下,希望对大家有用。
最近在做一个JavaWeb程序,用MyEclipse开发,用Struts(*.do)做开发框架,Hibernate做数据库代理类,负责对数据库的操作,维持数据持久和数据访问,Spring用来整和注入,哎,还用了Ajax,在Java中实现真他妈的让人烦,什么Ajax,根本就是写JS脚本嘛(不过本来也是,就是最原始的那种拉),自己手写了JS脚本,好久没写过这么多了,也当练习一下XMLHTTPRequest拉。
要是在.NET中那就方便多了,直接就拖AjaxControlToolkit控件,5个AJAX Extensions核心组件,还有几十个ajax Toolkit控件,有两边对联做广告的,有做像Google智能提示的(说到这个,我做每回有一个问题,就是在指定了返回记录的Item每一行Css样式之后,当用键盘上下的方向键移动所选条的时候,它就出现了脚本错误,也不能用方向键移动所选条了,我试过了,只要不设置class他就没一点问题,能正常移动选择和智能提示,但是不设置样式那哪看得?
他默认都是黑字白背景,不过不晓得是不是DIV层做的,我以前用返回<span style='color:red'>Jonllen</span>做测试, 他却没能返回Jonllen,然后我对他进行Html编码和反编码都试过了,也不行,在页面里面要是能得到显示Html的效果(说到这里我呀有要叉开话题了,等后面讲考试在说了),要是这样能行的话那也能设置它的Css style了,但是就是不行,不知道大家有没有碰到我这种情况过,还请知道的大虾指点)还有做琐定冻结页面做实现的,还有谈出的等等...要什么有什么, 看你要实现什么功能了,但我觉得就是MS这些Ajax控件调用WebServer的太多了,就有时要新写个WebMethod不习惯感觉麻烦了,不过这倒是顺了Ajax的本质咯,就是要回调WebServer的Xml,不过我觉得以前做的Ajax还可以,他没有做成控件,只是要引用dll,回调的是一个 Ajax方法,我以前在VS2003里用AjaxPro.dll,感觉还可以,虽然此方法有很多局限性,但用起来感觉挺方便的.MS真是够人性化,Sun 也要学着点就好了,不过当前Sun还是做好它的J2EE规范在说吧。
刚开始还可以,就是JS不好怎么调试,就只能做死了alert看执行到了那一步,不一会儿JS搞定了,我在JS里面调用的open url是一个servlet类,然后在这里调用Hibernate对数据库操作,以达到Ajax的异步处理,因为我这个项目以前是连SQL Server 2000的,不过现在我要用MYSQL数据库了,呵呵,免费的那种,我就把以前工程里面的Hibernate要连SQL Server 2000的三个驱动包给删了,接着选择DB Browser(数据库浏览器)重新设置了Hibernate的数据连接,Edit更改端口,输入数据库口令,哦,还要添加一个MQSQL数据库连接驱动连接包(jar文件),找啊找,在E盘,选择,配置 OK,Next,Finish完成,Open Connection,一长串进度条到结尾后,OK连接成功了,一帆风顺,点开一看几个database下面几个table都对数,我删掉了以前的工程底下hibr包下的一些数据映射对象和相应的DAO数据访问,然后Hibernate Reverse Engineering重新添加删除的那些Hibernate数据库映射对象,用assigned(有主键)的用assigned,用native(自动增长主键)用native,OK,Hibernate代理类搞定,现在只要看servlet里面,...DAO dao = new ...DAO()…对数据库操作完成!
现在就看Ajax的了,它是如何的伟大,在不刷新的情况下异步的CallBack服务器,配置一下WebLogic,Redeploy重新部署,Run运行,打开Brower键如URL看效果咯,满怀期待,想着:onclick提交,addshow()调用JS一个函数,回发到服务器, 结果···返回的是一个alert('你所请求的页面有异常'),呵呵~哎,为什么类?我关闭一下调试,在重新启动一下,还是提示有异常,为什么,为什么,为什么呢?
我认真的检查了我一下JS代码,认真的过了一遍JS里面的function,一个个检查,定义XMLHttpRequest对象、 sendRequest(url)发送函数请求、processResponse()处理返回信息的函数,等等...sendRequest(url)发送函数请求,对URL,应该是这个问题,我的url是"servlet/FindServlet?sn=" +ss;FindServlet是我工程ss包下面的FindServlet.java的servlet类,ss是在JS里面var的一个变量,在细想了一下,servlet/FindServlet?sn="+ss,不是ss/FindServlet?sn="+ss吗?不是,后来也用ss也测试了一下,确实不是,那是什么问题呢?难道问题不是出在URL上面,url没错,想了一阵了,灵机一动,测试一下不就知道了吗!
我连忙打开 FindServlet这个类,一时间还很狠啪着自己的后老勺:你真笨啊!进入FindServlet,在doGet方法里边String shen = request.getParameter("sn");System.out.println(shen);获取sn查询字符串(呵呵.NET学多了),然后再在控制台输出,保存运行,哎,真的输出了,控制台里面输出了"湖南",我sn查询字符串的值,那这么来说,URL确实没有问题,它已经把请求发送到我的这个FindServlet类里面来了,这里我已经能接受到了,接着在FindServlet类往下看,在一些关键性的代码后加上 System.out.println("变量值");我习惯性调试Java的方法,调试运行,果然还没有执行完就报异常了,控制台在输出了DAO前面的变量值后后面的就都没有输出了,一定就是DAO的问题了!
我把目光转到DAO,第一行AddrtableDAO dao = new AddrtableDAO();就实例化绝对没问题List list = dao.findAll(shen);应该问题System.out.print(list。size());此行在控制台没有输出结果,List list = dao.findAll(shen),findAll(shen)是按指定条件shen对数据库执行查询返回List集合的方法,就是这句对数据库查询有问题了(一时间感觉自己真的了不起,我这个人比容易较骄傲自满,我自己都受不了自己了),马上写了一个static void main()方法测试,果然是Hibernate代理数据库操作类出现了问提,提示Can not Connection不能连接,为什么类?
连不上,我明明在DB Browser里配置好了连MySQl的设置,在那里连上了啊,还可以看到数据库和表啊,怎么建的Hibernate数据库代理类就连不上了类,我马上转到了hibernate。cfg.xml Hibernate配置文件,一看,晕了,怎么在配置文件里面用的还是以前的那个的配置设置,我不是改成MySql了吗,我知道了,你在DB Browser选择好数据库连接对象,并未更改Hibernate数据库连接配置,晕了,这MyEclipse怎么这么蠢啊,不知道自动更改Hibernate配置文件,唉痴哦,手动更改后调试运行,心想这次应该能OK了吧,但结果总是出现意外,老和所想的背道而驰的,有出西西了,一长串异常:什么Error Creating SessionFactory等一大片英文,搞得我头都大了,点异常进去看,就是到了那些Hibernate那些砸七砸八的那些包的原类型里了,一个个类N多代码,看得真叫人烦拉,想起就郁闷,这MyEclipse调试可真JB麻烦,又全英文版的(想起.NET中调试,哎```个人觉得Java中就是jar包太繁多了,而一些重要的设置都保存在Xml的配置文件里面,感觉喜欢拿xml配置文件出气!
如页面导航等, 但内容多了就显得繁杂了,就只能手动修改Source了),心里直骂Java垃圾,不禁双手抱着后老勺往后仰,看这天花板郁闷ING。
回下头来看到了这 MyEclipse工具,蔑视了工程一下,回到电脑面前,看啊看,顺眼看了这些砸七砸八的包,哎,似乎少了什么东西,凭直觉我又过了那些jar包文件一便,细想了一翻,又仔细看了那些包一遍,我的MySql数据库驱动jar包文件类!怎么没有呢?我再Refresh一下还是没有看到啊!拐了,我虽然删除了以前连Sql Server 2000的3个包,但是怎么MySql的包怎么没有导进来呢?
第一时间问为什么?难道又是DB Browser的问题,你在那里选择Add JARS选择是驱动包文件是用的磁盘物理路径,也就是说他没有自动把你所选择的包自动加在到你的工程里面进来了,该死的DB Browser,害得我Hibernate老是连不上,这个问题好象只在你以前用一个数据源现在又换掉一个新的Hibernate数据库连接时才有,我打工程文件所在目录,进入WebRoot\WEB-INF\lib 目录,手动将我E盘底下个那个MySQL数据库连接驱动Jar包Copy到这个目录下,再在工程里面Refresh一下,MySql包就出来了,运行 WebLogic打开浏览器,onclick,啊````终于出来了,通过JS查询到数据库服务器里面的数据了。
我在Java中实现Ajax就这样成功了!你们看了我写了这么多觉得好不好笑啊,是不是感觉我是垃圾啊,菜鸟一个,我的确也是菜鸟,本来就是,要是高手的话可能一看就知道错误出在那里了,就不会想我这样折腾了吧!是不是我说了一些Java很低级的常识类?而我自己却不清白类!希望大家莫见笑我了,第一次写这些Hibernate知识,我犯的一些错误,应该大家有些Java的朋友在些Hibernate的时候没出现过我这样的问题吧,其实我对Java是比较感兴趣的,但是由于我所学的Java的知识太少,对有一点难的就不知道做了,那是因为我个人学的 Java太肤浅的原因,我知道其实在.NET中实现在在Java里基本上可以实现的,只不过可能比在.NET中实现难一点而已吧。在网上看到有很多朋友有拿过JAVA的Hibernate和.NET中的ADO.NET进行比较,也有很多人说两着不能进行相比,就像SQL语句不能和存储过程进行相比一样,只要能在恰当的时候用就是好的,我都很认同的他们的观点和看法,而我个人认为呢,只要有自己的对事物认识的观点就是好的。
我是一个比较爱说的人,我觉得你只要能认真的去思考分析一件事物,不管你得到的结论是怎么样的,旨在在这个过程你从中是否学到了一些东西,我不喜欢那些平时不爱说话的, 因为那时候我们不知道他对这个事物的看法是怎样的,也难以猜测他心里到底在想什么。既然上面有说到Hibernate和ADO.NET,所以我又加上了这一段罗嗦起来了,呵呵,就我这皮毛也当回顾我以前一些知识,谈不上总结也算小记一翻,希望高手们别笑话我们这些新手了,下面就我所了解的Hibernate和ADO.NET比较如下:在Hibernate中,首先我们需要在JAVA工程里面添加Hibernate标签库(我用的是Hibernate 3.1 Core Libraries)的引用,在.NET中我觉得就是using、import名称空间SqlClient、OleDb添加程序集的过程,然后我们需要打开DB Brower建立数据库连接字符串,就是打服务器名用户名密码等,然后Hibernate数据库连接信息保存在hibernate。cfg.xml(默认缺省)这一个xml文件中,在连接数据库的时候值得一提的是需要数据库连接驱动包,不同的数据库有不同的驱动包,个人觉得不同的驱动包作用在与,由于不同数据库用的可能的是不同连接操作方式,如Oracle是表空间的形式存在数据库等,而其他的可能略有不同。
正确配置好连接成功后,我们就能在DB Brower里看到数据库和数据库对应的表了,在你连接数据库前添加Hibernate时它会叫你选择包,添加后包下面就会多3个类了,IBaseHibernateDAO、BaseHibernateDAO、HibernateSessionfactory 从名字就可以看出来就是一个接口、一个接口实现类(implements)、一个工厂,具体里面是如何实现的以及其原理机制我此小辈能讲清楚的,我还是有自知知明的,等下甭被我的这点Java皮毛知识给歪曲了那就不好了,不过我看里面的代码也很少简单,要理解起来也不难,反正就创建了这3个类,然后我就需要在DB Brower里面选择相应的表Hibernate Reverse Engineering添加对应DAO和Model,Model就是数据库表对象映射实例,数据库表的每一列充当Model类的属性字段,并添加有 get、set规则的属性访问器,而DAO类里面则封装的是对该表的一些常见的数据访问操作(insert、delete、update、 select),它有自己的HibernateSQL语句(不是一般的sql语句),这一块我手动写得很少,不过和一般的sql语句语法还是很相似, 如有按属性名查询返回Model强类型化List集合等,除此之外,每添加一个表还会自动添加表名.hbm.xml文件,这个xml文件保存数据库映射到Hibernate表字段的具体信息,如主键信息、列长度相应的Java类型等,要注意的是在添加的时候它会叫你选择ID Generator表的信息,这里常见的是assigned(有表主键)和native(自动增长主键),因为在呆后创建的时候它会根据你所选择的信息创建不同的DAO和Model,如在构造函数和一些数据访问的方法里面就可能有需要ID主键的,而对于自动增长的则无须输入ID主键即可。
你可以对多个可能用的到表执行上述Hibernate Reverse Engineering映射操作,你可以在不写一局代码的情况下完成对数据库的大多数的一般操作在其他地方很方便的调用,我觉得这就是Hibernate的最大的好处优点;而在.NET中类,相对Hibernate来说我想是一步一个脚印,什么DAO方法等代码一行行写,不过我觉得这样也没什么不好的,我们一般在项目中就用一个SqlHelper类,里面写上对数据库的一些增删改查方法等。
根据传来的SQL语句和参数组或存储过程等动态的返回数据集合(List)或记录数等,用起来也挺好的,顶多还对不同的实例添加对应的DAL,这些基本上能满足我们对数据库的基本操作了。
不过我觉得在Java中这样实现也可以啊,我以前就在Java里面写了一个SqlHelper类代替了Hibernate,用的是JdbcOdbc数据库连接,感觉也很实用,简单明了,但是Hibernate在一些性能等方面的优势我们上不容忽视的。
【编辑推荐】