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'),
('关于我们',' 鲜花网是专业从事全国鲜花速递的网站,秉承着<FONT color=#ff0000>“新鲜花材、专业花艺、热诚服务、郑重承诺”</FONT>的快乐原则,保持着网站流畅、易操作、页面简洁时尚等优点,渐渐得到了“快乐会员”们的赞赏和厚爱。 <P> Ever鲜花成立了网络部在全国拥有鲜花设计部、采购部、配送部同时实现了全国范围内配送和网上支付,使得订花者轻松自如就能及时地陪送到收花者手中,而且享受与商城购物同样便捷和安全保障。自建网以来快乐发展迅速,您对亲朋好友的情和意,我们在3小时内就可以为您传递;花卉设计人员通过专门教育实践和引进台湾、韩国、日本等设计风格,每年开发研究新品牌来迎合不同顾客的要求,而且对于不同需求,我们还提供了多种不同艺术造型、具有鲜明个性、适宜不同场合、赠送不同亲朋好友的鲜花作品和多种时尚礼品供您选择定购。 </P><P> <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中的所有操作主要是以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'),
('关于我们',' 鲜花网是专业从事全国鲜花速递的网站,秉承着<FONT color=#ff0000>“新鲜花材、专业花艺、热诚服务、郑重承诺”</FONT>的快乐原则,保持着网站流畅、易操作、页面简洁时尚等优点,渐渐得到了“快乐会员”们的赞赏和厚爱。 <P> Ever鲜花成立了网络部在全国拥有鲜花设计部、采购部、配送部同时实现了全国范围内配送和网上支付,使得订花者轻松自如就能及时地陪送到收花者手中,而且享受与商城购物同样便捷和安全保障。自建网以来快乐发展迅速,您对亲朋好友的情和意,我们在3小时内就可以为您传递;花卉设计人员通过专门教育实践和引进台湾、韩国、日本等设计风格,每年开发研究新品牌来迎合不同顾客的要求,而且对于不同需求,我们还提供了多种不同艺术造型、具有鲜明个性、适宜不同场合、赠送不同亲朋好友的鲜花作品和多种时尚礼品供您选择定购。 </P><P> <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操作。