zoukankan      html  css  js  c++  java
  • 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异常。

           (本质)区别:(稍后丰上)

    如有任何疑问可联系邮箱: 给我发邮件、或直接联系QQ:1584875179 || 点返回首页

  • 相关阅读:
    Kostya the Sculptor
    Parade
    zoj 1097 普吕弗序列
    API分析——Jquery UI Dialog
    伸缩性和可用性反模式(转)
    可伸缩性最佳实战(转)
    二叉索引树BIT
    RMQ
    线段树(区间树)
    双栈计算算术表达式
  • 原文地址:https://www.cnblogs.com/aeon/p/10090146.html
Copyright © 2011-2022 走看看