要开发Hibernate应用程序,首先需要到Hibernate官方网站http://www.hibernate.org下载Hibernate,本例子基于Hibernate-3.2.5,解压缩从Hibernate网站下载的Hibernate发布包,并把/lib目录下所有需要的库文件拷到我们新建开发目录下的/lib目录下。(包括hibernate3.jar)
接下来我们创建一个类,用来代表那些我们希望储存在数据库里的数据,本例中用到的User类如下:
package org.hibernate.domain;
import java.util.Date;
/**
* 实体类
*/
public class User {
private int id;
private String name;
private Date birthday;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", birthday=" + birthday
+ "]";
}
}
为了通过反射机制(Reflection)来实例化这个类的对象,我们需要提供一个无参的构造器(no-argument constructor)。 其实User把这个无参的构造器省略了。如果User类有其他有参数的构造器,则无参的构造器必须提供。
映射文件:
Hibernate需要知道怎样去加载(load)和存储(store)持久化类的对象。这正是Hibernate映射文件发挥作用的地方。映射文件告诉Hibernate它,应该访问数据库(database)里面的哪个表(table)及应该使用表里面的哪些字段(column)。配置文件有XML(hibernate.cfg.xml)和properties(hibernate.properties)两种,这两个文件的作用一样,提供一个即可,推荐XML格式,下载目录/etc下有示例配置文件。可以在配置文件指定:数据库的URL、用户名、密码、JDBC驱动类、方言等。启动时Hibernate会在CLASSPATH里找这个配置文件。在hibernate-mapping标签(tag)之间, 含有一个class元素。所有的持久化实体类(再次声明,或许接下来会有依赖类,就是那些次要的实体)都需要一个这样的映射,来把类对象映射到SQL数据库里的表。 本例中的User类对应的配置文件如下:
User.hbm.xml:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="org.hibernate.domain"> <class name="User" table="user"> <id name="id"> <generator class="native" /> </id> <property name="name" /> <property name="birthday" /> </class> </hibernate-mapping>
应该把这个映射文件保存为User.hbm.xml,且就在User类的源文件目录下。映射文件可随意地命名,但hbm.xml的后缀已成为Hibernate开发者社区的约定。
有了持久化类和它的映射文件,现在我们需要Hibernate了,Hibernate配置文件如下:
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory name="foo"> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql:///hibernate</property> <!-- 用户名与密码根据实际情况填写 --> <property name="connection.username">root</property> <property name="connection.password">mysql</property> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <property name="hbm2ddl.auto">create</property> <property name="show_sql">true</property> <mapping resource="org/hibernate/domain/User.hbm.xml" /> </session-factory> </hibernate-configuration>
Hibernate基于配置文件的,所以我们下面需要调用Hibernate的api编写一个工具类来对前面定义的User类进行操作,工具类如下:
package org.hibernate.util;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
/**
* 工具类
*/
public class HibernateUitl {
private static SessionFactory sessionFactory;
private HibernateUitl() {
}
static {
/*
* 读取默认的配置文件(hibernate.properties或者hibernate.cfg.xml)
* 来创建并初始化一个Configuration类的实例
*/
Configuration cfg = new Configuration();
cfg.configure();
sessionFactory = cfg.buildSessionFactory();
/*
* sessionFactory = Configuration.class.newInstance().configure()
* .buildSessionFactory();
*/
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
public static Session getSession() {
return sessionFactory.openSession();
}
}
接下来编写实体对象User的接口类:
package org.hibernate.dao;
import org.hibernate.domain.User;
public interface UserDao {
public void saveUser(User user);
public User findUserByNameByCriteria(String name);
public User findUserByNameByHQL(String name);
public User findUserById(int id);
public void updateUser(User user);
public void remove(User user);
}
实体接口的实现类:
package org.hibernate.dao.imp;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;
import org.hibernate.dao.UserDao;
import org.hibernate.domain.User;
import org.hibernate.util.HibernateUitl;
/*UserDao实现类*/
public class UserDaoHibernateImpl implements UserDao {
/* 按id号查找用户 */
public User findUserById(int id) {
Session session = null;
try {
session = HibernateUitl.getSession();
User user = (User) session.get(User.class, id);
return user;
} finally {
if (session != null)
session.close();
}
}
/* 按名字查找用户Criteria方式 */
public User findUserByNameByCriteria(String name) {
Session session = null;
try {
session = HibernateUitl.getSession();
Criteria c = session.createCriteria(User.class);
c.add(Restrictions.eq("name", name));
User user = (User) c.uniqueResult();
return user;
} finally {
if (session != null)
session.close();
}
}
/* 按名字查找用户HQL方式 */
public User findUserByNameByHQL(String name) {
Session session = null;
try {
session = HibernateUitl.getSession();
String hql = "from User as user where user.name=:name";
Query q = session.createQuery(hql);
/* 使用别名方式 */
q.setString("name", name);
User user = (User) q.uniqueResult();
return user;
} finally {
if (session != null)
session.close();
}
}
/* 删除用户 */
public void remove(User user) {
Session session = null;
Transaction tx = null;
try {
session = HibernateUitl.getSession();
tx = session.beginTransaction();
session.delete(user);
tx.commit();
} finally {
if (session != null)
session.close();
}
}
/* 保存用户 */
public void saveUser(User user) {
Session session = null;
Transaction tx = null;
try {
session = HibernateUitl.getSession();
tx = session.beginTransaction();
session.save(user);
tx.commit();
} finally {
if (session != null)
session.close();
}
}
/* 更新用户 */
public void updateUser(User user) {
Session session = null;
Transaction tx = null;
try {
session = HibernateUitl.getSession();
tx = session.beginTransaction();
session.update(user);
tx.commit();
} finally {
if (session != null)
session.close();
}
}
}
接下来我们就可以对刚才编写的对象的实现类进行测试,测试类如下:
package org.hibernate.test;
import java.util.Date;
import org.hibernate.dao.UserDao;
import org.hibernate.dao.imp.UserDaoHibernateImpl;
import org.hibernate.domain.User;
public class TestHibernate {
public static void main(String[] args) {
UserDao userDao = new UserDaoHibernateImpl();
System.out.println("**********插入用户操作**********");
User user = new User();
user.setName("user");
user.setBirthday(new Date());
userDao.saveUser(user);
System.out.println("保存后的用户信息:" + user);
System.out.println();
System.out.println("**********查询用户操作**********");
user = userDao.findUserByNameByCriteria("user");
// user = userDao.findUserByNameByHQL("user");
System.out.println("依据名字查询的用户信息:" + user);
System.out.println();
System.out.println("**********更新用户操作**********");
user.setName("new user");
userDao.updateUser(user);
System.out.println("更新名字后的用户信息:" + user);
System.out.println();
System.out.println("**********删除用户操作**********");
userDao.remove(user);
}
}
测试后的结果打印在控制台的信息如下:
工程的目录结构如下: