session进行增删改查操作
一般将针对数据库的操作放在事物里面,
开始事物:session.beginTransaction();
获取事物:session.getTransaction();
提交事物:transaction.commit();
事物回滚:transaction.rollback();
提交事物和事物回滚中的transaction使用session.getTransaction()获得。
我是这样使用的:
- Transaction transaction=session.beginTransaction();
- try{
- session.save(student);
- transaction.commit();
- }catch(Exception e){
- System.out.println("插入数据失败");
- transaction.rollback();
- }
增:
使用session.save(p);
p为持久化类的实例对象
删:
分两步,先查再删。
首先找到要针对操作的持久化对象。可以使用session.get()和session.load()方法得到,也可以直接声明现成的实例化对象
- public void delete(int id){ //删
- session=getSession();
- session.beginTransaction();
- try{
- //Student s=session.load(Student.class, id);
- Student s=new Student();
- s.setId(2);
- s.setName("张三");
- s.setDescription("一个顽皮的孩子!");
- session.delete(s);
- session.getTransaction().commit();
- }catch(Exception e){
- System.out.println("删除数据失败");
- session.getTransaction().rollback();
- }
- }
改:
也是分为两步,前面查,后面改
两种方式:
1、session.flush()
改主要是先使用对象属性的set()针对该持久化对象的值的覆盖,然后使用session.flush()进行强制刷新
注意:改操作的持久化类对象必须是查询出来的,否则不起效果
demo:
- public void change(){ //改
- session=getSession();
- Transaction transaction=session.beginTransaction();
- try{
- Student s=session.load(Student.class, 1);
- s.setName("guodaxia");
- s.setDescription("a bad boy!");
- s.setId(1);
- session.flush();//强制刷新提交
- transaction.commit();
- }catch(Exception e){
- System.out.println("删除数据失败");
- transaction.rollback();
- }
- }
2、使用session.update(Object obj)方法
obj不限定是必须查询出来的,可以使用实例化的合适对象
demo:
- public void change(){ //改
- Transaction transaction=session.beginTransaction();
- try{
- /*Student s=session.load(Student.class, 1);
- s.setName("guodaxia");
- s.setDescription("a bad boy!");
- s.setId(1);
- session.flush();//强制刷新提交
- */
- Student s=new Student();
- s.setId(1);
- s.setName("daxia");
- s.setDescription("a good boy!");
- session.update(s);
- transaction.commit();
- }catch(Exception e){
- System.out.println("更改数据失败");
- transaction.rollback();
- }
- }
查:
已知标志列:
使用session.get()或者session.load()方法
语法相似,demo:
- public void query(int id){ //查
- Transaction transaction=session.beginTransaction();
- try{
- //Student s=(Student)session.get(Student.class, id);//使用get()
- Student s=session.load(Student.class, id);
- System.out.println("s.id:"+s.getId());
- System.out.println("s.name:"+s.getName());
- System.out.println("s.description:"+s.getDescription());
- transaction.commit();
- }catch(Exception e){
- System.out.println("查询数据失败");
- transaction.rollback();
- }
- }
get()和load()的区别:
检索不到结果:load()抛出NotFoundException,get()返回null
检索机制:get()先查询一级缓存,再查询数据库,load()先在session一级缓存上查找,再在二级缓存中查找,最后查找数据库。load方法支持延迟加载lazy(这个我不太熟)
根本区别:load()使用的是代理对象,get()使用的是实体类对象。什么是代理对象?代理对象只有在实际使用该对象的时候才会才会进行再二级缓存或数据库的查询
观察:
在前面的demo中观察分别使用load()和get()方法时候的输出的id和sql语句的顺序可以发现代理对象是只有针对对应的对象操作的时候才会执行数据库等的查询
demo:
- package com.hibernate.manager;
- import org.hibernate.Session;
- import org.hibernate.SessionFactory;
- import org.hibernate.Transaction;
- import org.hibernate.cfg.Configuration;
- import com.hibernate.bean.Student;
- import com.util.HibernateUtil;
- public class StudentManager {
- private static final ThreadLocal<Session> threadLocal=new ThreadLocal<Session>();
- static SessionFactory sessionFactory=HibernateUtil.getSessionFactory();
- static Session session=null;
- public static Session getSession(){
- Session session=(Session)threadLocal.get();
- if(session==null||session.isOpen()==false){
- if(sessionFactory==null){
- rebuildSessionFactory();
- }
- session=sessionFactory!=null?sessionFactory.openSession():null;
- threadLocal.set(session);
- }
- return session;
- }
- private static void rebuildSessionFactory() {
- sessionFactory=new Configuration().configure().buildSessionFactory();
- }
- public static void main(String[] args){
- session=getSession();
- StudentManager sm=new StudentManager();
- /*Student s=new Student();
- s.setId(2);
- s.setName("张三");
- s.setDescription("一个顽皮的孩子!");
- sm.add(s);*/
- //sm.query(2);
- //sm.delete(2);
- //sm.change();
- sm.query(1);
- }
- public void add(Student student){ //增
- Transaction transaction=session.beginTransaction();
- try{
- session.save(student);
- transaction.commit();
- }catch(Exception e){
- System.out.println("插入数据失败");
- transaction.rollback();
- }
- }
- public void delete(int id){ //删
- session.beginTransaction();
- try{
- Student s=session.load(Student.class, id);
- /*Student s=new Student();
- s.setId(2);
- s.setName("张三");
- s.setDescription("一个顽皮的孩子!");*/
- session.delete(s);
- session.getTransaction().commit();
- }catch(Exception e){
- System.out.println("删除数据失败");
- session.getTransaction().rollback();
- }
- }
- public void change(){ //改
- Transaction transaction=session.beginTransaction();
- try{
- Student s=session.load(Student.class, 1);
- s.setName("guodaxia");
- s.setDescription("a bad boy!");
- s.setId(1);
- session.flush();//强制刷新提交
- transaction.commit();
- }catch(Exception e){
- System.out.println("删除数据失败");
- transaction.rollback();
- }
- }
- public void destory(){
- session.close();
- }
- public void query(int id){ //查
- Transaction transaction=session.beginTransaction();
- try{
- Student s=(Student)session.get(Student.class, id);//使用get()
- Student s1=(Student)session.get(Student.class, id);
- //Student s=session.load(Student.class, id);
- //Student s1=session.load(Student.class, id);
- System.out.println("s.id:"+s.getId());
- System.out.println("s.name:"+s.getName());
- System.out.println("s.description:"+s.getDescription());
- System.out.println("s1.id:"+s1.getId());
- System.out.println("s1.name:"+s1.getName());
- System.out.println("s1.description:"+s1.getDescription());
- transaction.commit();
- }catch(Exception e){
- System.out.println("查询数据失败");
- transaction.rollback();
- }
- }
- }
总结:
session.sava(Object obj);
session.delete(Object obj);
session.update(Object obj);||先查询对应的数据库中的映射对象,setXXX()进行修改,再session.flush()强制提交
session.get(Class cls,ID id) ||session.load(Class cls,ID id)
使用查询语句查询见后文。
session进行增删改查操作的更多相关文章
- MyBatis批量增删改查操作
前文我们介绍了MyBatis基本的增删该查操作,本文介绍批量的增删改查操作.前文地址:http://blog.csdn.net/mahoking/article/details/43673741 ...
- Hibernate5笔记2--单表的增删改查操作
单表的增删改查操作: (1)定义获取Session和SessionFactory的工具类: package com.tongji.utils; import org.hibernate.Session ...
- 后盾网lavarel视频项目---lavarel使用模型进行增删改查操作
后盾网lavarel视频项目---lavarel使用模型进行增删改查操作 一.总结 一句话总结: 使用模型操作常用方法 查一条:$model=Tag::find($id); 删一条:Tag::dest ...
- MyBatis学习之简单增删改查操作、MyBatis存储过程、MyBatis分页、MyBatis一对一、MyBatis一对多
一.用到的实体类如下: Student.java package com.company.entity; import java.io.Serializable; import java.util.D ...
- SQLAlchemy02 /SQLAlchemy对数据的增删改查操作、属性常用数据类型详解
SQLAlchemy02 /SQLAlchemy对数据的增删改查操作.属性常用数据类型详解 目录 SQLAlchemy02 /SQLAlchemy对数据的增删改查操作.属性常用数据类型详解 1.用se ...
- SQLAlchemy(二):SQLAlchemy对数据的增删改查操作、属性常用数据类型详解
SQLAlchemy02 /SQLAlchemy对数据的增删改查操作.属性常用数据类型详解 目录 SQLAlchemy02 /SQLAlchemy对数据的增删改查操作.属性常用数据类型详解 1.用se ...
- 学习MyBatis必知必会(5)~了解myBatis的作用域和生命周期并抽取工具类MyBatisUtil、mybatis执行增删改查操作
一.了解myBatis的作用域和生命周期[错误的使用会导致非常严重的并发问题] (1)SqlSessionFactoryBuilder [ 作用:仅仅是用来创建SqlSessionFactory,作用 ...
- mongoVUE的增删改查操作使用说明
mongoVUE的增删改查操作使用说明 一. 查询 1. 精确查询 1)右键点击集合名,再左键点击Find 或者直接点击工具栏上的Find 2)查询界面,包括四个区域 {Find}区,查询条件格式{& ...
- (转)SQLite数据库增删改查操作
原文:http://www.cnblogs.com/linjiqin/archive/2011/05/26/2059182.html SQLite数据库增删改查操作 一.使用嵌入式关系型SQLite数 ...
随机推荐
- 【域名配置】Tomcat外网发布域名配置
1.修改端口 首先,访问服务器时默认的是80端口,tomcat中的server.xml文件直接修改,这里要说明的是如果一个服务器上有多个tomcat的话,修改端口需要注意的是要修改 <Serve ...
- 51nod 1073约瑟夫环
思路传送门 :http://blog.csdn.net/kk303/article/details/9629329 n里面挑选m个 可以递推从n-1里面挑m个 然后n-1里面的x 可以转换成 n里面的 ...
- 用 SwitchHosts设置hotst, 用法示例
涉及到本地默认ip(localhost,127.0.0.1)设置关联地址时,使用XAMPP本地服务器时避免自动跳转设置的域名的一些处理方法 打开此文件,把内容修改如下 # Virtual Hosts# ...
- Unity3D学习笔记(二十二):ScrollView和事件接口
昨天问题 InputField光标被遮挡问题:背景图片输入层级高于光标的层级,把光标弄成子物体,子物体层级高 自制的滑动框,选项怎么对齐,把Template的Pivot.y改为1 分辨率的区别:16: ...
- ActiveMQ 负载均衡与高可用(转载)
一.架构和技术介绍 1.简介 ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线.完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现 2.activemq的 ...
- linux 多进程fork
对于父进程,fork函数返回了子程序的进程号,而对于子程序,fork函数则返回零,这样,对于程序,只要判定fork函数的返回值,就知道自己是处于父进程还是子进程中.
- listener TNS-01189 问题
-- 启动监听,提示已经启动. [oracle@sh ~]$ lsnrctl start LSNRCTL for Linux: Version 12.1.0.2.0 - Production on 0 ...
- R6
RC 的加强版是 R6 , R6 是一个扩展包,能够实现支持公共和私有字段与方法的更有效的引用类,还有一些其他强大的功能.运行以下代码安装这个包:install.packages("R6&q ...
- 音视频学习系列第(三)篇---wav文件的存储和解析
音视频系列 什么是wav wav是一种无损的音频文件格式,wav文件有两部分,第一部分是文件头,记录一些重要的参数信息,如音频的采样率,通道数,数据位宽,第二部分是数据部分,数据部分可以是PCM,也可 ...
- (转)Attribute在.net编程中的应用
Attribute在.net编程中的应用(一)Attribute的基本概念 经常有朋友问,Attribute是什么?它有什么用?好像没有这个东东程序也能运行.实际上在.Net中,Attribute是一 ...