一般将针对数据库的操作放在事物里面,

开始事物: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进行增删改查操作的更多相关文章

  1. MyBatis批量增删改查操作

      前文我们介绍了MyBatis基本的增删该查操作,本文介绍批量的增删改查操作.前文地址:http://blog.csdn.net/mahoking/article/details/43673741 ...

  2. Hibernate5笔记2--单表的增删改查操作

    单表的增删改查操作: (1)定义获取Session和SessionFactory的工具类: package com.tongji.utils; import org.hibernate.Session ...

  3. 后盾网lavarel视频项目---lavarel使用模型进行增删改查操作

    后盾网lavarel视频项目---lavarel使用模型进行增删改查操作 一.总结 一句话总结: 使用模型操作常用方法 查一条:$model=Tag::find($id); 删一条:Tag::dest ...

  4. MyBatis学习之简单增删改查操作、MyBatis存储过程、MyBatis分页、MyBatis一对一、MyBatis一对多

    一.用到的实体类如下: Student.java package com.company.entity; import java.io.Serializable; import java.util.D ...

  5. SQLAlchemy02 /SQLAlchemy对数据的增删改查操作、属性常用数据类型详解

    SQLAlchemy02 /SQLAlchemy对数据的增删改查操作.属性常用数据类型详解 目录 SQLAlchemy02 /SQLAlchemy对数据的增删改查操作.属性常用数据类型详解 1.用se ...

  6. SQLAlchemy(二):SQLAlchemy对数据的增删改查操作、属性常用数据类型详解

    SQLAlchemy02 /SQLAlchemy对数据的增删改查操作.属性常用数据类型详解 目录 SQLAlchemy02 /SQLAlchemy对数据的增删改查操作.属性常用数据类型详解 1.用se ...

  7. 学习MyBatis必知必会(5)~了解myBatis的作用域和生命周期并抽取工具类MyBatisUtil、mybatis执行增删改查操作

    一.了解myBatis的作用域和生命周期[错误的使用会导致非常严重的并发问题] (1)SqlSessionFactoryBuilder [ 作用:仅仅是用来创建SqlSessionFactory,作用 ...

  8. mongoVUE的增删改查操作使用说明

    mongoVUE的增删改查操作使用说明 一. 查询 1. 精确查询 1)右键点击集合名,再左键点击Find 或者直接点击工具栏上的Find 2)查询界面,包括四个区域 {Find}区,查询条件格式{& ...

  9. (转)SQLite数据库增删改查操作

    原文:http://www.cnblogs.com/linjiqin/archive/2011/05/26/2059182.html SQLite数据库增删改查操作 一.使用嵌入式关系型SQLite数 ...

随机推荐

  1. 51nod 1201 整数划分 基础DP

    1201 整数划分  基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题  收藏  关注 将N分为若干个不同整数的和,有多少种不同的划分方式,例如:n = 6,{6} ...

  2. 谈谈java中的final关键字

    知识点:final(最终的)关键字修饰类.方法.属性 1.final修饰类:那么这个就无法被继承,如String类.StringBuffer类.System类 2.final修饰方法:被修饰的方法不能 ...

  3. Linux下通过命令行mail发送e-mail

    找到配置文件/etc/mail.rc添加如下行 # vi /etc/mail.rc set from=@qq.com set smtp=smtp.qq.com set smtp-auth-user= ...

  4. Java Selenium 笔记

    目录一.基本语句 1.循环控制(break,continue) 3.字符的替换(replace,repalceFirst,replaceAll,regex) 4.字符串的连接("+" ...

  5. UI 自动化测试 Macaca测试框架 安装时遇到的log

    https://macacajs.github.io/zh/environment-setup macaca run -d ./macaca-test/desktop-browser-sample.t ...

  6. C++指针详解(转)

    指针的概念 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址.要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占 ...

  7. 2017"百度之星"程序设计大赛 - 资格赛-度度熊与邪恶大魔王(dp+后缀最小值)

    度度熊与邪恶大魔王 思路:由于防御和血量的范围很小,所以暴力枚举出对于每种防御造成的每种伤害所需的最小花费,最后只需在伤害大于等于血量的情况下再找到最小花费(这个只需要后缀最小值预处理一下就可以了) ...

  8. OpenGL入门程序三:点、线、面的绘制

    1.点: void TestPoint() { //点的大小默认为一个像素,通过下面的函数可以设置一点的大小 glPointSize(50.0f); glBegin(GL_POINTS); glVer ...

  9. 生物信息Python-从入门到精通?

    Python开发的方向太多了,有机器学习,数据挖掘,网络开发,爬虫等等.其实在生信领域,Python还显现不出绝对的优势,生信的大部分软件流程都是用shell或Perl写的,而且已经足够好用了.我选P ...

  10. win10 自己DIY的arp绑定小脚本

    @echo off&mode con cols=80 lines=22&title ARP_bind Tools setlocal enabledelayedexpansion rem ...