Hibernate 基本原理和配置

Hibernate是一个Java ORM开源框架,ORM即对象关系映射,是指在操作数据库时,利用面向对象的方法来处理关系型数据库里面的数据。

Hibernate本质上是对Java的JDBC进行了封装。

有了Hibernate,就可以将数据库中的数据映射为对象,将数据封装进对象后,就可以通过Java面向对象的思想来处理这些数据,使得开发更加高效。

使用Hibernate首先需要依赖如下.jar包:


即官网下载的Hibernate中的request下的所有.jar包。

Hibernate的核心在于session对象,想使用Hibernate,首先要先生成一个session对象,该对象用于和数据库直接进行交互。这个对象是包含有增删改查的方法的。Hibernate采用的做法是使用工厂模式创建session对象,即首先定义SessionFactory类,每个数据库只需要一个SessionFactory,对这个数据库进行操作时的session都由这一个类产生。

对于SessionFactory对象的创建,有两种方法,第一种是在src下建立hibernate.cfg.xml文件,通过configuration对象读取该文件,以此建立sessionFactory对象。另一种是new SessionFactory对象后,直接通过Java代码的set方法来配置该factory。

下面给出第一种方法的例子:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/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://localhost:3306/sqltest</property>
        <property name="connection.username">root</property>
        <property name="connection.password">123456</property>


        <property name="connection.pool_size">1</property>

        <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>

   
        <property name="current_session_context_class">thread</property>

 
        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>


        <property name="hbm2ddl.auto">update</property>
        

        <mapping resource="cn/chd/pojo/User.hbm.xml"/>

    </session-factory>

</hibernate-configuration>

关于上述配置的详解:https://blog.csdn.net/yuhui123999/article/details/51886531

这样就建立了SessionFactory对象,通过工厂创建了session实例。session对象是一个轻量级对象,只在程序与数据库交互时产生,用完就要close掉。另外他是线程不安全的。

同样,由于每次交互都需要一个session,所有session都由sessionfactory产生,所以通常做法是封装成工具类:

package cn.chd.hibernateutil;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;


/** 
* @author : homels
* @date 创建时间:2018年5月25日 下午5:34:14
* @ClassName: HibernateUtils
* @Description: TODO 
* @version 
*/
public class HibernateUtils {
	private static Configuration configuration = null;
	private static SessionFactory sessionFactory = null;
	//静态代码块,只实现一次
	static{
		configuration = new Configuration();
		//configuration.config()会在src下找hibernate.cfg.xml文件
		sessionFactory =  configuration.configure().buildSessionFactory();
	}
	
	public static Session getSessionObject(){
		return sessionFactory.getCurrentSession();
	}
	public static SessionFactory getSessionFaactory(){
		return sessionFactory;
	}
}

同时,Hibernate与数据库交互时需要一下POJO对象,即简单对象(只有属性和set、get),下面定义一个User用来演示:

package cn.chd.pojo;
/** 
* @author : homels
* @date 创建时间:2018年5月25日 下午5:28:54
* @ClassName: User
* @Description: TODO 
* @version 
*/
public class User {
	private int id;
	private String name;
	private int num;
	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 int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
	@Override
	public String toString() {
		return "id: "+id+" name: "+name+" num: "+num;
	}
}

还需要为该POJO类配置一个xx.hbm.xml文件,以下为User.hbm.xml:(该配置文件的路径需要在bibernate.cfg.xml中声明)

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="cn.chd.pojo">
    <class name="User" table="demo2">
        <id name="id">

        </id>
        <property name="name"></property>
        <property name="num"></property>
    </class>
</hibernate-mapping>

各项配置见:https://blog.csdn.net/xiu2016/article/details/52805761

这样一个Hibernate框架就基本完成了,在使用时只需要获取到session对象,然后执行数据库操作即可,以下为测试类,其中包括击中使用Hibernate操作数据库的方法:

package cn.chd.test;



import org.hibernate.query.Query;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.Transaction;

import cn.chd.hibernateutil.HibernateUtils;
import cn.chd.pojo.User;

/** 
* @author : homels
* @date 创建时间:2018年5月25日 下午6:21:29
* @ClassName: Test
* @Description: TODO 
* @version 
*/
public class Test {
	public static void main(String[] args) {
		Test test = new Test();
		test.addUser(6, "hh");
		test.addUser(7, "aa");
		test.queryByCriteria();
	}
	public void addUser(int id,String name){
		Session session = null;
		Transaction transaction = null;
		try {
			//获取session对象
			session = HibernateUtils.getSessionObject();
			//开启事务
			transaction = session.beginTransaction();
			//功能
			User user = new User();
			user.setName(name);
			user.setId(id);
			user.setNum(1234);
			session.save(user);
			//提交事务
			transaction.commit();
		} catch (Exception e) {
			e.printStackTrace();
			//回滚事务
			transaction.rollback();
		}
	}
	public User queryUserId(int id){
		Session session = null;
		Transaction transaction = null;
		User user = null;
		try {
			user = new User();
			session = HibernateUtils.getSessionObject();
			transaction = session.beginTransaction();
			user = session.get(User.class, id);
			transaction.commit();
		} catch (Exception e) {
			e.printStackTrace();
			transaction.rollback();
		}
		return user;
	}

	public void updateUserInfo(int id,String name){
		Session session = null;
		Transaction transaction = null;
		try {
			session = HibernateUtils.getSessionObject();
			transaction = session.beginTransaction();
			User user = session.get(User.class, id);
			user.setName(name);
			session.update(user);
			transaction.commit();
		} catch (Exception e) {
			e.printStackTrace();
			transaction.rollback();
		}
	}
	
	public void deleteUser(int id){
		Session session = null;
		Transaction transaction = null;
		try {
			session = HibernateUtils.getSessionObject();
			transaction = session.beginTransaction();
			User user = session.get(User.class,id);
			session.delete(user);
			transaction.commit();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public void queryByQuery(){
		Session session = null;
		Transaction transaction = null;
		try {
			session = HibernateUtils.getSessionObject();
			transaction = session.beginTransaction();
			
			Query query = session.createQuery("from user");
			List<User> list = query.list();
			for(User user:list){
				System.out.println(user);
			}
			transaction.commit();
		} catch (Exception e) {
			e.printStackTrace();
			transaction.rollback();
		}
	}
	
	public void queryByCriteria(){
		Session session = null;
		Transaction transaction = null;
		try {
			session = HibernateUtils.getSessionObject();
			transaction = session.beginTransaction();
			Criteria criteria = session.createCriteria(User.class);
			List<User> list = criteria.list();
			for(User user:list){
				System.out.println(user);
			}
			transaction.commit();
		} catch (HibernateException e) {
			e.printStackTrace();
			transaction.rollback();
		}
	}
	
	public void queryBySQLQuery(){
		Session session = null;
		Transaction transaction = null;
		try {
			session = HibernateUtils.getSessionObject();
			transaction = session.beginTransaction();
			SQLQuery sqlQuery = session.createSQLQuery("SELECT * FROM demo2");
			List<User> list = sqlQuery.list();
			for(User user:list){
				System.out.println(user);
			}
			transaction.commit();
		} catch (Exception e) {
			e.printStackTrace();
			transaction.rollback();
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值