Hibernate中对增删改查的小结

Hibernate中对增删改查的小结
mysql中库表News,字段如下
id      |  int     |  auto_increment  |  primary key
title   |  varchar
content |  varchar
date    |  varchar

1:Hibernate的insert操作
        Session session = HibernateSessionFactory.getSession();
       
        News news = new News();
        news.setContent("my content");
        news.setTitle("my title");
        news.setDate("my date"); //news是VO
       
        Transaction trans = session.beginTransaction();
        session.save(news); //news是PO
        trans.commit();     //任何有关数据库更新的操作都是commit后进数据库的

        HibernateSessionFactory.closeSession();

 

2:Hibernate的update操作
        Session session = HibernateSessionFactory.getSession();

        News news = new News();
        news.setId(103);  //id不可少,Hibernate只通过id来查找数据库
        news.setContent("update content");
        news.setTitle("update title");
       
        Transaction trans = session.beginTransaction();
        session.update(news);
        trans.commit();

        HibernateSessionFactory.closeSession();

 

注意这里我们更新数据不想对date进行更新,所以没写 setDate ,但Hibernate会认为我们是想把date设置为null,所以如果要更新表中一些字段,最好用下面的方法。

        Session session = HibernateSessionFactory.getSession();

        Transaction trans = session.beginTransaction();
        News news = (News)session.get(News.class, 103);  //*****(1)
        news.setDate("update date");  //*****(2)
        session.save(news);  //*****(3)
        trans.commit();

        HibernateSessionFactory.closeSession();

 

这里其实对数据库进行了两次操作,(1)时从数据库中把相应纪录查找出来,这里news是一个PO,(2)对PO进行date的更新,其他数据没变,然后(3)保存,由于(1)查出的数据就有title,content,所以保存时候title和content都不会是null。

3:Hibernate的delete操作
        Session session = HibernateSessionFactory.getSession();

        Transaction trans = session.beginTransaction();
        News news = new News();
        news.setId(8);  //用下面那句效果一样,只是多了句select
//      News news = (News)session.get(News.class, 8);

        session.delete(news);
        trans.commit();

        HibernateSessionFactory.closeSession();

 
注意,只能通过id来删除数据,不能通过title或content来删除,会报缺少标示符错误。

使用hql来删除(可作批量删除)
        Session session = HibernateSessionFactory.getSession();
        String hql = "delete Billdetail where name>'detailName1'";
        Query query = session.createQuery(hql);
        int ref = query.executeUpdate();
        session.beginTransaction().commit();
        System.out.println("delete dates=>"+ref); //操作条数

        session.close();
 
1.criteria查询
        Session session = HibernateSessionFactory.getSession();

        Criteria c = session.createCriteria(News.class);//News是类,所以N大写
        c.add(Expression.lt("date", "date5"));
        c.add(Expression.between("date", "date1", "date8"));
        c.addOrder(Order.desc("date"));


        List<News> list = c.list();
        for(int i=0;i<list.size();i++)
        {
            System.out.println(list.get(i).getId()+":"+list.get(i).getDate());
        }

        HibernateSessionFactory.closeSession();

 

比较符合面向对象的概念,因为库表和JAVA类已经作了映射关系,注意Hibernate的所有操作都是针对JAVA类的,而不是库表,所以要区分大小写。
上面的查询相当于sql是: select * from news where date < 'date5' and date BETWEEN 'date1' and 'date8' ORDER by date desc;

2.HQL查询
        Query query = session.createQuery("from News ");
        List<News> list = query.list();  //遍历同上

 

HQL是Hibernate主推的查询方式,和普通SQL语句也比较接近,但很重要一点不同就是HQL中from后面的是JAVA类名,不是库表名,切忌!!!其它就是如果查询全字段 "select *" 可以省略不写。

当不是查询全字段,或者是从两张表中联合查询数据时,返回的是一个数组:
        Session session = HibernateSessionFactory.getSession();

        Query query = session.createQuery("select n.id,n.title,u.username from News as n,User u");
        List list = query.list();//这里每一行都是一个1维数组
        for(int i=0;i<list.size();i++)
        {
            Object []o = (Object[])list.get(i);  //转型为数组
            int id = (Integer)o[0];  //和select中顺序的类型相对应,可以是类
            String title = (String)o[1];
            String username = (String)o[2];
            System.out.println("id:"+id+" , "+"title"+title+" , "+username);
        }

        HibernateSessionFactory.closeSession();

 

查询结果集的大小(和Hibernate2中稍微有点不同)
(Integer)session.createQuery("select count(*) from User").iterate().next();
 


3.SqlQuery查询
        List<News> list = session.createSQLQuery("select * from News").addEntity(News.class).list(); 

 

