前些天开始接触hibernate,想想以前直接用c3p0进行笨拙而繁杂的数据库操作就觉得生无可恋了,也正因如此,在刚刚接触hibernate的我,便强烈地喜欢上这种偷懒而优雅的面向对象式操作数据库的方法,下面进行一些简单的总结,主要是关系型数据库持久化思想以及hibernate一些常规的用法。
一、对象持久化(我觉得也可以理解为关系型数据的对象化)
以前,我直接利用jdbc进行数据库操作时,总感觉一堆的sql拼接和set方法手动组装对象令人感觉无趣,这些机械性非常强的动作,很多时候让人不禁地怀疑人生,直到我知道还有对象持久化这种思想时,才感觉数据库操作变得有趣而优雅起来,咳咳,废话不多说,丑图说明持久化的思想想:
先上一张我以前字节利用jdbc操作数据库的流程丑图
然后,下面是一大坨无趣的jdbc操作代码(由于太无趣,我只能折叠起来了,相信没谁有心情看它):
public void doJdbc(){ Connection conn = null; Statement stmt = null; ResultSet rs = null; try{ //1,加载驱动 Class.forName("com.mysql.jdbc.Driver"); //创建数据库连接对象 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/atm","root","root"); //创建一个可向数据库发送SQL命令并返回结果的传送对象Statement stmt = conn.createStatement(); //将sql命令通过传送对象Statement传送到数据库执行,并返回结果 String sql = "select * from account1"; rs = stmt.excuteQuery(sql);//excuteQuery()方法用于执行查询语句,返回结果表 //处理结果集 while(rs.next()){ String code = rs.getString("code"); int password = rs.getDouble("money"); //根据游标获取 // String code = rs.getString(1); // String password = rs.getInt(2); // double money = rs.getDouble(3); System.out.println(code + password + money); } }catch(Exception e){ e.printStack(); }finally{ try{ if(rs!=null){ rs.close(); } if(stmt!=null){ stmt.close(); } if(conn!=null){ conn.close(); } }catch(Exception e){ e.printStack(); } } }
然后,hibernate或者说持久化思想又是如何处理这些困境的呢?先看它的思想:对象持久化
大概,从这个个人画的丑图中知道:hibernate将内存中的dto对象直接映射到数据库中对应的表,我们可以直接操作对应的dto对象便可达到操作数据库的效果,hibernate所封装的jdbc操作,对我们而言是透明的!
这想想就激动啊,这种思想直接将数据库的操作对象化,我们终于可以以更直观的面向对象思维来进行数据库的操作了,相比以前的在java中手动组装对象和sql语句的过程式jdbc操作,简直太爽啦,毕竟可以用面向兑现解决问题时,一切看起来都是那么地直观!
OK,对象持久化的大概思想估计也总结得差不多了,hibernate只是一个中间者,它会帮我们将对象持久化,而我们,只需要享受它带来的好处就行了。
二、hibernat持久化对象
1、对象的持久化。首先,我们先认识hibernate的核心对象Session,在hibernate中,session对象是连接java对象和数据库的主要中间者,在java beans 和session关联起来后,对象中的修改都会相应地反映到数据库中(当然,前提是进行了事务的提交操作,这个稍后讨论),session和java bean对象的关系是类似于一个管理者和被管理者的关系,具体看下丑图:
大概,上图也说清楚了session是如何将普通对象持久化起来的:就是调用session的save或者saveOrUpdate(二者作用稍后讲),使得对象持久化起来,具体看代码例子:
//实例一:hibernate中对象的持久化方法 public void objPersistence(){ //创建session工厂对象 SessionFactory factory = new Configuration().configure().buildSessionFactory(); //创建sessio对象 Session session = factory.openSession(); //初始化一个普通java bean 对象 Person person = new Person();//这时,Person对象刚new出来,并没有和任何数据库进行关联 //调用session进行对象持久化 session.save(person); //当然也可以这样持久化:session.saveOrUpdate(person); }
通过持久化后,对象的修改便会反映到数据库中,具体请往下看;
2、面相对象式地数据库修改操作。在上面中,当对象进行持久化之后,变可以针对持久化之后的对象进行操作了,而这些操作,会动态地反映到数据库中,具体看下面的例子代码:
public void objPersistence(){ //创建session工厂对象 //加载配置文件,这里配置文件的具体书写之后的博客会提到如何将数据库与对象映射起来 SessionFactory factory = new Configuration().configure().buildSessionFactory(); //创建sessio对象 Session session = factory.openSession(); //初始化一个普通java bean 对象 Person person = new Person();//这时,Person对象刚new出来,并没有和任何数据库进行关联 //调用session进行对象持久化 session.save(person); //当然也可以这样持久化:session.saveOrUpdate(person); //person对象已经持久化了,这时,我们可以直接通过操作对象便可以达到操作数据库的目的了 Transaction transaction = null; try{ //首先,我们需要显式地开启事务(因为hibernate将自动提交的功能关掉了) transaction = session.beginTransaction(); person.setAge(11);//这里对象person进行修改后,在transaction的commit动作发生之后会反映到数据库中去 //显式提交 transaction.commit(); }catch (Exception e) { // TODO: handle exception transaction.rollback();//发生异常,需要回滚事务 }finally{ session.close();//事务执行完必须释放session资源 } }
这个例子展示了,当对象进持久化后,我们可以直接操作对象来对数据库进行操作,这是不是炒鸡美妙的事情?
OK,每篇博客不宜过长,(毕竟,我要尽量多水点东西来显得我的博客很多啊哈哈开个玩笑而已)这只是一片简单阐述一个思想——对象持久化思想的博客罢了,对于具体的其他持久化操作,这篇博客只是简单地进行了讲解,后面的博客会更详细地说到对象持久化之后该如何做以及相关的配置文件如何书写的问题,当然,只要你在看了这篇博客之后,大概知道,hibernate帮我们解决了什么问题以及体会到对象持久化的思想,那就够了!