Hibernate是一个开放源代码的对象关系映射框架,它对jdbc进行轻量级的对象封装。不仅提供了从Java类到数据表之间的映射,也提供了查询和事务机制。相对于使用jdbc和sql操作数据库,Hibernate大大减少了操作数据库的工作量。
(一)搭建环境
- 导入Hibernate核心jar包及相关的其他jar包(包括数据库驱动jar包)
- 安装Hibernate Tools
(二)例题
eg:将“人员”信息保存到Mysql数据库中。 人员信息有:id,name,sex, age.
1、分析设计:
建立Java工程,利用Hibernate实现数据库的连接并向数据库中添加记录。
2、实现
- 建立Java工程,并在该工程的根目录下,创建lib目录
- 将Hibernate核心jar包和MySQL驱动程序jar包复制到lib下
- 建立对象模型Person类
- 建立映射文件Person.hbm.xml
注意:映射文件要求与持久化实体类在同一包内。命名为持久化类类名.hbm.xml。通常一个持久化对象(PO)类对应一个映射文件。该文件给出了“实体类”与“数据库表”,以及“类属性”与“表字段”之间的映射关系。
※ 右击Person.java,在弹出的快捷菜单中选择New——Other——Hibernate——Hibernate XML Mapping file(hbm.xml)命令,可以快速生成映射文件。
- 建立数据库配置文件hibernate.cfg.xml
该文件建立在src目录下
※ 右击src选项,在弹出的快捷菜单中选择New——Other——Hibernate——Hibernate Configuration File(cfg.xml)命令,可以快速生成配置文件框架。
- 设计主类,完成向数据库中保存记录的功能。
- 运行程序。当运行结束后,自动创建数据表,并在表内添加了一条记录。当再运行程序时,可继续向数据库表内添加记录。
3、结构图
4、代码
(1)hibernate.cfg.xml
<?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">
<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql:///ch06_db_01</property>
<property name="connection.username">root</property>
<property name="connection.password">123456</property>
<property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<property name="hbm2ddl.auto">update</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<mapping resource="com/edu/entity/Person.hbm.xml"/>
</session-factory>
</hibernate-configuration>
(2)Person.java
package com.edu.entity;
public class Person {
private Integer id;
private String name;
private String sex;
private int age;
public Person() {}
public Person(String name, String sex, int age) {
super();
this.name = name;
this.sex = sex;
this.age = age;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
(3)Person.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>
<class name="com.edu.entity.Person" table="PERSON">
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="native" />
</id>
<property name="name" type="java.lang.String">
<column name="NAME" />
</property>
<property name="sex" type="java.lang.String">
<column name="SEX" />
</property>
<property name="age" type="int">
<column name="AGE" />
</property>
</class>
</hibernate-mapping>
(4)InsertMain.java
package com.edu.entity;
import java.util.Scanner;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
public class InsertMain {
public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
SessionFactory sessionFactory = null;
Session session = null;
Transaction transaction = null;
Configuration configuration = new Configuration().configure();
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
.applySettings(configuration.getProperties()).build();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
session = sessionFactory.openSession();
System.out.println("请依次输入:姓名 性别 年龄:");
String name=cin.next();
String sex=cin.next();
int age=cin.nextInt();
Person person = new Person(name,sex,age);
transaction = session.beginTransaction();
session.save(person);
transaction.commit();
session.close();
sessionFactory.close();
cin.close();
}
}
(三)Hibernate操作辅助类的设计
1、HibernateUtil类的设计
该类主要提供两个方法:获得Session对象和释放Session对象
package com.edu.db_util;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
public final class HibernateUtil {
private static SessionFactory sessionFactory;
private static ThreadLocal<Session> session = new ThreadLocal<Session>();
private HibernateUtil() {
}
static {
// 第一步:读取Hibernate的配置文件 hibernamte.cfg.xml文件
Configuration configuration = new Configuration().configure();
// 第二步:创建服务注册构建器对象,通过配置对象中加载所有的配置信息
StandardServiceRegistryBuilder regbulider = new StandardServiceRegistryBuilder()
.applySettings(configuration.getProperties());
// 创建注册服务
ServiceRegistry serviceRegistry = regbulider.build();
// 第三步:创建会话工厂
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
}
public static Session getThreadLocalSession() {//获取Session对象的方法
Session s = (Session) session.get();
if (s == null) {
s = sessionFactory.openSession();
session.set(s);
}
return s;
}
public static void closeSession() {//释放Session对象的方法
Session s = (Session) session.get();
if (s != null) {
s.close();
session.set(null);
}
}
}
2、创建访问数据库的通用接口IBaseDao<T>
主要包含了查询、插入、删除和修改等有关的方法。
package com.edu.db_util;
import java.util.List;
public interface IBaseDao<T> {
public int insert(T o); // 将对象o添加到数据库内
public int insertList(List<T> list); // 将对象集合添加到数据库内
public int update(T o); // 利用对象o修改当前记录
public int deleteList(Class<T> c, int... ids); //利用id的集合,删除该集合中对应id的记录。
public int delete(T o);// 从数据库中删除一个记录o
public int delete(Class<T> c, int id);// 利用关键字id 从数据库中删除一个记录
public T findById(Class<T> c, int id); // 利用id查找一条记录
public T findOne(String hql, String[] param); // 查询单条记录
public List<T> find(String hql, String[] param); // 按条件查找多条记录
public List<T> findPage(String hql, String[] param, int page, int size); // 分页查找所有对象
public int getCount(String hql, String[] pras);// 返回数据个数
public List<T> findByFields(String hql, String fields[],String condition); //单字段模糊查找满足条件的所有对象
}
3、DaoHibernate类——IBaseDao<T>的实现类
package com.edu.db_util;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.edu.db_util.HibernateUtil;
public class DaoHibernate<T> implements IBaseDao<T> {
@Override
public int insert(T o) {
Session s = null;
Transaction tx = null;
int result = 0;
try {
s = HibernateUtil.getThreadLocalSession();
tx = s.beginTransaction();
s.save(o);
tx.commit();
result=1;
} catch (Exception e) {
if (tx != null) {
tx.rollback();// 事物回滚
}
} finally {
HibernateUtil.closeSession();
}
return result;
}
@Override
public int insertList(List<T> list) {
for (T t : list) {
insert(t);
}
return list.size();
}
@Override
public int update(T o) {
Session s = null;
int result = 0;
Transaction tx = null;
try {
s = HibernateUtil.getThreadLocalSession();
tx = s.beginTransaction();
s.update(o);
tx.commit();
result = 1;
} catch (Exception e) {
if (tx != null) {
tx.rollback();// 事物回滚
}
} finally {
HibernateUtil.closeSession();
}
return result;
}
@Override
public int deleteList(Class<T> c, int... ids) {
for (int id : ids) {
delete(c, id);
}
return ids.length;
}
@Override
public int delete(T o) {
Session s = null;
Transaction tx = null;
int result = 0;
try {
s = HibernateUtil.getThreadLocalSession();
tx = s.beginTransaction();
s.delete(o);
tx.commit();
result = 1;
} catch (Exception e) {
if (tx != null) {
tx.rollback();// 事物回滚
}
} finally {
HibernateUtil.closeSession();
}
return result;
}
@Override
public int delete(Class<T> c, int id) {
Session s = null;
Transaction tx = null;
int result = 0;
try {
s = HibernateUtil.getThreadLocalSession();
tx = s.beginTransaction();
s.delete(s.load(c, id));
tx.commit();
result = 1;
} catch (Exception e) {
if (tx != null) {
tx.rollback();// 事物回滚
}
} finally {
HibernateUtil.closeSession();
}
return result;
}
@SuppressWarnings("unchecked")
@Override
public T findById(Class<T> c, int id) {
Session s = null;
T t = null;
try {
s = HibernateUtil.getThreadLocalSession();
t = (T)s.get(c, id);
} finally {
HibernateUtil.closeSession();
}
return t;
}
@SuppressWarnings("unchecked")
@Override
public T findOne(String hql, String[] param) { // 查询单条记录
T t = null;
Session s = null;
try {
s = HibernateUtil.getThreadLocalSession();
Query query = s.createQuery(hql);
if (param != null) {
for (int i = 0; i < param.length; i++) {
query.setParameter(i, param[i]);
}
}
t = (T) query.uniqueResult();
} finally {
HibernateUtil.closeSession();
}
return t;
}
@SuppressWarnings("unchecked")
@Override
public List<T> find(String hql, String[] param) {
List<T> list = null;
Session s = null;
try {
s = HibernateUtil.getThreadLocalSession();
Query query = s.createQuery(hql);
if (param != null) {
for (int i = 0; i < param.length; i++) {
query.setParameter(i, param[i]);
}
}
list = query.list();
} finally {
HibernateUtil.closeSession();
}
return list;
}
@SuppressWarnings("unchecked")
@Override
public List<T> findPage(String hql, String[] param, int page, int size) { // 分页查找所有对象
List<T> list = null;
Session s = null;
try {
s = HibernateUtil.getThreadLocalSession();
Query query = s.createQuery(hql);
if (param != null) {
for (int i = 0; i < param.length; i++) {
query.setParameter(i, param[i]);
}
}
// 筛选条数
query.setFirstResult((page - 1) * size);
query.setMaxResults(size);
list = query.list();
} finally {
HibernateUtil.closeSession();
}
return list;
}
@Override
public int getCount(String hql, String[] param) {// 返回数据个数
int resu = 0;
Session s = null;
try {
s = HibernateUtil.getThreadLocalSession();
Query q = s.createQuery(hql);
if (param != null) {
for (int i = 0; i < param.length; i++) {
q.setString(i, param[i]);
}
}
resu = Integer.valueOf(q.iterate().next().toString());
} finally {
HibernateUtil.closeSession();
}
return resu;
}
@Override
//单字段模糊查询
public List<T> findByFields(String hql, String fields[], String condition) {
Session s = null;
String findhql=hql;
if(fields!=null && condition!=null && fields.length>0 && !condition.equals("") ){
findhql =findhql + " where 1=1 and (";
for(int i=0;i<fields.length-1;++i){
findhql += fields[i]+" like '%" + condition + "%' or ";
}
findhql += fields[fields.length-1]+" like '%" + condition + "%') ";
}
try {
s = HibernateUtil.getThreadLocalSession();
Query query=s.createQuery(findhql);
@SuppressWarnings("unchecked")
List<T> list=query.list();
return list;
} finally {
HibernateUtil.closeSession();
}
}
}