Hibernate---curd(增删查改)操作

Hibernate---curd(增删查改操作)

1、curd是什么?

它代表创建(Create)、更新(Update)、读取(Retrieve)和删除(Delete)操作。

2、hibernate增删查改实例如下:

1)新建一个Java工程,添加hibernate支持,连接test数据库,在src下自动生成hibernate.cfg.xml配置文件

2)对t_user表进行hibernate反向生成,新建com.etc.dao包,在包下自动生成TUser.java类和TUser.hbm.xml映射文件

3)配置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">
<!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration>
	<!-- 一个数据库对象,一个SessionFactory对应一个数据库,可以建立多个SessionFactory,从而连接多个数据库 -->
	<session-factory>
		<property name="show_sql">true</property><!--开启sql -->
		<property name="format_sql">true</property><!--格式化sql -->
		<property name="dialect">
			org.hibernate.dialect.MySQLDialect
		</property>
		<property name="connection.url">
			jdbc:mysql://localhost:3306/test
		</property>
		<property name="connection.username">root</property>
		<property name="connection.password">root</property>
		<property name="connection.driver_class">
			com.mysql.jdbc.Driver
		</property>
		<property name="myeclipse.connection.profile">
			com.mysql.jdbc.Driver
		</property>
		<mapping resource="com/etc/dao/TUser.hbm.xml" />
	</session-factory>
</hibernate-configuration>

4)在工程下新建source folder,新建com.etc.test包,在包下新建TUserDAOTest.java类,进行curd操作

5)在工程下新建com.etc.util类,新建HibernateUtil.java类(获取session,为了避免方法中重复写太多的代码)

package com.etc.util;

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

public class HibernateUtil {
	public static Session getSession(){
		//1、得到一个数据库映射SessionFactory
		SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
		//2、打开数据库连接 Session
		Session session = sessionFactory.openSession();
		return session;
	}
}
6)编写TUserDAOTest.java类如下:

package com.etc.dao;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

import com.etc.util.HibernateUtil;

public class TUserDAOTest {
	/**
	 * Description:新增方法(开启事务)
	 * @author zoey
	 * @date 2017年7月25日
	 */
	@Test
	public void testCreate(){
		//1、得到一个数据库映射SessionFactory
		SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
		//2、打开数据库连接 Session
		Session session = sessionFactory.openSession();
		//3、开启事务
		session.beginTransaction();
		//4、做数据库相关的操作
		TUser tuser = new TUser("zoey");
		session.save(tuser);
		//5、提交事务
		session.getTransaction().commit();
	}
	/**
	 * Description:查询可以不写事务(不涉及到增删改)
	 * @author zoey
	 * @date 2017年7月25日
	 */
	@Test
	public void testRetrieve(){
		Session session = HibernateUtil.getSession();
		TUser tuser = (TUser)session.get(TUser.class, 2);//相当于findById(id) select * from ..where id = ?
		System.out.println("username:"+tuser.getUseranme());
	}
	/**
	 * Description:删除方法:先查询,后删除(开启事务)
	 * @author zoey
	 * @date 2017年7月25日
	 */
	@Test
	public void testDelete(){
		Session session = HibernateUtil.getSession();
		session.beginTransaction();
		TUser tuser = (TUser)session.get(TUser.class, 1);//select * from ..where id = ?
		session.delete(tuser);//delete from .. where id = ?
		session.getTransaction().commit();
	}
	/**
	 * Description:修改方法:先查询,后修改(开启事务)
	 * @author zoey
	 * @date 2017年7月25日
	 */
	@Test
	public void testUpdate(){
		Session session = HibernateUtil.getSession();
		session.beginTransaction();
		TUser tuser = (TUser)session.get(TUser.class, 2);//select * from ..where id = ?
		tuser.setUseranme("sss");//update .. set username = ?
		session.getTransaction().commit();
	}
}
7)在java工程左侧的test包下,选择TUserDAOTest.java类,选中下面的某个方法,右键Run As-->JUnit Test,便可以进行测试。JUnit那一栏显示绿色,就表示运行成功。


注意:

1、hibernate.cfg.xml中添加必要的属性配置可以方便许多

使得我们在控制台中看到执行的sql语句

	<property name="show_sql">true</property>
使得我们可以在控制台中看到执行的格式化的sql语句

	<property name="format_sql">true</property>
使得我们可以不必自己在数据库中创建表,hibernate会自动根据配置文件帮我们创建(刚开始时执行一次便可,否则会一直删除表然后重新建表)

	<property name="hbm2ddl.auto">create</property>
create、create-drop 如果表不存在,则自动创建表,如果表已经存在,则删除之后再创建

update 如果表已经存在,则更新表结构(比如增加一个表字段)


2、在hibernate.cfg.xml中需要配置类对应的映射文件(选择hibernate反向生成时,会自动配置,如果是自己写类

和配置文件时,需要记得手动在hibernate.cfg.xml配置文件中加入映射文件的配置,删除类时也要记得删除)

<mapping resource="com/etc/dao/TUser.hbm.xml" />


3、hibernate测试时一般都是使用JUnit测试,因为JUnit测试比较方便,在一个类中可以写多个test方法,相当于在一个类中写多个main方法,可以并行执行。


4、写查询方法时,可以不必开启事务,因为不涉及增删查改操作,而对于增删改操作时,一定要开启事务,否则可能导致出错(A转200元钱给B时,A的账户要减200元,B的账户要增加200元,这两个操作必须同时成功或者同时失败。)

5、Hibernate中的接口如下:

(1)Configuration:配置,用来加载配置文件

SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();

(2)SessionFactory:相当于一个数据库对象

Session session = sessionFactory.openSession();
Session session = sessionFactory.getCurrentSession();
openSession()方法:每次都创建一个新的连接

getCurrentSession()方法:如果连接已经存在,就重用连接,如果连接不存在,则创建一个新的连接

使用这个方法,还需要在hibernate.cfg.xml配置文件中配置一个属性如下:(才可以正常使用)

<property name="current_session_context_class">thread</property>
显然:使用getCurrentSession()方法性能更高,所以,以后尽量使用这个方法。

(3)Session:数据库连接,存在以下操作数据库的方法:

session.get();------>查询方法

session.load();------>查询方法

session.save();----->新增方法

session.delete();---->删除方法

更新方法不存在,先查询之后调用对象的set()方法便可以实现更新操作。
补充:Session的get()方法和load()有什么不用呢?

1、查询的数据存在时:

get()方法直接查询数据库,返回的是真实对象,会立刻查询数据库,直接发起sql

load()方法不直接查询数据库,返回的是一个代理对象,不会立刻查询数据库,直到用到的时候,才会进行查询(比如要输出查询到的值),发起sql

2、查询的数据不存在时:

get()方法正常执行,返回空指针。

load()方法无法正常执行,抛出异常。

效果如下:

调用get()方法时:立刻去查询数据库,程序正常执行,控制台空出null值,JUnit测试正常执行,显示空指针。


调用load()方法时:并没有立刻去查询数据库,而是在要输出值的时候去查询数据库,并且程序没有正常执行,控制台没有输出相应的值,JUnit测试报错,抛出异常

(4)Transaction:事务

session.beginTransaction();----->开启事务

session.getTransaction().commit();---->提交事务

session.getTransaction().rollback();----->回滚事务(数据库不会发生任何改变)

(5)Query:查询接口,使用hibernate的查询语言(hql)


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值