Hibernate入门学习(一)

都说年底了,大伙应该都在冲回款,忙的不可开交啊啥的。唯独我这个刚转正三个月的闲来无事,只得在上班时间来给自己充充电,也不好玩别的,毕竟刚来公司不久,没有那些老鸟胆子大,凡事低调点,就开始看起了视频。下面简单记录下自己学习到的东西,今天一天看了Hibernate的学习视频,自己总结了一下,也好顺便缕缕,消化一下:

一:下载Hibernate:http://hibernate.org/orm/downloads/并且进行解压,里面有个lib文件夹,里面全是Hibernate所依赖的jar包,当然,不能缺少的核心包hibernate3.jar(这里我用到的是hibernate3),至于和现在的hibernate4有啥区别,自己也不清楚(希望有大牛能给我指正);
二:jar包都准备好后,就可以新建一个java project,将刚才的的jar包全部导入(当然可能不是所有jar包都需要,但是本屌也不清楚哪些可以不要,为了以防万一,都进行导入,安全起见嘛);
三:工程建好后,我们就可以来进行我们的开发练习咯:
首先,我们先在src目录下新建一个hibernate.cfg.xml文件(至于为啥在src目录下,因为src目录最终会编译到一个bin文件夹中也就是类路径下(classpath下面),服务器启动时会自己在classpath下寻找该文件进行解析加载进来);
其次,就开始进行对hibernate.cfg.xml文件配置进行讲解(我连接的是MySQL5数据库,这里必须将mysql-connector-java.jar驱动包导入):

<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property><!-- mysql驱动 -->
<property name="hibernate.connection.url">jdbc:mysql:///test</property><!-- mysql默认连接数据库test以及默认端口3306 -->
<property name="hibernate.connection.username">root</property><!-- 用户名 -->
<property name="hibernate.connection.password">root</property><!-- 密码 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property><!-- mysql方言 -->
<property name="hbm2ddl.auto">create</property><!-- 更新数据库方式 -->
<property name="show_sql">true</property><!-- 是否后台打印语句 -->
<mapping resource="toone/com/cn/bo/User.hbm.xml"/><!--映射文件-->
</session-factory>
</hibernate-configuration>

以上属性(property)我们都可以在之前下载的Hibernate解压包中的etc文件夹下的hibernate.properties文件中找到()。这里对hbm2ddl.auto进行说明一下(有四个值):

create:每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。
create-drop :每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。
update:最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据 model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等应用第一次运行起来后才会。
validate::启动时验证现有schema与你配置的hibernate是否一致,如果不一致就抛出异常,并不做更新。

四:接下来我们就可以来进行我们的实体开发了:

User.java

package toone.com.cn.bo;
import java.util.Date;
public class User {
	private int id;//必须有主键,因为hibernate很多方法都需要用到主键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;
	}
}

User.hbm.xml(映射文件)

<hibernate-mapping package="toone.com.cn.bo.domain">
	<class name="User" table="user"><!--这里的table值对应数据库中的表名;如果没有table值,默认等于类名小写 -->
		<id name="id" column="id">
			<generator class="native"></generator><!--采用主键自增长方式-->
		</id>
		<property name="name" column="name"/><!-- 这里的column值对应数据库中的属性名;如果没有column值,默认等于属性名 -->
		<property name="birthday" column="birthday"/>
	</class>
</hibernate-mapping>


五:最后我们就可以来进行我们的业务开发了(主要进行user的增删改查操作):

以前的采用jdbc来进行连接数据库的方式是很烦琐的,这里就充分发挥了hibernate的方便与优势了:

Main.java

