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)

使用查询语句查询见后文。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是使用 Flask 和 SQLAlchemy 进行数据库增删改查操作的示例代码: ```python from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'your_database_uri' db = SQLAlchemy(app) class User(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(50)) @app.route('/create_user', methods=['POST']) def create_user(): new_user = User(name='John') db.session.add(new_user) db.session.commit() return 'User created successfully' @app.route('/update_user/<int:user_id>', methods=['POST']) def update_user(user_id): user = User.query.get(user_id) if user: user.name = 'New Name' db.session.commit() return 'User updated successfully' else: return 'User not found' @app.route('/delete_user/<int:user_id>', methods=['POST']) def delete_user(user_id): user = User.query.get(user_id) if user: db.session.delete(user) db.session.commit() return 'User deleted successfully' else: return 'User not found' @app.route('/get_user/<int:user_id>', methods=['GET']) def get_user(user_id): user = User.query.get(user_id) if user: return f'User ID: {user.id}, Name: {user.name}' else: return 'User not found' if __name__ == '__main__': app.run() ``` 在上述示例代码中,我们定义了一个 `User` 模型类,它映射到数据库中的用户表。我们通过路由来定义不同的操作,包括创建用户、更新用户、删除用户和获取用户。 - `/create_user` 路由用于创建新用户。我们创建一个新的 `User` 对象,将其添加到 `db.session` 中,然后调用 `db.session.commit()` 提交更改到数据库。 - `/update_user/<int:user_id>` 路由用于更新用户。我们通过 `User.query.get(user_id)` 查询到要更新的用户对象,然后修改其属性并提交更改到数据库。 - `/delete_user/<int:user_id>` 路由用于删除用户。我们通过 `User.query.get(user_id)` 查询到要删除的用户对象,然后调用 `db.session.delete(user)` 并提交更改到数据库。 - `/get_user/<int:user_id>` 路由用于获取用户信息。我们通过 `User.query.get(user_id)` 查询到指定的用户对象,并返回其属性。 请注意,上述示例中的 `your_database_uri` 部分需要替换为实际的数据库连接 URI。另外,这只是一个简单的示例,实际的应用中可能需要更复杂的逻辑和错误处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值