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)