Hibernate框架学习之增删改查

Hibernate框架学习之增删改查

前言

上一小节我们建立一个基于Maven的Hibernate工程,并且完成基本的配置,粗略地了解了Hibernate,接下来这一小节,我们接着上一小节的内容,利用Hibernate来完成简单的增上改查。

封装工具类

为了操作的方面,首先先对Hibernate的基本操作进行一个封装,这样可以提高开发的效率,减少重复代码,封装过程如下所示:

  1. 新建一个包,命名为Utils

  2. 新建一个类,命名为HibernateUtils

  3. 代码抽取

       // 获取Hibernate的配置对象
            Configuration configuration = new Configuration().configure();
            // 建立SessionFactory
            SessionFactory sessionFactory = configuration.buildSessionFactory();
            // 打开session
            Session session = sessionFactory.openSession();
    
            // 所要添加到数据库的学生对象
            Students students = new Students();
            students.setAge(22);
            students.setName("xuhuanfeng");
    
            // 开启事务
            Transaction ts = session.beginTransaction();
            // 将数据添加到数据库
            session.save(students);
            // 提交事务
            ts.commit();
    
            // 关闭对应的连接
            session.close();
            sessionFactory.close();
    
    

    上面的代码是上一小节中使用到的代码,从代码中可以看到,前面几行代码都是重复性,也就是说,每次我们需要获得一个Session对象的时候,都需要这些代码,所以将其抽取出来,形成工具类。

  4. 代码封装

    /**
     * Hibernate 工具类
     * Created by xuhuanfeng on 2017-04-06.
     */
    public class HibernateUtils {
    
        private static SessionFactory sessionFactory;
    
        //私有化构造器
        private HibernateUtils(){}
    
        static {
            Configuration configuration = new Configuration().configure();
            sessionFactory = configuration.buildSessionFactory();
        }
        
        // 获得Session对象
        public static Session openSession(){
            return sessionFactory.openSession();
        }
    
    }
    

增加操作

封装好对应的工具类之后,我们就可以开始增删改查之旅了,首先是增加记录。

增加记录主要的使用到的方法是save方法,这个在上一小节中已经了解过了,具体的操作代码如下所示

    // 增加一个记录
    @Test
    public void testCreate(){

        Session session = HibernateUtils.openSession();

        // 所要添加到数据库的学生对象
        Students students = new Students();
        students.setAge(30);
        students.setName("tom");

        // 开启事务
        Transaction ts = session.beginTransaction();
        // 将数据添加到数据库
        session.save(students);
        // 提交事务
        ts.commit();

        // 关闭对应的连接
        session.close();
    }

需要注意的是,这里的事务是需要开启的,save方法本质上并没有将数据保存在数据库中,只有当事务commit了之后才会同步到数据库中。

运行之后就可以观察到,对应的记录已经添加到数据库中了。

查询操作

接下来是查询操作,主要分为查询单一记录以及查询满足条件的所有记录,查询操作是一个比较复杂的操作,这里只进行简单的单表查询,其他的查询在后面的小节中。

  • 单一记录查询

    单一记录主要是通过主键来获取对应的记录,也就是通过配置了id的属性来获取记录,使用get方法即可。

        // 测试查询
        @Test
        public void testQuery(){
    
            Session session = HibernateUtils.openSession();
            // 获取指定id的记录,这里的id指的是在元数据中配置<id>所对应的元素
            Students students = session.get(Students.class, 1);
            System.out.println(students);
            session.close();
        }
    
    

    Hibernate中同时还提供另外一种获取单一记录的方式,可以使用load方法,两种方法的操作基本一样,如下所示

        // 测试查询
        @Test
        public void testQuery(){
    
            Session session = HibernateUtils.openSession();
            // 获取指定id的记录,这里的id指的是在元数据中配置<id>所对应的元素
            Students students = session.load(Students.class,1);
            System.out.println(students);
            session.close();
        }
    
    

    这两种方式的区别在于,get方法在查询的时候就直接返回了所查询记录的全部内容,而load方法只是返回了具有该主键的对象,只有当使用到该对象的时候,才会去完整地加载该对象,也就是懒操作/ 延迟操作。测试该效果的方式非常简单,只需要将load代码中的session.close(); 与输出的代码交换位置,就可以看到(此时会抛出错误,具体内容为org.hibernate.LazyInitializationException: could not initialize proxy - no Session 具体原因在以后进行分析)

  • 多记录查询

    多记录查询用于查询满足某一条件的所有结果,不过由于所记录查询会涉及到一些HQL的内容,所以这里先不介绍,后面会有一个小节专门讲解Hibernate的所有的查询方式以及各自的特点。

修改操作

修改操作同样有单一的修改操作以及复杂的修改操作,这里只演示简单的修改单一记录的操作。

在Hibernate中,一个比较简单的修改操作是,将该记录取出,然后修改该记录,然后进行更新,具体操作如下所示

    // 修改操作
    @Test
    public void testUpdate(){
        Session session = HibernateUtils.openSession();
        // 获取id为1的学生
        Students students = session.get(Students.class, 1);
        students.setName("jack"); //将名字修改为jack
        students.setAge(33); // 将年龄修改为33

        Transaction ts = session.beginTransaction();
        session.update(students); // 更新该记录
        ts.commit();
        session.close();
    }

查看数据库中的数据就可以发现,id为1的学生的姓名以及年龄已经更改了。

删除操作

删除操作同上,也只演示简单的删除单一记录的操作。

在Hibernate中,最简单的删除操作是指定一个对象的id,并且删除该对象即可,如下所示

    // 删除操作
    @Test
    public void testDelete(){
        Session session = HibernateUtils.openSession();

        // 删除id为1的学生
        Students students = new Students();
        students.setId(1);

        Transaction ts = session.beginTransaction();
        session.delete(students); // 删除该记录
        ts.commit();
        session.close();
    }

查看数据库中的数据就可以发现,id为1的学生的记录已经被删除了。

总结

本小节主要对Hibernate的操作进行一个简单的封装,并且使用Hibernate完成最简单的增删改查操作,Hibernate的学习之路还在继续。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容