了解Hibernate概念(附入门例子详细解释)

来源:互联网 发布:楚河汉街美食攻略 知乎 编辑:程序博客网 时间:2024/06/07 20:42

Hibernate实现持久层上的解耦合,从而达到业务逻辑与数据逻辑分离,实现数据访问和无力数据库表结构的分离,使开发人员更加专注于业务不需要考虑数据库表的结构。
Hibernate是jdbc的轻量级对象封装,不仅提供ORM映射服务,还提供针对数据库的增删改查和数据缓存功能。
轻量级的对象封装具体体现在对jdbc的数据访问操作简化,实现对数据库表中数据cued操作,避免复杂的sql语句出现,并且提高了数据库的访问性能,开发人员可以不再需要考虑与数据库交互的性能问题,Hibernate提供了缓存和连接池的等功能
什么叫持久化:广义来说就是把数据保存到永久保存的存储设备中,从Hibernate角度是把数据从数据表中导入到java对象中;
持久化的好处:无需非常熟悉sql语句(但这不是不去了解数据库的理由,任何一个程序员都应该去熟练掌握数据库,不仅仅是sql语句)。
瞬时状态(程序退出后会消失的数据) 持久化 持久状态(将数据保存在硬盘上,程序退出后数据依然存在)
Hibernate对数据操作和jdbc一样都不是线程安全的,都需要及时关闭,但jdbc操作的数据是瞬时的,变量的值无法与数据库保持一致,而Hibernate操作的数据是可持久的,即持久化对象的数据属性的值可以是跟数据库的值保持一致的。
开发一个简单的Hibernate的例子,首先用的是mysql数据库,保证你的项目中引入了这些jar包
这里写图片描述

第一步,在src这个目录下,创建一个hibernate.cgf.xml:

<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver </property><!--驱动--><property name="hibernate.connection.username">Root<!--用户名--></property><property name="hibernate.connection.password">123456<!--密码--></property><property name="hibernate.connection.url">jdbc:mysql://localhost:3306/class3<!--登陆url--></property><property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property><!--通过指定方言,确定Hibernate对那种数据库进行优化--> <property name="hibernate.hbm2ddl.auto">Validate<!--表面Hibernate在处理接触到表的一个态度,常用有以下取值create:表示启动的时候先drop,再createcreate-drop: 也表示创建,只不过再系统关闭前执行一下dropupdate: 这个操作启动的时候会去检查schema是否一致,如果不一致会做scheme更新validate: 启动时验证现有schema与你配置的hibernate是否一致,如果不一致就抛出异常,并不做更新 -->  </property><property name="hibernate.show_sql">True<!--用来配置是否显示sql语句--></property>hibernate.cfg.xml里描述ORM Mapping的文件<mapping resource="com/teckwa/hibernate/demo/entity/UserInfo.hbm.xml" /><mapping resource="com/teckwa/hibernate/demo/entity/House.hbm.xml" /><mapping resource="com/teckwa/hibernate/demo/entity/Address.hbm.xml" /><mapping resource="com/teckwa/hibernate/demo/entity/Person.hbm.xml" /><mapping resource="com/teckwa/hibernate/demo/entity/Clothes.hbm.xml" /><mapping resource="com/teckwa/hibernate/demo/entity/Role.hbm.xml" /><mapping resource="com/teckwa/hibernate/demo/entity/Menu.hbm.xml" />

第二步:在package com.teckwa.hibernate.demo.entity这里包里,开发UserInfo.hbm.xml,主要代码如下:第一部分

<class name="UserInfo" table="userinfo"><id name="id" type="java.lang.Long"><column name="id" /><generator class="native" /></id><property name="userName" type="java.lang.String"><column name="username" length="20" not-null="true" unique="true" /></property><property name="password" type="java.lang.String"><column name="password" length="20"></column></property><property name="remark" type="java.lang.String"><column name="remark" length="200"></column></property></class> 

开发UserInfo.hbm.xml,第二部分:

<sql-query name="getUserList"><return alias="user" class="com.teckwa.hibernate.demo.entity.UserInfo"/>SELECTu.ID AS {user.id}, u.USERNAME AS {user.userName}, u.PASSWORD AS {user.password},u.REMARK AS {user.remark} FROM USERINFO u</sql-query> 

1 用来说明userinfo(注意大小写)这个数据表是对应到UserInfo这个类,同时在上文里还指定了这个类所在的package。

2

通过这种话,说明在UserInfo这个类里,id这个字段是和数据表里id这个列是对应上的。

3 通过sql-query定义一个名为getUserList的查询,指明返回对象将以UserInfo的格式接收,其中是通过一个sql语句来查询数据库。
第三步,开发UserInfo.java,其中的字段需要和数据库想匹配,这里的匹配,不是说名字要完全和userinfo数据表里的字段完全一样,而是要和配置文件UserInfo.hbm.xml里指定的类的属性一致。 主要代码如下:

public class UserInfo implements Serializable { private long id;private String userName;private String password;private String remark;//省略get和set} 

第四步,到com.teckwa.hibernate.demo这个package下,开发HibernateMain.java,我们的业务逻辑业主要在这里实现,主要代码如下:

// Step 1:  get hibernate configuration informationConfiguration cfg = new Configuration().configure();// step 2: Build SessionFactorySessionFactory sessionFactory = cfg.buildSessionFactory();// step 3: open the session (connection)Session session = sessionFactory.openSession();         // step 4: CRUD operation       List<UserInfo> users = new ArrayList();String hqlstr = "from UserInfo";Query query = session.createQuery(hqlstr);users = query.list(); System.out.println("users size is:" + users.size());for(UserInfo u : users){System.out.println(u.getId() + "\t" + u.getUserName() + "\t" + u.getPassword());}       session.flush();session.close();

1 创建Configuration对象,这个对象可以理解成是hibernate里配置文件的阅读器,通过这个对象,阅读hibernate.cfg.xml中的配置,并生成后面的SessionFactory对象。

2 SessionFactory是hibernate的核心接口,它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。
3 hibernate用一个session来处理一批数据,或者说session是hibernete的缓存,在这里,通过session创建了一个query,用hql通过from UserInfo到数据库中查询这张表,然后把结果通过UserInfo这个类返回。
4通过query的list方法可以得到返回结果,得到返回结果后,就可以通过各种方法类显示了。

5 最后,需要关闭资源。

0 0
原创粉丝点击