dljd_(021-025)_事务及_CRUD

Posted aeon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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异常。

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

以上是关于dljd_(021-025)_事务及_CRUD的主要内容,如果未能解决你的问题,请参考以下文章

dljd_027_增改删在同一个事务中的默认执行顺序

dljd_017_使用PreparedStatement执行模糊查询

dljd_013_使用PreparedStatement避免SQL注入攻击

dljd_011_jdbc再次封装工具类_把数据库的相关信息写到配置文件中,减低代码的耦合度

dljd_ (004-006)_hibernate框架

dljd_(008-010)_简单的查询