addEntity 不能忘记,这种查询方式是把查询好的结果放到一个实体中,再遍历操作,不推荐使用。

SqlQuery查询一些字段时候用addScalar:
SQLQuery query = session.createSQLQuery("select id,title from News");
        query.addScalar("id", Hibernate.INTEGER);  //注册字段类型,同下
        query.addScalar("title",new org.hibernate.type.StringType());
        List list = query.list();
        for(int i=0;i<list.size();i++)
        {
            Object[] o = (Object[])list.get(i);
            int id = (Integer)o[0];
            String title = (String)o[1];
            System.out.println("id:"+id+" , title:"+title);
        }
 

javabean的属性可以作为命名的查询参数(HQL)
        Session session = HibernateSessionFactory.getSession();
        Transaction trans = session.beginTransaction()

        Query query = session.createQuery("from room in class Room where room.name=:a")
        query.setParameter("a", "room1");  //和prepareStatement相似

      
 

//     Room room1 = new Room(); 
//     room1.setName("room1");    
//     Query query = session.createQuery("from room in class Room where room.name=:name");  //如果用javabean设置参数来查询,=:name的name一定和Room中对应
//     query.setProperties(room1);
 

       
        List<Room> list = query.list();
        for(int i=0;i<list.size();i++)
        {
            System.out.println(list.get(i).getName()+":"+list.get(i).getDescription());
        }
       
        trans.commit();
        HibernateSessionFactory.closeSession()
 

转载于:https://www.cnblogs.com/qinqinmeiren/archive/2010/09/06/2151709.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/263796.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ replace replace_if replace_copy replace_copy_if

#include <iostream>#include <list>#include <algorithm>#include <iterator>#include <functional> using namespace std; int main(){  list<int> list1;  list<int> list2; for (int k0;k<10;k)  {    list1.push_…

oracle追加index,oracle add index

1.索引分类a) 唯一索引, 作用是数据约束&#xff0c;保证数据唯一&#xff0c;还有就是数据索引&#xff0c;提高查询效率b)一般索引&#xff0c;只有数据索引的作用&#xff0c;2.唯一索引的建立create unique index 索引名on 表名(字段名)ok,假设有一个Emploeyy表&#xff0c…

centons7网卡配置文件使用openvswitch bridge

今天发现还有另外的方法给ovs添加bridge、绑定网卡等操作&#xff0c;此前我都是这般操作ovs-vsctl add-br br-ex; ovs-vsctl add-port br-ex eth0&#xff0c;这样操作的结果会保存在openvswitch的conf.db里面。现在只需要在网卡配置文件中指定即可&#xff0c;适用于网卡数量…

Linux进程线程学习笔记:运行新程序

Linux进程线程学习笔记&#xff1a;运行新程序 周银辉 在上一篇中我们说到&#xff0c;当启动一个新进程以后&#xff0c;新进程会复制父进程的大部份上下文并接着运行父进程中的代码&#xff0c;如果我们使新进程不运行原父进程的代码&#xff0c;转而运行另外一个程序集中的代…

什么是闭包?闭包的优缺点?

什么是闭包&#xff1f;闭包的优缺点&#xff1f; 闭包&#xff08;closure&#xff09;是javascript的一大难点&#xff0c;也是它的特色。很多高级应用都要依靠闭包来实现。 1、变量作用域 要理解闭包&#xff0c;首先要理解javascript的特殊的变量作用域。 变量的作用域无非…

oracle不同库之间传送文件,EXCEL与ORACLE间的数据互传法数据库 -电脑资料

众所周知&#xff0c;MicrosoftExcel能很直观而方便地进行数据输入&#xff0c;统计&#xff0c;生成图表&#xff0c;但它的数据管理能力有限&#xff0c;对大量的数据查询能力不足&#xff0c;如果利用它数据计算方面的优点和大型 数据库 ORACLE的数据查询优点&#xff0c;可…

使用ANT打包Android应用

大家好&#xff0c;今天来分享一下如何使用ANT打包Android应用。 通常我们习惯用eclipse来开发Android程序&#xff0c;它会自动帮我们打包当前的应用程序。如果在Navigator视图下&#xff0c;我们可以看到以下几个文件&#xff1a; 在上图中&#xff0c;com包放置的是我们的cl…

迷你飞信一出,LibFetion该挂了把

飞信确实是个好东西&#xff01; 发短信不要钱 支持群发&#xff0c;这样发个通知什么的&#xff0c;可以轻松搞定 但是以前的飞信客户端太庞大了 好几十M呢 而且光大还多了很多没有用的功能 比如&#xff1a;什么飞信空间啊&#xff0c;网上营业厅&#xff0c;彩信&#xff0c…

oracle t7-2报价,Sun/Oracle T7-2服务器主板7315607全新7318270原装7318240

