`

Hibernate(二)

阅读更多
3.2.3、编写Hibernate应用
Hibernate中的所有操作主要是以POJO展开的,但是如果要想操作POJO,则肯定必须使用Session,Session的取得必须按照以下的步骤:
  1、 实例化Configuration对象
  2、 通过Configuration找到SessionFactory
  3、 通过SessionFactory找到Session
public class TestDemo01 {
private Session session = null ;
public TestDemo01(){
  Configuration conf = new Configuration().configure() ;
  SessionFactory factory = conf.buildSessionFactory() ;
  this.session = factory.openSession() ;
}
}
以上就是session的实例化过程。格式是固定的/
3.2.3.1、增加数据(推荐)
所有的增加操作都是通过session展开的,只需要调用session中的以下方法:
  • public void save(Object obj),就可以执行数据的增加操作了。
import java.util.Date;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class TestDemo01 {
private Session session = null ;
public TestDemo01(){
  Configuration conf = new Configuration().configure() ;
  SessionFactory factory = conf.buildSessionFactory() ;
  this.session = factory.openSession() ;
}
public void doCreate(Person per) {
  this.session.save(per) ; // 保存数据
  this.session.close() ;
}
public static void main(String[] args) {
  Person per = new Person() ;
  per.setName("张三") ;
  per.setAge(30) ;
  per.setBirthday(new Date()) ;
  new TestDemo01().doCreate(per) ;
}
}
以上的代码本身没有任何的问题,但是数据库中却没有要插入的数据,这是因为在Hibernate中所有的提交都没有设置成自动提交,所以必须进行手工的提交,所有的提交通过事务操作 —— Transaction,事务通过Session打开,并可以进行手工的提交。
import java.util.Date;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
public class TestDemo01 {
private Session session = null ;
public TestDemo01(){
  Configuration conf = new Configuration().configure() ;
  SessionFactory factory = conf.buildSessionFactory() ;
  this.session = factory.openSession() ;
}
public void doCreate(Person per) {
  Transaction tran = this.session.beginTransaction() ; // 打开事务
  this.session.save(per) ; // 保存数据
  tran.commit() ;  // 提交事务
  this.session.close() ;
}
public static void main(String[] args) {
  Person per = new Person() ;
  per.setName("张三") ;
  per.setAge(30) ;
  per.setBirthday(new Date()) ;
  new TestDemo01().doCreate(per) ;
}
}
此时,已经正确的执行好了数据的插入操作,但是现在程序本身没有任何的反映,如果需要将执行的SQL语句显示出来,则可以直接在hibernate.cfg.xml文件中进行配置。

<property name="show_sql">true</property>
以后再执行程序的时候就会出现执行的SQL语句。
3.2.3.2、按ID查询
在Hibernate之中,按ID查找可以使用以下的两种方法:
  • public Object get(Class cls,Object id)
  • public Ojbect load(Class cls,Object id)
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
public class TestDemo01 {
private Session session = null ;
public TestDemo01(){
  Configuration conf = new Configuration().configure() ;
  SessionFactory factory = conf.buildSessionFactory() ;
  this.session = factory.openSession() ;
}
public Person findById(int id){
  Person per = null ;
  per = (Person)this.session.get(Person.class, id) ;
  return per ;
}
public static void main(String[] args) {
  Person per = null ;
  per = new TestDemo01().findById(2) ;
  System.out.println(per.getName());
}
}
3.2.3.3、修改操作
传入一个新的POJO对象即可。
import java.text.SimpleDateFormat;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
public class TestDemo01 {
private Session session = null ;
public TestDemo01(){
  Configuration conf = new Configuration().configure() ;
  SessionFactory factory = conf.buildSessionFactory() ;
  this.session = factory.openSession() ;
}
public void doUpdate(Person per) {
  Transaction tran = this.session.beginTransaction() ; // 打开事务
  this.session.update(per) ; // 保存数据
  tran.commit() ;  // 提交事务
  this.session.close() ;
}
public static void main(String[] args) throws Exception {
  Person per = null ;
  per = new Person() ;
  per.setPid(2) ;
  per.setName("李四") ;
  per.setAge(31) ;
  per.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse("1978-09-08")) ;
  new TestDemo01().doUpdate(per) ;
}
}
3.2.3.4、删除操作
如果要使用session中的删除操作,则必须首先根据id查询出来,之后再删除,因为删除的时候是以一个对象的形式删除的。
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
public class TestDemo01 {
private Session session = null ;
public TestDemo01(){
  Configuration conf = new Configuration().configure() ;
  SessionFactory factory = conf.buildSessionFactory() ;
  this.session = factory.openSession() ;
}
public void doDelete(int id){
  Transaction tran = this.session.beginTransaction() ; // 打开事务
  this.session.delete(this.session.get(Person.class, id)) ; // 保存数据
  tran.commit() ;  // 提交事务
  this.session.close() ;
}
public static void main(String[] args) throws Exception {
  new TestDemo01().doDelete(3) ;
}
}
实际上以上的全部操作是Hibernate本身提供的,但是对于上面操作中的update和delete方法,本身在开发中是不能直接使用的。
3.2.4、更高级的应用
3.2.4.1、查询全部
如果要想查询全部,则必须手工编写HQL语句,通过此语句查询,此语句的写法与SQL非常的类似。但是,在编写的时候一定要注意,Hibernate中是以对象的形式进行操作的,所以必须区分大小写。
import java.util.Iterator;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
public class TestDemo01 {
private Session session = null ;
public TestDemo01(){
  Configuration conf = new Configuration().configure() ;
  SessionFactory factory = conf.buildSessionFactory() ;
  this.session = factory.openSession() ;
}
public List findAll(){
  List all = null ;
  String hql = "FROM Person p" ;
  Query q = this.session.createQuery(hql) ; // 查询需要Query接口
  all = q.list() ;    // 发出查询语句
  this.session.close() ;
  return all ;
}
public static void main(String[] args) throws Exception {
  List all = new TestDemo01().findAll() ;
  Iterator iter = all.iterator() ;
  while(iter.hasNext()){
   Person p = (Person)iter.next() ;
   System.out.println(p.getName());
  }
}
}
3.2.4.2、查询全部(分页)
在Hibernate中分页操作只需要通过Query接口就可以直接完成,通过以下两个方法:
  • public void setFirstResult(int in)     开始点
  • public void setMaxResult(int max)   表示取出的最多内容
import java.util.Iterator;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
public class TestDemo01 {
private Session session = null;
public TestDemo01() {
  Configuration conf = new Configuration().configure();
  SessionFactory factory = conf.buildSessionFactory();
  this.session = factory.openSession();
}
public List findAll(int currentPage, int lineSize) {
  List all = null;
  String hql = "FROM Person p";
  Query q = this.session.createQuery(hql); // 查询需要Query接口
  q.setFirstResult((currentPage - 1) * lineSize);
  q.setMaxResults(lineSize);
  all = q.list(); // 发出查询语句
  this.session.close();
  return all;
}
public static void main(String[] args) throws Exception {
  List all = new TestDemo01().findAll(2, 5);
  Iterator iter = all.iterator();
  while (iter.hasNext()) {
   Person p = (Person) iter.next();
   System.out.println(p.getPid() + ";" + p.getName());
  }
}
}
3.2.4.3、查询全部记录数
直接使用count函数完成。
import java.util.Iterator;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
public class TestDemo01 {
private Session session = null;
public TestDemo01() {
  Configuration conf = new Configuration().configure();
  SessionFactory factory = conf.buildSessionFactory();
  this.session = factory.openSession();
}
public int getAllCount(){
  int count = 0 ;
  String hql = "SELECT COUNT(p.pid) FROM Person p" ;
  Query q = this.session.createQuery(hql) ;
  count = (Integer)q.uniqueResult() ;
  return count ;
}
public static void main(String[] args) throws Exception {
  System.out.println(new TestDemo01().getAllCount());
}
}
3.2.4.4、使用HQL进行id查询(推荐)
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
public class TestDemo01 {
private Session session = null;
public TestDemo01() {
  Configuration conf = new Configuration().configure();
  SessionFactory factory = conf.buildSessionFactory();
  this.session = factory.openSession();
}
public Person findById2(int pid) {
  Person per = null ;
  String hql = "FROM Person p WHERE p.id=?" ;
  Query q = this.session.createQuery(hql) ;
  q.setInteger(0, pid) ;
  per = (Person)q.uniqueResult() ;
  return per ;
}
public static void main(String[] args) throws Exception {
  System.out.println(new TestDemo01().findById2(5).getName());
}
}
3.2.4.5、模糊查询(推荐)
在Hibernate之中也支持模糊查询,依然使用LIKE语句。
public List findAll(String keyWord,int currentPage, int lineSize) {
  List all = null;
  String hql = "FROM Person p WHERE p.name LIKE ?";
  Query q = this.session.createQuery(hql); // 查询需要Query接口
  q.setString(0, "%"+keyWord+"%") ;
  q.setFirstResult((currentPage - 1) * lineSize);
  q.setMaxResults(lineSize);
  all = q.list(); // 发出查询语句
  this.session.close();
  return all;
}
从之前的所有操作中,发现Hibernate操作数据库是比较简单的。
3.2.4.6、更新操作(推荐)
之前是直接使用session中的update方法更新的,但是如果在以后配置完关系之后,再使用此种方法更新,则可能会出现无法更新的情况,所以对于更新操作,建议使用:HQL完成。
public void doUpdate2(Person per) {
  String hql = "UPDATE Person SET name=?,age=?,birthday=? WHERE pid=?";
  Query q = this.session.createQuery(hql);
  q.setString(0, per.getName()).setInteger(1, per.getAge()).setDate(2,
    per.getBirthday()).setInteger(3, per.getPid()).executeUpdate();
  this.session.beginTransaction().commit();
  this.session.close();
}
3.2.4.7、删除操作(推荐)
直接使用HQL中提供的DELETE语句就可以删除数据了。
public void doDelete2(int pid) {
  String hql = "DELETE FROM Person WHERE pid=?";
  Query q = this.session.createQuery(hql);
  q.setInteger(0, pid).executeUpdate();
  this.session.beginTransaction().commit();
  this.session.close();
}
3.2.4、主键生成方式
在Hibernate之中主要有以下几种主键方式最为常用:
  • 由数据库自行处理:native
  • 由用户自己指派:assigned
  • 生成一个32位的IP地址+时间戳的十六进制ID:uuid.hex
  • 序列:sequence、只用于DB2、Oracle数据库的
3.2.4.1、assigned
要求用户自己指定一个主键。
DROP DATABASE demo ;
CREATE DATABASE demo ;
USE demo ;
DROP TABLE person ;
CREATE TABLE person(
pid   INT    PRIMARY KEY ,
name  VARCHAR(50)  NOT NULL ,
age   INT    NOT NULL ,
birthday DATE   NOT NULL
) ;
此时程序的主键不再自动增长了,必须由程序进行控制。把Person.hbm.xml中的主键生成方式修改为assigned:
  <id name="pid" type="java.lang.Integer">
   <column name="pid" />
   <generator class="assigned"></generator>
  </id>
3.2.4.2、uuid.hex
32位的数据长度,所以此时的主键列应该扩充长度:
DROP DATABASE demo ;
CREATE DATABASE demo ;
USE demo ;
DROP TABLE person ;
CREATE TABLE person(
pid   VARCHAR(32)  PRIMARY KEY ,
name  VARCHAR(50)  NOT NULL ,
age   INT    NOT NULL ,
birthday DATE   NOT NULL
) ;
因为以上的主键类型是字符串,所以在POJO类中的pid修改为String类型,同时在Person.hbm.xml中配置主键列的长度为32位。
  <id name="pid" type="java.lang.String">
   <column name="pid" />
   <generator class="uuid.hex"></generator>
  </id>
3.3、实例(新闻管理)
有下面一张表,要求使用Struts + Hibernate完成具体的操作
• 增加、修改、删除、列表、分页显示
• 要求:建立DAO操作、使用Struts完成前台,使用Hibernate完成后台
DROP DATABASE mshop ;
CREATE DATABASE mshop;
USE mshop ;
DROP TABLE IF EXISTS news;
CREATE TABLE news (
  nid int AUTO_INCREMENT PRIMARY KEY NOT NULL,
  title varchar(255) default NULL,
  content text,
  keyw varchar(200) default NULL,
  postdate datetime default NULL
) ;
INSERT INTO news (title,content,keyw,postdate) VALUES
('放心购物在当当网联营店','放心购物在当当网联营店','网联营店','2006-07-06 07:46:52'),
('当当网联营店:先行赔付','当当网联营店:先行赔付<BR>','先行赔付','2006-07-06 08:16:48'),
('贴心保障:假一赔一','贴心保障:假一赔一','假一赔一','2006-07-06 08:17:03'),
('买贵了:双倍礼券赔付','买贵了:双倍礼券赔付<BR>','礼券','2006-07-06 08:17:22'),
('服务提速:4小时专递','服务提速:4小时专递','专递','2006-07-06 08:18:50'),
('购物无忧:24小时服务','购物无忧:24小时服务','24小时服务','2006-07-06 08:19:07'),
('购物满99元免运费','购物满99元免运费','购物满99元免运费','2006-07-06 08:19:17'),
('浦发卡网上支付优惠说明!','优惠说明','浦发卡网上支付优惠说明','2006-07-06 08:19:26'),
('常见问题','常见问题','常见问题','2006-07-06 16:46:32'),
('安全交易','本网站采取了各种措施以确保您进行购物等活动的安全性,我们采用了SSL(安全套层)协议加密技术,可以有效地防止信息在传送中出现丢失,盗用或被篡改等情况。同时,我们采用网上屏蔽技术以保护信用卡资料的传输。您可放心地在网上购买商品,享受网上购物的乐趣。 ','安全交易','2006-07-06 16:47:24'),
('关于我们','&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 鲜花网是专业从事全国鲜花速递的网站,秉承着<FONT color=#ff0000>“新鲜花材、专业花艺、热诚服务、郑重承诺”</FONT>的快乐原则,保持着网站流畅、易操作、页面简洁时尚等优点,渐渐得到了“快乐会员”们的赞赏和厚爱。 <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ever鲜花成立了网络部在全国拥有鲜花设计部、采购部、配送部同时实现了全国范围内配送和网上支付,使得订花者轻松自如就能及时地陪送到收花者手中,而且享受与商城购物同样便捷和安全保障。自建网以来快乐发展迅速,您对亲朋好友的情和意,我们在3小时内就可以为您传递;花卉设计人员通过专门教育实践和引进台湾、韩国、日本等设计风格,每年开发研究新品牌来迎合不同顾客的要求,而且对于不同需求,我们还提供了多种不同艺术造型、具有鲜明个性、适宜不同场合、赠送不同亲朋好友的鲜花作品和多种时尚礼品供您选择定购。&nbsp;</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<STRONG><FONT color=#ff0080 size=2>选择鲜花,给情人一个最意外的惊喜!</FONT></STRONG></P>','关于我们','2006-07-06 16:50:00'),
('病后再度公开露面邵逸夫赏港姐','a','aaa','2006-08-14 03:54:28'),
('你买丰田车将会付出“色狼费”丰田赔女秘','bbbb','bb','2006-08-14 03:54:33'),
('证监会重掌红筹监管权','ccccc','ccccc','2006-08-14 03:54:39'),
('数百亿温州“民资”回撤清晰','ddddddddddd','dddddd','2006-08-14 03:54:47'),
('联想年金引发企业年金冲动从','eeeee','eeeee','2006-08-14 03:54:52'),
('Google中国耍流氓?','fffff','fffff','2006-08-14 03:54:57'),
('大陆省市亿万富翁户数排行','ggggggggggggggggggggggg','ggggggggggggggg','2006-08-14 03:55:03'),
('中国热点城市房价与收入比为12:1','hhhhhhhhhhhhhhhh','hhhh','2006-08-14 03:55:10'),
('基尼系数不打\"国情折扣\"又当如何?','s','ss','2006-08-14 04:08:02'),
('加工业是中国高储蓄的制造者 刺激消费难题待解','s','s','2006-08-14 04:08:10'),
('姚明应住豪华套房的N个理由','s','d','2006-08-14 04:08:22');

4、总结
1、 Hibernate的主要功能,就是替换持久层操作,解放了JDBC操作的复杂性
2、 SessionFactory、Configuration、Session、Transaction、Query的作用。
3、 可以使用Hibernate进行单表的CRUD操作
5、预习任务
1、 Hibernate查询语句
2、 实体映射策略
3、 容器映射策略
4、 一对多关联
6、作业
用户等级表

  mlid 等级编号(自动增长)
stp 最低积分
enp 最高积分
levelname 等级名称
discount 折扣价
数据库创建脚本:
DROP DATABASE mshop ;
CREATE DATABASE mshop;
USE mshop ;
DROP TABLE IF EXISTS memberlevel;
CREATE TABLE memberlevel (
  mlid int AUTO_INCREMENT PRIMARY KEY NOT NULL,
  stp int NOT NULL, 
  enp int NOT NULL, 
  levelname varchar(100) NOT NULL default '',
  discount decimal(10,3)  NOT NULL default '1.000'
) ;
使用Struts + Hibernate完成CRUD操作。
分享到:
评论

相关推荐

    hibernate二级缓存实例

    在这个"hibernate二级缓存实例"中,我们将深入探讨二级缓存的原理、配置以及在实际项目中的应用。 首先,我们需要了解一级缓存和二级缓存的区别。一级缓存是Session级别的,每个Session都有自己的一级缓存,用于...

    Hibernate二级缓存

    Hibernate二级缓存是一种提高应用程序性能的技术,它将数据存储在SessionFactory级别的缓存中,使得数据可以在不同的Session之间共享。这与一级缓存(Session级别)不同,一级缓存仅存在于单个Session生命周期内,当...

    hibernate二级缓存示例源码

    **hibernate二级缓存详解** Hibernate作为Java领域中广泛使用的对象关系映射(ORM)框架,极大地简化了数据库操作。然而,在处理大量数据时,性能优化显得尤为重要,这就是二级缓存的作用。本文将深入探讨Hibernate...

    hibernate二级缓存

    Hibernate 二级缓存是一种高效的数据存储机制,它能够显著提升Web应用的性能,尤其是在处理大量数据流动时。缓存的主要目标是减少应用与数据库之间的交互次数,从而降低延迟并减轻数据库服务器的压力。在Hibernate...

    hibernate二级缓存java包下载

    二级缓存是 Hibernate 缓存策略的一部分,它在应用程序的多个会话之间共享数据,进一步优化了数据库访问效率。 二级缓存分为以下关键知识点: 1. **一级缓存与二级缓存的区别**: - 一级缓存:每个 Hibernate ...

    hibernate二级缓存所需要的 jar包

    本篇将详细介绍Hibernate二级缓存的概念、作用以及所需jar包的作用。 一、Hibernate二级缓存概念 Hibernate的一级缓存是指Session级别的缓存,每个Session内部都有一个一级缓存,用于存储实体对象,当Session关闭时...

    Hibernate 二级缓存

    Hibernate 二级缓存

    Hibernate二级缓存技术

    ### Hibernate二级缓存技术详解 #### 一、概述 Hibernate 是一个开源的对象关系映射(ORM)框架,它简化了Java应用与关系型数据库之间的交互。为了提高性能和减少数据库的访问频率,Hibernate 提供了一级缓存和二...

    hibernate二级缓存要导入的包

    本压缩包提供的资源应该包含了实现Hibernate二级缓存所需的关键组件和库文件。 一级缓存是Hibernate Session内的缓存,它是每个Session实例独有的,当Session关闭时,一级缓存中的数据也会被清除。而二级缓存则是一...

    hibernate二级缓存(包括注解方式)

    标题“hibernate二级缓存(包括注解方式)”指出了本文将探讨的是Hibernate框架中的二级缓存机制,并且会涉及使用注解的方式进行配置。Hibernate是一个流行的对象关系映射(ORM)框架,它允许开发者在Java应用中使用...

    hibernate 二级缓存

    本篇文章将深入探讨Hibernate二级缓存的概念、工作原理以及如何在实际项目中设置和使用。 **一、二级缓存概念** 一级缓存是每个Hibernate Session内部的一个内存区域,用于存储Session期间的操作对象。当Session...

    hibernate二级缓

    **hibernate二级缓存详解** 在Java的持久化框架Hibernate中,二级缓存是一个重要的性能优化手段。它能够显著提升应用的响应速度,通过存储经常访问的数据来减少数据库的I/O操作。本文将深入探讨Hibernate的二级缓存...

    Hibernate二级缓存+分页功能

    **一、Hibernate二级缓存** Hibernate一级缓存是指Session级别的缓存,它是默认开启的,每个Session都会维护一个对象缓存,用来存放该Session加载的实体对象。一级缓存的生命周期与Session相同,当Session关闭时,...

    springboot+jpa(hibernate配置redis为二级缓存) springboot2.1.4

    通过以上步骤,我们就成功地在Spring Boot 2.1.4.RELEASE项目中配置了使用Redis作为Hibernate二级缓存的环境。这将显著提升数据库查询效率,减少对数据库的压力,尤其在高并发场景下,效果尤为明显。记得在实际生产...

    Hibernate二级缓存架包.rar

    《深入理解Hibernate二级缓存:基于给定的配置与组件》 在Java的持久化框架领域,Hibernate无疑是最为广泛使用的工具之一。它提供了一种高效、便捷的方式来管理数据库对象,而其中的二级缓存机制则进一步提升了性能...

    hibernate二级缓存 SSH

    在这个项目中,"hibernate二级缓存 SSH" 的标题表明我们将探讨如何在SSH框架中实现Hibernate的二级缓存功能。Hibernate二级缓存是一个优化策略,它能提高数据访问性能,减少对数据库的直接访问。 首先,Struts2作为...

Global site tag (gtag.js) - Google Analytics