Hibernate学习---用Session实现CURD

我们使用Hibernate的目的是什么?对数据库进行操作,所有接下来我们就用Hibernate来进行CURD。

前边我们已经分析过了Configuration,SessionFactory和Session,接下来我们就利用Session对象来进行增删改查:

在进行增删改查之前我们先对SessionFactory和Session进行一些简单的封装:

public class hbnUtil {
    private static SessionFactory factory;
    
    public static Session getSession() {
        return getSessionFactory().getCurrentSession();
    }
    
    public static SessionFactory getSessionFactory() {
        Configuration cfg = new Configuration().configure();//因为SessionFactory是重量级的,所以创建的时候要进行判断
        if(factory==null||factory.isClosed()) {
            factory = cfg.buildSessionFactory();
        }
        
        return factory;
    }
}

这样以后我们使用到Session实例对象的时候就能够进行直接获取了。

增加操作:

之前配置Hibernate的测试代码便是save操作,即增加一条记录。 还有一个方法也能够增加,叫做persist。 下面这段出自:http://blog.csdn.net/u010739551/article/details/47253881 Hibernate 之所以提供与save()功能几乎完全类似的persist()方法,一方面是为了照顾JPA的用法习惯。另一方面,save()和 persist()方法还有一个区别:使用 save() 方法保存持久化对象时,该方法返回该持久化对象的标识属性值(即对应记录的主键值);但使用 persist() 方法来保存持久化对象时,该方法没有任何返回值。因为 save() 方法需要立即返回持久化对象的标识属性,所以程序执行 save() 会立即将持久化对象对应的数据插入数据库;而 persist() 则保证当它在一个事物外部被调用时,并不立即转换成 insert 语句, 这个功能是很有用的,尤其当我们封装一个长会话流程的时候,persist() 方法就显得尤为重要了。 主要内容区别: 1,persist把一个瞬态的实例持久化,但是并"不保证"标识符(identifier主键对应的属性)被立刻填入到持久化实例中,标识符的填入可能被推迟到flush的时候。 2,save, 把一个瞬态的实例持久化标识符,及时的产生,它要返回标识符,所以它会立即执行Sql insert

删除操作:

public class TestDelete {
    public static void main(String[] args) {
        Session session  = hbnUtil.getSession();
        session.beginTransaction();
        Student student = new Student();
        student.setId(1);
        session.delete(student);
        session.getTransaction().commit();  
    }
}

因为我们指定的主键是id,所以进行删除的时候对主键为1的记录进行删除。

更新操作:

public class TestUpdate {
    public static void main(String[] args) {
        Session session  = hbnUtil.getSession();
        session.beginTransaction();
        Student student = new Student("李四",22,65);
        student.setId(2);
        session.update(student);
        session.getTransaction().commit();
    }
}

查操作:

        Session session  = hbnUtil.getSession();
        session.beginTransaction();
        Student student = session.get(Student.class,2);
        System.out.println(student.toString());
        session.getTransaction().commit();

查询还有一个方法叫做load方法(延迟加载),get方法当检索不到时候返回null而load方法会抛出错误。这里我们只需要知道load这个方法存在并且查询不到时会抛出错误就好了,具体的细节我们后面慢慢讨论。

saveOrUpdate: 这个操作当存在id时执行update,当不存在id时执行save。

注意:当增改删在同一个事务的时候,hibernate默认执行顺序是增改删但是可以通过刷新Session缓存来进行分割,对想要先执行的操作进行优先处理。 比如你想先执行删除操作: session.delete(student); session.flush(); session.save("xxx"); 像上面的这种方法就实现了删除优先。

到这里我们的基本增删改查就结束了,关于Hibernate的学习未完待续。 2017-11-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏雪胖纸的玩蛇日常

第三章 函数与变量

15640
来自专栏大内老A

通过定义UnityContainer扩展变”Explicit Interception”为”Automatic Interception”

Unity是微软P&P部门开发的一个轻量级IoC框架,通过Interception机制可以实现基于三种拦截机制的AOP。不过Unity仅仅提供“显式”拦截机制,...

22190
来自专栏爱撒谎的男孩

struts2之配置拦截器

49150
来自专栏Google Dart

Dart 服务端开发 shelf_bind 包

shelf_bind倾向于约定优于配置,因此您可以编写必要的最小代码,但仍然可以根据需要覆盖默认值。

10520
来自专栏别先生

Hibernate之集合映射的使用(Set集合映射,list集合映射,Map集合映射)

a:数据库的相关知识:   (1):一个表能否有多个主键:不能;   (2):为什么要设置主键:数据库存储的数据都是有效的,必须保持唯一性;   (3)...

345100
来自专栏技术博文

Js的cookie和session

 Cookie的概念:保存在客户端一个字符串属性,读取cookie的值时,得到一个字符串;cookie除了name名和value值外,还有expires过期时间...

32740
来自专栏大前端_Web

NodeJS学习三之API

版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。 https://blog.csdn.net/wkyseo/articl...

14030
来自专栏13blog.site

org.thymeleaf.exceptions.TemplateProcessingException: Exception evaluating SpringEL expression

前言 本文中提到的解决方案,源码地址在:springboot-thymeleaf,希望可以帮你解决问题。 本文中涉及的两个异常为我开发时遇到的,可能和你目前所要...

50030
来自专栏安恒网络空间安全讲武堂

二进制学习系列-栈溢出之Passcode详解

概念:每一个外部定义的符号在全局偏移表(Global offset Table)中有相应的条目,GOT位于ELF的数据段中,叫做GOT段。

17640
来自专栏技术博文

PHP文件操作类

<?php /*************************************************************************...

36160

扫码关注云+社区

领取腾讯云代金券