标签:hibernate
Hibernate的出现是为了解决面向对象编程与关系数据库之间的连接问题。Hibernate不仅管理java类到数据库表的映射关系,还提供数据库查询和获取数据的方法。它是一种ORM(Object/Relation Mapping),是先进的面向对象编程语言与底层的落后的关系数据库发展不协调的产物。ORM能够将数据库表中的一行信息映射成一个持久化类实例,而每一行的每一条数据就是实例的一个属性。有了ORM,应用程序只需要操作持久化对象即可,ORM会自动将这种操作转化恒底层数据库操作。
为project配置数据库
下载最新的Hibernate包,将lib下的required下的所有jar包、optional中的c3p0下的三个jar包添加到自定义的user library。然后使用MyEclipse为项目增加Hibernate Capacities。
简单操作搭建
我们只需要编写三个文件即可搭建一个简单的Hibernate环境。首先是hibernate.cfg.xml文件,该文件配置了数据库链接,持久化类映射等信息。
<hibernate-configuration> <session-factory> <property name="connection.url">jdbc:mysql://localhost/cmdb</property> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.username">root</property> <property name="connection.password">cm123</property> <property name="c3p0.acquire_increment">2</property> <property name="c3p0.idle_test_period">3000</property> <property name="c3p0.max_size">20</property> <property name="c3p0.max_statements">100</property> <property name="c3p0.min_size">1</property> <property name="c3p0.timeout">5000</property> <property name="hbm2ddl.auto">update</property> <property name="show_sql">true</property> <property name="format_sql">true</property> <mapping class="com.cm.table.Students" /> </session-factory> </hibernate-configuration>
配置文件中的property属性分为几个部分。首先是配置数据库链接的部分,包括大家熟知的url,driver,pass和user。注意在填写url的时候,最后我写的cmdb要换成你们自己的数据库名字。
然后是c3p0部分,此部分配置了使用c3p0数据源的有关信息。所谓数据源,就是一种以数据池为容器,动态地分配数据库链接的提高数据库连接性能的技术。它会在一开始创建出若干链接,放在连接池中。当某一程序需要连接,直接在池中获取,使用结束,无需关闭链接,而是返还给连接池。这种方式能够避免重复地获取数据库连接关闭而导致的性能下降。
下面我们来看持久化类文件。
@Entity @Table(name="students") public class Students { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private Integer id; private String name; private String sex; private int age; private String tel; }
注意此处我省略了各个属性的set、get方法。持久化类实际上就是普通的java bean+注解。注解来与javax.persistence这个包。Entity表明这是一个持久化类,Table告诉架构这个类将映射到哪一个表格。Id用于指定该类的标识属性。GeneratedValue是主键生成策略。
下面我们来看测试类。
public class test { public static void main(String[] args){ Configuration conf=new Configuration(); conf.configure(); ServiceRegistry sr= new ServiceRegistryBuilder().applySettings(conf.getProperties()).buildServiceRegistry(); SessionFactory sf=conf.buildSessionFactory(sr); Session sess=sf.openSession(); Transaction tx=sess.beginTransaction(); Students s=new Students(); s.setAge(10); s.setName("abcc"); s.setSex("nan"); s.setTel("202818"); sess.save(s); tx.commit(); sess.close(); sf.close(); } }
这里的写法比较固定,首先是要获取Configuration以便加载xml文件。然后通过conf实例得到SessionFactory。打开session,打开事务。持久化操作后,保存持久化实例,按顺序关闭事务,session和SessionFactory。通过上述简单例子,我们可以发现,数据库中多了一行数据,但是我们并没有写sql语句,而这也就是Hibernate的最大作用,将我们程序员从蛋疼的sql语句中解放出来了!取而代之的是具有Context Assist的面向对象操作!
Hibernate的体系结构
Session是Hibernate中的重要对象,只有处在Session管理下的POJO才有持久化操作的能力(也就是有有能力将面向对象操作转为底层数据库sql持久化操作)。
Hibernate组件需要一个properties文件来指定数据库连接信息,需要持久化注解来修饰Persistent Objects,而Persistent Objects则是链接顶层Application与Hibernate的桥梁。PO需要Session的管理,Session由工厂产生,工厂则由configuration实例建造。Session能够开始事务,而事务则是一个原子操作,正是一系列事务,组成了持久化操作的转换。所以,从面向对象的操作一直向上,分别是transaction,session,sessionfactory,configuration。
Hibernate的持久化操作离不开SessionFactory对象,它是整个数据库映射关系经过编译后的内存镜像,该对象的openSession方法可以代开Session对象,进而开始事务。
Configuration代表了程序到SQL数据库的配置信息,它的buildSessionFactory方法能够产生一个不可变的SessionFactory(说白了就是解读了xml中的mapping部分,然后记住了哪个持久化类是哪个table)。
本文出自 “指尖轻飞” 博客,谢绝转载!
标签:hibernate
原文地址:http://mengcao.blog.51cto.com/9395052/1687522