Hibernate中Session增删改查操作代码详解
把三状态转换图放在这,方便分析方法的作用:
1.session的save()方法
session是hibernate所有接口中最重要的接口,提供了对数据保存,更新,查询和删除的方法。
session的save()方法可以使临时态或游离态转换为持久态。例如,保存一个customer对象:
sessionfactory sessionfactory; configuration configuration = new configuration().configure(); sessionfactory = configuration.buildsessionfactory(); session session = sessionfactory.opensession(); transaction tr = session.begintransaction(); //1.创建customer对象 customer c1 = new customer(); c1.setid(new long(1)); c1.setname("test"); c1.setemail("123456789@qq.com"); c1.setpassword("123456"); c1.setaddress("世外桃源"); //2.调用session的save()方法,将customer对象持久化 session.save(c1); tr.commit(); session.close();
save()方法主要做了以下三件事:
(1)将new创建的临时态的customer对象放入缓存,使其持久化。
(2)同时根据对象关系映射文件中设置的oid生成器,即主键生成方式给该对象生成一个唯一的oid。
<!--设置主键--> <idname="id"column="id"type="long"> <!--主键生成方式--> <generatorclass="increment"/> </id>
在这个地方有一个疑问,创建对象时setid()方法是否是为该对象持久化生成主键,其实不是,setid并没有按照我们设定的那样生成主键,而是靠对象关系映射文件配置的主键生成方式生成主键,可以多运行几次,主键自增长,从数据库可以看到多条数据,主键从1开始,所以可以知道setid()
没有设置主键,否则数据库主键唯一性校验都过不去。
我们也可以手动设置主键值,必须重载save()方法,使用重载方法save(c1,newlong(1)),每次手动设置。
(3)计划执行insert语句。注意,insert语句并没有立刻执行,只有当session清理缓存时,才会执行insert语句。tr.commit()事务提交。
2.session的update()方法
使游离态对象变成持久态对象。例如:
sessionfactory sessionfactory; configuration configuration = new configuration().configure(); sessionfactory = configuration.buildsessionfactory(); session session1 = sessionfactory.opensession(); transaction tr1 = session1.begintransaction(); //1.创建customer对象 customer c1 = new customer(); c1.setid(new long(1)); c1.setname("test"); c1.setemail("123456789@qq.com"); c1.setpassword("123456"); c1.setaddress("世外桃源"); //2.调用session的save()方法,将customer对象持久化 session1.save(c1); tr1.commit(); session1.close(); //3.将游离态的对象更新,发现改变,执行update语句 session session2 = sessionfactory.opensession(); transaction tr2 = session2.begintransaction(); c1.setaddress("测试update"); session2.update(c1); tr2.commit(); session2.close();
session的update()注意做以下事:
(1)把游离态的customer对象从新加入session缓存中,使其变成持久化对象。
(2)执行update语句。跟save()执行insert语句一样,并不是立刻执行update语句,需要等缓存清空时,把customer对象组装成update语句,
然后再执行。
注意,即使customer没有改变,默认情况下,缓存清除时也会组装update语句,如果需要设置成改变成才执行update语句,需要设置对象关系映射文件。
3.session的saveorupdate()方法
saveorupdate()方法包含save()和update()方法的功能,根据传入参数状态,调用不同方法。传入临时态对象调用save()方法,如果传入游离态对象调用
update()方法。传入持久态对象返回。所以,每次我们只需传入对象,saveorupdate()方法,自动判断传入对象状态的状态,动态调用处理方法。
该方法如何判断传入对象的状态?当满足以下任意一个条件时,就是临时态:
(1)java对象的oid为null,说明该对象没有别实例化,即使被实例化,也是游离态被删除后变成临时态的对象,这种情况下的对象为临时态。
(2)如果java对象具有版本控制(version),版本号为null的,也就是没有该对象的版本号。
(3)自定义拦截器,调用isunsaved()返回值为true。
4.session的load()和get()方法
这两个方法都是根据oid,从数据库中加载一个持久化对象。持久化对象放在session缓存中,可以根据不同的需要操作该持久化对象。
两者区别:
当数据库中oid没有对应记录时,load()抛异常,get()返回null。
5.session的delete()方法
delete()顾名思义删除,用于从数据库中删除java对象对应的记录。
delete()如果传入持久化对象,组装delete语句,执行删除;如果传入游离态对象,hibernate先把游离态关联到session,变成持久态,再生成delete语句,
执行删除。
都是只有当session缓存清空时,才执行。
以上执行都是一个对象,对应一条记录。
可以用session.delete("fromcustomerwhere....");后面加上条件删除多条数据。
sessionfactory sessionfactory; configuration configuration = new configuration().configure(); sessionfactory = configuration.buildsessionfactory(); session session1 = sessionfactory.opensession(); transaction tr1 = session1.begintransaction(); //1.创建customer对象 customer c1 = new customer(); c1.setid(new long(1)); c1.setname("test"); c1.setemail("123456789@qq.com"); c1.setpassword("123456"); c1.setaddress("世外桃源"); //2.调用session的save()方法,将customer对象持久化 session1.save(c1); tr1.commit(); session1.close(); //3.将游离态的对象关联到session,持久化后清除缓存,执行delete语句;放入持久态的直接删除; session session2 = sessionfactory.opensession(); transaction tr2 = session2.begintransaction(); session2.delete(c1); tr2.commit(); session2.close();
执行结果,控制台输出:
hibernate: select max(id) from customers
hibernate: insert into customers (name, email, password, phone, address, sex, is_married, description, image, birthday, registered_time, id) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
hibernate: delete from customers where id=?
总结
以上就是本文关于hibernate中session增删改查操作代码详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
推荐阅读
-
Hibernate中Session增删改查操作代码详解
-
详解使用pymysql在python中对mysql的增删改查操作(综合)
-
php中操作memcached缓存进行增删改查数据的实现代码,phpmemcached_PHP教程
-
php中操作memcached缓存进行增删改查数据的实现代码,phpmemcached
-
php中操作memcached缓存进行增删改查数据的实现代码
-
Hibernate中Session增删改查操作代码详解
-
hibernate通过session实现增删改查操作实例解析
-
php中操作memcached缓存进行增删改查数据的实现代码
-
MyBatis对MySQL数据库的增删改查操作代码详解
-
java中JDBC增删改查操作详解