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();
}
}
}