封装HibernateUtil(静态单例模式)和增删改查方法

封装HibernateUtil

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {
    //定义常量是为了实现单例,不让随便new
    //ThreadLocal<Session>不是集合,是线程锁,为了单线程安全
    private static final ThreadLocal<Session> lock = new ThreadLocal<Session>();

    private static final SessionFactory factory = buildFactory();
    private static SessionFactory buildFactory() {
        Configuration cfg = new Configuration().configure();//读取 hibernate.cfg.xml 的配置信息
        return cfg.buildSessionFactory();
    }

    public static Session getSession() {
        //先获取线程锁中的session
        Session session = lock.get();

        if (session == null) {//如果没有session就新建一个session赋值给lock
            session = factory.openSession();
            lock.set(session);
        }

        return session;
    }
    public static void closeSession() {

        Session session = lock.get();//先获取线程锁中的session

        if (session != null) {//如果session有值,那么关闭session
            session.close();
            lock.set(null);    //将session关闭之后再给lock赋值null,方便其他线程使用
        }
    }

}

增删改查方法封装,使用时是调取该类中的具体方法即可

import java.util.List;
import org.hibernate.Session;
import org.hibernate.query.Query;
import maya.model.Sto;
import maya.util.SearchItem;

public class StoDAO {
    private Session session = null;
    public StoDAO() {//构造函数,引用HibernateUtil类的getSession方法
        session = HibernateUtil.getSession();
    }

//添加。要用 事务来控制,另外,增、改也需要
    public void insert(Sto data) {
        data = null;
        try {
            session.beginTransaction();//开始事务
            data = new Sto();
            data.setStorno(data.getStorno());
            data.setStorname(data.getStorname());
            data.setStoset(data.getStoset());
            data.setStoaddr(data.getStoaddr());
            data.setWindow(data.getWindow());
            data.setTelno1(data.getTelno1());

            session.save(data);//添加到session中
            session.getTransaction().commit();//提交事务
        } catch (Exception e) {
            session.getTransaction().rollback();//抛出异常,事务回滚至开始
            e.printStackTrace();
        } finally {
            HibernateUtil.closeSession();//关闭事务
        }
    }

//删除
    public void delete(String storno) {
        try {
            Sto data = session.load(Sto.class, storno);//先查出要删除的对象
            if (data != null) {
                session.beginTransaction();
                session.delete(data);//将删除信息添加至session
                session.getTransaction().commit();//提交事务
            }
        } catch (Exception e) {
            e.printStackTrace();
            session.getTransaction().rollback();
        } finally {
            HibernateUtil.closeSession();//关闭
        }
    }

//修改
    public void update(Sto data) {

        try {
            Sto sto = session.get(Sto.class, data.getStorno());//先查出要修改的对象
            if (data != null) {
                session.beginTransaction();//开始事务
                sto.setStorname(data.getStorname());
                sto.setStoset(data.getStoset());
                sto.setStoaddr(data.getStoaddr());
                sto.setWindow(data.getWindow());
                sto.setTelno1(data.getTelno1());

                session.update(sto);//将修改信息添加至session
                session.getTransaction().commit();//提交事务
            }
        } catch (Exception e) {
            e.printStackTrace();
            session.getTransaction().rollback();

        } finally {
            session.close();//关闭
        }
    }

//查单个,不用依靠事务控制
        public Sto select2(String storno) {
            Sto sto = null;
            try {
                sto = (Sto)session.createQuery("from Sto where storno=?")
                        .setParameter(0, storno)//第一个问号用0来表示,第二个问号用1,以此类推
                        .getSingleResult();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                HibernateUtil.closeSession();//调用HibernateUtil类的close方法来关闭
            }
            return sto;
        }
//查集合
    public List<Sto> select() {
        List<Sto> list = null;
        try {
            list = session.createQuery("from Sto").getResultList();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            HibernateUtil.closeSession();
        }
        return list;
    }

}
时间: 2024-10-05 10:44:29

封装HibernateUtil(静态单例模式)和增删改查方法的相关文章

PHP历程(封装的增删改查方法)

