Hibernate框架简单项目介绍

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

}
发布了136 篇原创文章 · 获赞 54 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/Flora_SM/article/details/103795156