目前主流的数据库一般都是关系型的数据库,而我们目前的高级程序语言都支持面向对象等特性,数据库的编程语言之间存在的一条鸿沟。在面向对象的数据库还没有得到普及的时候,ORM(对象,关系,映射)都将作为一种简化编程的工具存在。
下面就演示一个简单的利用hibernate(一个orm框架)框架写的一个小程序。
首先我们写一个javabean,Userbean,我们的类最好不要设置成final类,因为hibernate框架有时候优化执行的时候,会继承我们的类,如果我们设置成final类的话,他就无能为力。
类要提供默认构造函数,因为hibernate利用反射技术生成我们的类(如果没有提供默认构造函数,hibernate框架就无法管理类的生命周期)
public class UserBean {
private int id;
private String username;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
UserBean与数据库的表之间的映射文件,id表示主键,generator表示主键的生成策略,native表示使用本地数据库的生成策略。
如果没有指定表名,则默认和java类名称一致,即UserBean。id和property,如果也没有指定名称(即列名),则默认也是和类的属性名称一致。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.shizhan.hibernate.domain">
<class name="UserBean">
<id name="id">
<generator class="native"/>
</id>
<property name="username"/>
<property name="password"/>
</class>
</hibernate-mapping>
利用oracle作为数据库的配置文件,像我们以前利用jdbc连接数据库一样,需要提供驱动名,url地址,用户名,密码等信息。这个配置文件中多了一个 <property name="dialect">用来告诉hibernate框架,我们使用的数据库名称。
配置文件中还要指明我们的表与类映射的其他配置文件的位置。
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>
<session-factory>
<!-- 数据定义语言,告诉hibernate帮我们创建表 -->
<property name="hbm2ddl.auto">create</property>
<!-- 告诉hibernate程序与哪种数据库连接,本例子使用oracle -->
<property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
<property name="connection.url">jdbc:oracle:thin:localhost:1521:orcl</property>
<property name="connection.username">scott</property>
<property name="connection.password">tiger</property>
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="myeclipse.connection.profile">oracle.jdbc.driver.OracleDriver</property>
<!-- 告诉hibernate我们的user.hbm.xml在哪 -->
<mapping resource="com/shizhan/hibernate/domain/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
hibernate工具类
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
private static SessionFactory sessionFactory ;
//不让其他用户轻易创建,因为我们有些操作只执行一次
private HibernateUtil(){
}
static{
Configuration cfg = new Configuration();
cfg.configure();
sessionFactory = cfg.buildSessionFactory();
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
public static Session getSession(){
return sessionFactory.openSession();
}
}
测试类
package com.shizhan.hibernate.test;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.shizhan.hibernate.domain.UserBean;
import com.shizhan.util.HibernateUtil;
public class TestHibernate {
public static void main(String[] args) {
Session s = HibernateUtil.getSession();
Transaction t = s.beginTransaction();
UserBean user = new UserBean();
user.setUsername("shizhan");
user.setPassword("123");
s.save(user);
t.commit();
s.close();
}
从s.save(user)中,我们发现可以直接将对象存储到数据库中,这就是hibernate的魅力所在,简化了之间利用原始jdbc插入数据时编程步骤。
hibernate默认的事务是 不自动提交,这和jdbc的自动提交有点不一致,所以如果我们发现数据没有插入到数据库中,这时候问题可能就是我们没有开启事务,并且提交。
Configuration cfg = new Configuration();
cfg.configure(); 用来加载hibernate.cfg.xml文件,所以时间比较久,应保证我们的应用程序只调用一次。configure()函数默认加载hibernate.cfg.xml文件,所以如果我们的配置文件是其他的名称,需要显示的传入值。