初学者易上手的SSH-hibernate02 三种查询方式
在上一章中已经搭建好了一个hibernate的环境,那么这一章我们就使用这个环境来进行基本CRUD。在这之前我们先了解一个东西:主键生成策略。就是当向数据库表中插入记录的时候,这个记录的主键该如何生成.用法:将hbm.xml文件中<id>节点下的 <generator/>节点中的class 改成以下关键字即可。以下是简介版。推荐使用uuid
01 assigned
主键由外部程序负责生成,在 save() 之前必须指定一个,Hibernate不负责维护主键生成。也就是可以每次指定主键。该方式不推荐
02 increment
这种方式在每次插入前,需要通过“select max(主键) from 表名 ”这种方式先查询最大ID,然后通过ID+1来作为新的主键值。这种方式也不推荐,因为这样会出现线程安全问题。
03 identity
identity由底层数据库生成标识符。identity是由数据库自己生成的,但这个主键必须设置为自增长,使用identity的前提条件是底层数据库支持自动增长字段类型,如DB2、SQL Server、MySQL、Sybase和HypersonicSQL等,Oracle这类没有自增字段的则不支持。
04 sequence
采用数据库提供的sequence机制生成主键,需要数据库支持sequence。如oralce、DB、SAP DB、PostgerSQL、McKoi中的sequence。MySQL这种不支持sequence的数据库则不行
05 hilo
hilo(高低位方式high low)是hibernate中最常用的一种生成方式,需要一张额外的表保存hi的值。保存hi值的表至少有一条记录(只与第一条记录有关),否则会出现错误。可以跨数据库。
06 native
native由hibernate根据使用的数据库自行判断采用identity、hilo、sequence其中一种作为主键生成方式,灵活性很强。如果能支持identity则使用identity,如果支持sequence则使用sequence。
07 uuid
UUID:Universally Unique Identifier,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字,标准的UUID格式为:xxxxxxxx-xxxx-xxxx-xxxxxx-xxxxxxxxxx (8-4-4-4-12)
好了,接下来开始这章的主要内容。hibernate的三种方式实现CRUD。首先在src/test/java文件夹下新建package(com.test),新建类 Test.类中写一个方法叫做temp,加上@Test标记
@Test
public void temp() { }
我们可以在cfg.xml中的<session-factory>节点中添加如下代码,以便在控制台来查看我们提交的sql语句。方便修改错误。
<!--显示sql语句 -->
<property name="show_sql">true</property>
<!--格式化Hibernate的SQL输出语句。 -->
<property name="format_sql">true</property>
在temp方法中写上如下代码:代码写完后选择项目鼠标右键Run As ->Junit Test 运行
第一种:Hibernate提供的Query By Criteria API来查询对象 即QBC。
增加:
//添加一条数据
// 获取配置信息
Configuration configuration = new Configuration().configure();
// 得到Session工厂
SessionFactory factory = configuration.buildSessionFactory();
// 得到Session
Session session = factory.openSession();
// 开启事物
Transaction transaction = session.beginTransaction();
// 实例化对象
Student st = new Student();
st.setName("王五");
st.setSex("男");
st.setAddress("长沙");
//提交数据
session.save(st);
// 提交事物
transaction.commit();
// 关闭seeion
session.close();
// 关闭SessionFactory
factory.close();
查询单个:
// 获取配置信息
Configuration configuration = new Configuration().configure();
// 得到Session工厂
SessionFactory factory = configuration.buildSessionFactory();
// 得到Session
Session session = factory.openSession();
// 开启事物
//Transaction transaction = session.beginTransaction();
// 根据主键得到对象(查询单个记录)
Student st = session.get(Student.class, );
System.out.println(st);
// 提交数据
// session.save(st);
// 提交事物
// transaction.commit();
// 关闭seeion
session.close();
// 关闭SessionFactory
factory.close();
修改:
// 获取配置信息
Configuration configuration = new Configuration().configure();
// 得到Session工厂
SessionFactory factory = configuration.buildSessionFactory();
// 得到Session
Session session = factory.openSession();
// 开启事物
Transaction transaction = session.beginTransaction();
// 根据主键得到对象(查询单个记录)
Student st = session.get(Student.class, );
// 设置修改值
st.setName("李四");
// 提交数据 saveOrUpdate意为:存在修改,不存在增加 修改也可以用Update
session.saveOrUpdate(st);
System.out.println(st);
// 提交事物
transaction.commit();
// 关闭seeion
session.close();
// 关闭SessionFactory
factory.close();
查询所有:
// 获取配置信息
Configuration configuration = new Configuration().configure();
// 得到Session工厂
SessionFactory factory = configuration.buildSessionFactory();
// 得到Session
Session session = factory.openSession();
// 开启事物
// Transaction transaction = session.beginTransaction();
// 查询所有记录
List<Student> ls = session.createCriteria(Student.class).list();
for (Student student : ls) {
System.out.println(student);
}
// 提交数据 saveOrUpdate意为:存在修改,不存在增加 修改也可以用Update
// session.saveOrUpdate(st);
// 提交事物
// transaction.commit();
// 关闭seeion
session.close();
// 关闭SessionFactory
factory.close();
删除:
// 获取配置信息
Configuration configuration = new Configuration().configure();
// 得到Session工厂
SessionFactory factory = configuration.buildSessionFactory();
// 得到Session
Session session = factory.openSession();
// 开启事物
Transaction transaction = session.beginTransaction();
// 根据主键得到对象(查询单个记录)
Student st = session.get(Student.class, );
// 提交数据
session.delete(st);
// 提交事物
transaction.commit();
// 关闭seeion
session.close();
// 关闭SessionFactory
factory.close();
第二种:Hibernate官方推荐的标准查询Hibernate Query Language 即HQl查询
查询所有: 注意:用HQL查询from后面接的是实体类名
// 获取配置信息
Configuration configuration = new Configuration().configure();
// 得到Session工厂
SessionFactory factory = configuration.buildSessionFactory();
// 得到Session
Session session = factory.openSession();
List<Student> ls = session.createQuery("from Student").list();
for (Student student : ls) {
System.out.println(student);
}
// 关闭seeion
session.close();
// 关闭SessionFactory
factory.close();
查询单个属性:
// 获取配置信息
Configuration configuration = new Configuration().configure();
// 得到Session工厂
SessionFactory factory = configuration.buildSessionFactory();
// 得到Session
Session session = factory.openSession();
List<String> ls = session.createQuery("select name from Student").list();
for (String student : ls) {
System.out.println(student);
} // 关闭seeion
session.close();
// 关闭SessionFactory
factory.close();
查询多个属性:object[]实现
// 获取配置信息
Configuration configuration = new Configuration().configure();
// 得到Session工厂
SessionFactory factory = configuration.buildSessionFactory();
// 得到Session
Session session = factory.openSession(); List<Object[]> ls = session.createQuery("select name,sex,age from Student").list();
for (Object[] student : ls) {
System.out.println(student[] + "----" + student[] + "----" + student[]);
} // 关闭seeion
session.close();
// 关闭SessionFactory
factory.close();
查询多个属性:构造方法实现(先要在实体类中重载构造方法)
// 获取配置信息
Configuration configuration = new Configuration().configure();
// 得到Session工厂
SessionFactory factory = configuration.buildSessionFactory();
// 得到Session
Session session = factory.openSession();
List<Student> ls = session.createQuery("select new Student(name,sex) from Student").list();
for (Student student : ls) {
System.out.println(student);
} // 关闭seeion
session.close();
// 关闭SessionFactory
factory.close();
条件查询:
// 获取配置信息
Configuration configuration = new Configuration().configure();
// 得到Session工厂
SessionFactory factory = configuration.buildSessionFactory();
// 得到Session
Session session = factory.openSession();
// List<Student> ls = session.createQuery("from Student where age
// between ? and ?").setInteger(0, 10).setInteger(1, 50).list();
List<Student> ls = session.createQuery("from Student where age between :begin and :end")
.setParameter("begin", ).setParameter("end", ).list();
for (Student student : ls) {
System.out.println(student);
}
// 关闭seeion
session.close();
// 关闭SessionFactory
factory.close();
聚合函数:
// 获取配置信息
Configuration configuration = new Configuration().configure();
// 得到Session工厂
SessionFactory factory = configuration.buildSessionFactory();
// 得到Session
Session session = factory.openSession();
String parm = session.createQuery("select max(age) from Student").uniqueResult().toString();
System.out.println(parm);
// 关闭seeion
session.close();
// 关闭SessionFactory
factory.close();
排序:
// 获取配置信息
Configuration configuration = new Configuration().configure();
// 得到Session工厂
SessionFactory factory = configuration.buildSessionFactory();
// 得到Session
Session session = factory.openSession();
List<Student> ls = session.createQuery("from Student order by age desc").list();
for (Student student : ls) {
System.out.println(student);
}
// 关闭seeion
session.close();
// 关闭SessionFactory
factory.close();
分组:构造方法实现(先要在实体类中重载构造方法)
// 获取配置信息
Configuration configuration = new Configuration().configure();
// 得到Session工厂
SessionFactory factory = configuration.buildSessionFactory();
// 得到Session
Session session = factory.openSession();
// List<Student> ls = session.createQuery("select new
// Student(sex,max(age)) from Student group by sex").list();
List<Object[]> ls = session.createQuery("select sex,max(age) from Student group by sex").list();
for (Object[] student : ls) {
System.out.println(student[] + "--" + student[]);
}
// 关闭seeion
session.close();
// 关闭SessionFactory
factory.close();
Like:
// 获取配置信息
Configuration configuration = new Configuration().configure();
// 得到Session工厂
SessionFactory factory = configuration.buildSessionFactory();
// 得到Session
Session session = factory.openSession();
List<Student> ls = session.createQuery("from Student where name like ?").setParameter(, "%1%").list();
for (Student student : ls) {
System.out.println(student);
}
// 关闭seeion
session.close();
// 关闭SessionFactory
factory.close();
分页:
// 获取配置信息
Configuration configuration = new Configuration().configure();
// 得到Session工厂
SessionFactory factory = configuration.buildSessionFactory();
// 得到Session
Session session = factory.openSession();
List<Student> ls = session.createQuery("from Student").setFirstResult().setMaxResults().list();
for (Student student : ls) {
System.out.println(student);
}
// 关闭seeion
session.close();
// 关闭SessionFactory
factory.close();
修改:
// 获取配置信息
Configuration configuration = new Configuration().configure();
// 得到Session工厂
SessionFactory factory = configuration.buildSessionFactory();
// 得到Session
Session session = factory.openSession();
// 开启事物
Transaction transaction = session.beginTransaction();
session.createQuery("update Student set name = :name where age=10").setParameter("name", "哈哈").executeUpdate(); // 提交事物
transaction.commit();
// 关闭seeion
session.close();
// 关闭SessionFactory
factory.close();
删除:
// 获取配置信息
Configuration configuration = new Configuration().configure();
// 得到Session工厂
SessionFactory factory = configuration.buildSessionFactory();
// 得到Session
Session session = factory.openSession();
// 开启事物
Transaction transaction = session.beginTransaction();
session.createQuery("delete Student where age=?").setParameter(, ).executeUpdate();
// 提交事物
transaction.commit();
// 关闭seeion
session.close();
// 关闭SessionFactory
factory.close();
第三种:原生态sql
这种方式基本不常用,所以就简单介绍下,具体的自己百度吧
//获取所有查询结果
session.createSQLQuery("select * from note").list();
//仅获取第一条结果
session.createSQLQuery("select * from note where id = 1").uniqueResult();
初学者易上手的SSH-hibernate02 三种查询方式的更多相关文章
- Hibernate的Api以及三种查询方式
Hibernate Api |-- Configuration 配置管理类对象 config.configure(); 加载主配置文件的方法(hibernate.cfg.xml) ...
- hibernate的三种查询方式
hibernate的三种查询方式 目录 hibernate的三种查询方式 1.HQL查询 1.1.SQL概述 1.2.实体查询 1.3.带where的查询 1.3.属性查询 1.4.实体的更新和删除 ...
- SSH端口三种转发方式
本地转发 假设有ssh服务器B,telnet服务器C被防火墙与外界隔离,此时外部主机A无法直接访问C服务器. 此时可以通过本地转发的方式让A与C借助B服务器通过ssh协议通信. client fire ...
- EF提供的三种查询方式
這邊簡單介紹一下,ADO.Net Entity Framework 提供的三種查詢方式, Linq to Entities Query Builder Mothed Entity SQL Langua ...
- django 神奇的双下划线,通过外键的三种查询方式
一,用于跨表操作 只要是object后面字符串都是用双下划线__.其它地方用点. 如:的values中的group_code__name.group_code是一个外键 def list(reques ...
- mybatis学习四 mybatis的三种查询方式
<select id="selAll" resultType="com.caopeng.pojo.Flower"> select * from fl ...
- Hibernate的四种查询方式(主键查询,HQL查询,Criteria查询,本地sql查询)和修改和添加
Hibernate的添加,修改,查询(三种查询方式)的方法: 案例演示: 1:第一步,导包,老生常谈了都是,省略: 2:第二步,创建数据库和数据表,表结构如下所示: 3:第三步创建实体类User.ja ...
- linux学习之centos(二):虚拟网络三种连接方式和SecureCRT的使用
---操作环境--- 虚拟机版本:VMware Workstation_10.0.3 Linux系统版本:CentOS_6.5(64位) 物理机系统版本:win10 一.虚拟网络三种连接方式 当在V ...
- Android平台中实现对XML的三种解析方式
本文介绍在Android平台中实现对XML的三种解析方式. XML在各种开发中都广泛应用,Android也不例外.作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能. 在 ...
随机推荐
- 201521123055 《Java程序设计》第6周学习总结
1. 本章学习总结 2. 书面作业 Q1.代码阅读:Child压缩包内源代码 1.clone方法 1.1 Object对象中的clone方法是被protected修饰,在自定义的类中覆盖clone方法 ...
- 201521123051 《Java程序设计》第4周学习总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 使用工具:百度脑图 1.2 使用常规方法总结其他上课内容.(多态) 多态的定义:父类的引用指向子类的对象. 父类的引用:一是指父类变 ...
- 201521123103 《Java程序设计》 第一周学习总结
一.本周学习总结 1.初步了解了Java的诞生及版本演进的过程. 2.认识了Java的三大平台:Java SE.Java EE.Java ME:学会安装JDK:Java SE是各应用平台的基础,分为四 ...
- Java多态总结
面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 1.定义: 多态:指允许不同类的对象对同一消息做出响应.即同一消息可 ...
- 201521123119《Java程序设计》第11周学习总结
1. 本周学习总结 Q1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 Q1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问 ...
- js的原型
在讲js的原型之前,必须先了解下Object和Function. Object和Function都作为JS的自带函数,Object继承自己,Funtion继承自己,Object和Function互相是 ...
- python实例编写(2)--等待,一组对象,层级元素,frame对象处理
一.设置等待 #coding=utf-8 from selenium import webdriver from selenium.webdriver.support.ui import WebDri ...
- python 实现注册程序
本文介绍用python实现一个模拟注册的程序,详细需求如下: # 写一个注册的程序,输入username,密码,密码确认,输入的账号和密码不能为空,两次输入密码必须一致,用户名不能重复,错误次数4次# ...
- [Troubleshooting] Inter VT 主板已开启,但测试工具显示未开启.
一周前给神船Z7SL3重装了Win10的系统,但安装VMware时遇到了比较诡异的事 主板确定开启了VT 但是VMware显示不支持64位 用工具Securable和Intel(R) Process ...
- VS2015 + EF6连接MYSQL
ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案,不仅支持SQL Server,还支持MySQL.Ora ...