db.class.php   主要方法 <?php /** * 数据库配置信息 */ define('DB_HOST','127.0.0.1'); //服务器 define('DB_USER','root'); //数据库用户名 define('DB_PASSWORD','123456'); //数据库密码 define('DB_NAME','TEST'); //默认数据库 define('DB_CHARSET','utf8'); //数据库字符集 define('TIMEZONE',"P

赵雅智_使用SQLiteDatabase提供的增删改查方法及事务

知识点详解:http://blog.csdn.net/zhaoyazhi2129/article/details/9026093 MainActivity.java,User.java,BaseDao.java,UserDao.java同上篇 http://blog.csdn.net/zhaoyazhi2129/article/details/28640195 UserDaoImple.java package com.example.android_sqlite.dao.impl; impor

通用mapper的增删改查方法 留存 备忘

Mybatis通用Mapper介绍与使用 前言 使用Mybatis的开发者,大多数都会遇到一个问题,就是要写大量的SQL在xml文件中,除了特殊的业务逻辑SQL之外,还有大量结构类似的增删改查SQL.而且,当数据库表结构改动时,对应的所有SQL以及实体类都需要更改.这工作量和效率的影响或许就是区别增删改查程序员和真正程序员的屏障.这时,通用Mapper便应运而生-- 什么是通用Mapper 通用Mapper就是为了解决单表增删改查,基于Mybatis的插件.开发人员不需要编写SQL,不需要在DA

Android学习笔记之SQLite数据库的使用及常用的增删改查方法、无sql语句的DRUD方法汇总

(1)目录结构如下: (2)链接数据库的文件:DBHelper.java要继承SQLiteOpenHelper类 package com.lc.sqlite_demo1.db; import android.content.Context; import android.database.DatabaseErrorHandler; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLit

CodeSmith生成的增删改查方法模板源码分享

我是个懒人,喜欢用最少的精力去做更多的事.每每做项目和写一些demo的时候,增删改查都少不了,这些功能写多了就觉得太浪费精力时间,所以就写了个模板,让自己从重复的代码中解放出来. 个人不太会构架,所以模板就是生成一个三层架构,有dal.bll.和model层的项目.对应的数据库是SQL Server 下载链接:https://github.com/lzjluoze/-CodeSmith-/tree/master/NetCms-v1.0 生成演示: 说明:

通用增删改查方法

1.增删改通用的方法 传入SQL语句和SQL占位符 public static Boolean adu(String sql ,Object ...objs) { Boolean f =false; try { Connection con=DBUtil.getconnection(); PreparedStatement pst=con.prepareStatement(sql); for (int i=0;i<objs.length;i++) { pst.setObject((i+1), o

iviewUI 前端静态页面实现增删改查分页

完整代码部分 (仅供参考哈): 1 <template> 2 <div> 3 <label prop="name"> 姓名: </label> 4 <Input v-model="companyName" id="pp" style="width: 120px" placeholder="请输入" />   5 <Button @click=

ADO.NET— 数据库增删改查方法的编写

Command对象 作用:向数据库发送SQL语句 封装"连接对象"和要执行的"SQL语句" 对数据库执行具体操作,提供"增.删.改.查"的方法 属性 CommandText:需要封装的sql语句或者存储过程名称 Connection:Command对象使用的数据库连接对象 方法 ExecuteNonQUery();    执行增.删.改操作 ExecuteScalar();     返回单一结果的查询 ExecuteReader();   返回只

WebApi学习笔记03:使用webapi模板--API帮助--fiddler工具使用--增删改查方法

1.Web项目 1.1概述 前面两个例子,使用的空web模板,它没有引入关于UI框架(Bootstrap,追求代码洁癖的人,也许不会喜欢它),更没有安装API帮助, 这次我们直接选webapi模板项目,但不勾选身份验证…… 1.2创建项目 注:关于身份验证,后面单独例子再说. 这样创建的项目,直接是demo了,可以运行了.(就不截图了) 1.3修改控制器 打开Controllers\ValuesController.cs,修改为: using System.Collections.Generic