package toone.com.cn;
import java.util.Date;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import toone.com.cn.bo.User;
public class Main {
	public static void main(String[] args){	
//这里千万注意,不能写成Configuration cfg = new Configuration();否则会报Hibernate Dialect must be explicitly set 错误信息将我们误导
//;实际上前面我们已经配置了mysql的方言;
		Configuration cfg = new Configuration().configure();//对于configure()方法,我们可以引入其源代码进行查看,其会在类路
//径下自动去加载一个默认的hibernate.cfg.xml文件;如果我们想换其他名字,可以使用其重载方法,具体可以查看其源代码(下载的压缩包中有)
		SessionFactory factory = cfg.buildSessionFactory();
		User user = new User();
		user.setName("Kobi");
		user.setBirthday(new Date());
		Session session = null;
		Transaction tx = null;
		try {
			session = factory.openSession();
			tx = session.beginTransaction();//开启事务
			session.save(user);//进行保存
			tx.commit();//提交事务
		} catch (HibernateException e) {
			if(tx!=null){
				tx.rollback();//回滚事务
			}
			throw e;//必须抛出异常
		}finally{
			if(session!=null){
				session.close();//关闭session
			}
		}
	}
}

好了,一个添加功能就已经实现,但是写到这里,我们可能发现我们每进行一次操作,比如添加,修改,删除,查找都需要执行这段代码:

Configuration cfg = new Configuration().configure();
SessionFactory factory = cfg.buildSessionFactory();

这段代码非常耗性能,因为它每次都需要去加载解析配置文件hibernate.cfg.xml,并且每次都需要创建session;因此我们不妨自己创建一个工具类,采用单利的方式来进行实现,并且该工具类实现实体的增删改查,代码如下:

HibernateUtils.java

package toone.com.cn.util;

import java.io.Serializable;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

public class HibernateUtils {
	private static SessionFactory sessionfactory;
	private HibernateUtils(){}
	static{
	Configuration cfg = new Configuration().configure();
	sessionfactory = cfg.buildSessionFactory(); 
	}
	public static Session getSession(){
		return sessionfactory.openSession();
	}
	//添加
	public static void add(Object obj){
		Session session = null;
		Transaction tx = null;
		try {
			session = HibernateUtils.getSession();
			tx = session.beginTransaction();
			session.save(obj);//区别:save()方法如果没有开启事务,它会执行一条插入语句,但之后由于没有提交事务,它又进行
			//session.persist(obj);//回滚了,而persist()方法在没有开启事务的时候,它根本不会去执行,即没有那条插入语句
			tx.commit();
		}finally{
			if(session!=null){
				session.close();
			}
		}
	}
	//修改
	public static void update(Object obj){
		Session session = null;
		Transaction tx = null;
		try {
			session = HibernateUtils.getSession();
			tx = session.beginTransaction();
			session.update(obj);
			tx.commit();
		}finally{
			if(session!=null){
				session.close();
			}
		}
	}
	//删除
	public static void delete(Object obj){
		Session session = null;
		Transaction tx = null;
		try {
			session = HibernateUtils.getSession();
			tx = session.beginTransaction();
			session.delete(obj);
			tx.commit();
		}finally{
			if(session!=null){
				session.close();
			}
		}
	}
	//查找 不需要开启事务
	public static Object findById(Class clazz,Serializable id){
		Session session = null;
		try {
			session = HibernateUtils.getSession();
		//这里需要区分一下get()与load()的区别,load()不会立即//去访问数据库只有在第一次使用的时候才会去加载(懒加载);
		//load方法永远不可能返回空对象(如果不存在,其会产生一个user的子类)具体可以去查资料区别这两个方法
			//Object obj = session.load(clazz, id);
			Object obj = session.get(clazz, id);return obj;}finally{if(session!=null){session.close();}}}}


最后,一个实体的增删改查操作就完成了,下面我们可以重写Main.java文件来使用HibernateUtils工具类来对实体进行操作了:

Main.java

package toone.com.cn;
import java.util.Date;


import toone.com.cn.bo.User;
import toone.com.cn.util.HibernateUtils;


public class Main {
	public static void main(String[] args){
		User user = new User();
		user.setName("Kobi");
		user.setBirthday(new Date());
		HibernateUtils.add(user);//添加
		user.setName("Jams");
		HibernateUtils.update(user);//修改
		HibernateUtils.delete(user);//删除
		User user1 = (User) HibernateUtils.findById(User.class, user.getId());//查找
		System.out.println(user1.getName());
		
	}
}



总结:了解了Hibernate的基本作用,学会了使用其来进行增删改查操作,算是工作之余的一点收获吧,以后还得继续坚持发帖,不断学习!



评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值