dljd_(021-025)_事务及_CRUD
一、开启事务的另一种写法
/** * 保存学生对象 */ public static void testSaveStudent() { Configuration configuration=new Configuration().configure(); SessionFactory sessionFactory=configuration.buildSessionFactory(); Transaction transaction=null; Session session = sessionFactory.getCurrentSession(); try { transaction=session.getTransaction(); //开启事务 transaction.begin(); Student student = new Student("zhangsan", 23, 99.8); session.save(student); //提交事务 transaction.commit(); } catch (Exception e) { if(null!=transaction){ //回滚事务 transaction.rollback(); } } }
二、封装工具类
package edu.aeon.aeonutils.hibernate.getsessionutil; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; /** * [说明]:获取session的工具类 * @author aeon */ public class GetSessionUtil { private static SessionFactory sessionFactory; /** * session获取的第一种写法 * 由于SessionFactory是一个重量级的对象、这样写没获取一次session都要相应的创建一次SessionFactory对象 * 创建与销毁时系统开销大、所以不建议使用 * @return public static Session getSession(){//最好别用 return new Configuration().configure().buildSessionFactory().getCurrentSession(); } */ /** * 通过session工厂获取session * @return */ public static Session getSession(){ return getSessionFactory().getCurrentSession(); } /** * 通过配置文件中的配置的session工厂项来实例化session工厂 * @return */ public static SessionFactory getSessionFactory() { if(null==sessionFactory||sessionFactory.isClosed()){ sessionFactory=new Configuration().configure().buildSessionFactory(); } return sessionFactory; } /** * 测试 * @param args */ public static void main(String[] args) { System.out.println(GetSessionUtil.getSessionFactory()==GetSessionUtil.getSessionFactory());//结果true System.out.println(GetSessionUtil.getSession()==GetSessionUtil.getSession());//结果true System.out.println(GetSessionUtil.getSessionFactory().getCurrentSession()==GetSessionUtil.getSession());//结果true } }
测试结果:
三、封装的工具类进行增删改查操作
package edu.aeon.hibernate.test; import org.hibernate.Session; import org.hibernate.Transaction; import org.junit.Test; import edu.aeon.aeonutils.hibernate.getsessionutil.GetSessionUtil; import edu.aeon.beans.Student; /** * [说明]:hibernate增C删D改U查R * @author aeon * */ public class CRUD { /** * 数据的保存 */ @Test public void save(/*Student student*/){ Transaction transaction=null; try { Session session = GetSessionUtil.getSession(); transaction = session.getTransaction(); /**开启事务*/ transaction.begin(); Student student =new Student("aeon", 22, 99.5); session.save(student); transaction.commit(); System.out.println("保存成功!"); } catch (Exception e) { e.printStackTrace(); transaction.rollback(); System.out.println("保存失败!"); } } /** * 数据的删除 */ @Test public void delete(/*Integer id*/){ Transaction transaction=null; try { Session session = GetSessionUtil.getSession(); transaction = session.getTransaction(); /**开启事务*/ transaction.begin(); Student student = new Student(); student.setStuId(3);//根据主键删除、如果没有主键这个标识是不能删除数据的 session.delete(student); transaction.commit(); System.out.println("删除成功!"); } catch (Exception e) { e.printStackTrace(); transaction.rollback(); System.out.println("删除失败!"); } } /** * 数据的更新 */ @Test public void update(/*Integer id*/){ Transaction transaction=null; try { Session session = GetSessionUtil.getSession(); transaction = session.getTransaction(); /**开启事务*/ transaction.begin(); Student student = session.get(Student.class, 1); student.setStuAge(0); session.update(student); transaction.commit(); System.out.println("更新成功!"); } catch (Exception e) { e.printStackTrace(); transaction.rollback(); System.out.println("更新失败!"); } } /** * 数据的查询 */ @Test public void select(/*Integer id*/){ Transaction transaction=null; try { Session session = GetSessionUtil.getSession(); transaction = session.getTransaction(); /**开启事务*/ transaction.begin(); /** * 两种查询方式 * 1.get(): * 2.load() * 相同点:都是通过主键标识加载对象 * 不同点:(表象):若加载的主键标识不存在时、get()返回null,而load()抛出ObjectNotFoundException * 本质:接下来会提到 */ Student student1 = session.get(Student.class, 11); Student student2 = session.load(Student.class, 11); System.out.println(student1); System.out.println(student2); System.out.println("查询成功!"); } catch (Exception e) { e.printStackTrace(); System.out.println("查询失败!"); } } }
测试增加数据结果截图:
此时数据库截图:
测试查询数据截图:
测试更新操作截图:
此时数据库信息截图如下:
可以看出将t_stuid为4的学生年龄从22岁修改为0了。
测试删除数据结果截图:
此时数据库信息截图如下:
总结:
get()和load()的区别:
相同点:都是通过主键标识来加载对象的。
不同点:(表象)get加载一个不存在的主键对象时返回null、而load()直接抛出ObjectNotFoundException异常。
(本质)区别:(稍后丰上)