Sun/OracleT7-2服务器主板7315607全新7318270原装7318240为便于产品发布和因市场行情随时变动&#xff0c;产品所有信息及价格请以实际咨询为准&#xff01;谢谢&#xff01;&#xff01;Sun/Oracle T7-2服务器主板7315607 System Board Assembly 7318270•530-3510 Interlock …

OSI

OSI&#xff08;开放系统互联(Open System Interconnection)&#xff09; OSI是Open System Interconnection的缩写&#xff0c;意为开放式系统互联。国际标准化组织&#xff08;ISO&#xff09;制定了OSI模型&#xff0c;该模型定义了不同计算机互联的标准&#xff0c;是设计和…

asp.net发送邮件时在正文中插入图片

#region 发送邮件 /// <summary> /// 通过附件发送邮件 /// </summary> /// <param name"emailFrom">发送人邮箱地址</param> /// <param name"files">图片地址</param>/// <param na…

Java设计模式(1)工厂模式(Factory模式)

工厂模式定义&#xff1a;提供创建对象的接口。 为何使用工厂模式 工厂模式是我们最常用的模式了&#xff0c;著名的Jive论坛&#xff0c;就大量使用了工厂模式&#xff0c;工厂模式在Java程序系统可以说是随处可见。为什么工厂模式是如此常用&#xff1f;因为工厂模式就相当于…

cmd使用另一个Oracle的sid,(转发备用)Oracle SID在本机上已经存在,请指定一个不同的SID”的解决办法...

(转发备用)Oracle SID在本机上已经存在,请指定一个不同的SID”的解决办法(2014-04-30 10:57:17)1、 开始&#xff0d;&#xff1e;设置&#xff0d;&#xff1e;控制面板&#xff0d;&#xff1e;管理工具&#xff0d;&#xff1e;服务 停止所有Oracle服务。2、 开始&#xff0…

$Poj1952\ $洛谷$1687\ Buy\ Low,Buy\ Lower$ 线性$DP+$方案计数

Luogu Description 求一个长度为n的序列a的最长下降子序列的长度,以及这个长度的子序列种数,注意相同的几个子序列只能算作一个子序列. n<5000,a[i]不超过long范围 Sol 求最长下降子序列的长度: 1.f[i]表示以a[i]结尾的最长下降子序列长度 2.f[i]表示以i结尾的最长下降子序列…

阻塞和非阻塞通信

同步、异步、阻塞和非阻塞是几种基本的sockets调用方式&#xff0c;也是在进行网络编程时需要理解和区分的基本概念之一。关于这方面的文章和讨论相当丰富&#xff0c;这里着重讨论其中两个比较容易混淆的两个&#xff0c;即非阻塞与异步的关系。 先还是简单所列一下几中调用方…

我和《Visual c++2013入门经典(第7版)》的那些事

前言 笔者今天有幸看到了Visual c2013入门经典&#xff08;第7版&#xff09;&#xff0c;这一本书&#xff0c;回想之前看过些书的2010的版本&#xff0c;陪伴我渡过了漫长的C基础学习之路&#xff0c;下面我将讲述对《Visual c2013入门经典&#xff08;第7版&#xff09;》看…

oracle中的mount是什么意思,oraclenomountmountopen直接的关系

startup nomount startup mount startup open (startup的默认选项) 其他常用的参数&#xff1a;read only ,read write ,force,restrict 这些参数可以一起使用,比如 startup 与 startup open read write 是一样的效果。 Oracle的启动过程&#xff1a;启动实例 - 装载数据库 - 打…

JavaScript中的各种宽高以及位置总结

在javascript中操作dom节点让其运动的时候&#xff0c;常常会涉及到各种宽高以及位置坐标等概念&#xff0c;如果不能很好地理解这些属性所代表的意义&#xff0c;就不能理解js的运动原理&#xff0c;同时&#xff0c;由于这些属性概念较多&#xff0c;加上浏览器之间 实现方式…

C# 制作Com组件:java调用.net DLL的方法

本文将详细为大家介绍一个java调用.net DLL的方法&#xff0c;以实现特殊的客户的特殊要求&#xff1a;“在Java项目中必须使用其提供的用.net写的DLL加密机制&#xff01;” 环境与工具&#xff1a; ◆.net framework 3.5 C# ◆java jdk1.5&#xff0c; Tomcat 5.5 ◆jacob-1.…

MySQL 8.0索引合并

简介参考https://dev.mysql.com/doc/refman/8.0/en/index-merge-optimization.html#index-merge-intersection。索引合并是通过多个range类型的扫描并且合并它们的结果集来检索行的。仅合并来自单个表的索引扫描&#xff0c;而不是跨多个表的索引扫描。合并会产生底层扫描的三种…