主要内容有:
hibernate的概念;
hibernate的核心接口及作用;
hibernate的简单创建过程;
session.find()/save()/update()/delete()的用法;
HQL的用法.
(1)
hibernate简介:
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了轻量级的对象封装,使得Java程序员可以使用对象编程思维来操纵数据库。
(11)
Hibernate是JDBC的轻量级的对象封装.
Hibernate的核心接口一共有5个,分别为:Session、SessionFactory、Transaction、Query和 Configuration。这5个核心接口在任何开发中都会用到。通过这些接口,不仅可以对持久化对象进行存取,还能够进行事务控制。
11.1
Configuration接口:
Configuration接口负责配置并启动Hibernate,创建SessionFactory对象。
11.2
SessionFactory接口:
SessionFactroy接口负责初始化Hibernate,并负责创建Session对象。
需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够.
11.3
Session接口:
Session接口负责执行被持久化对象的查询,添加,更新,删除操作.
11.4
Transaction接口:
Transaction接口负责事务相关的操作。
11.5
Query和Criteria接口:
Query和Criteria接口负责执行各种数据库查询。
其配置文件:
Hibernate可以使用XML或属性档案来配置SessionFactory,预设的配置文件名称为hibernate.cfg.xml或hibernate.properties。
hibernate:
1,创建hibernate的配置文件:hibernate.cfg.xml.hibernate从配置文件中读取和数据库有关的driver,url,username,password.
2,创建持久化类.
此类,必须与数据表的内容相对应.并且符合JAVABEAN的规范.-->用于以下的映射文件.
3,创建映射文件hibernate.hbm.xml(类--映射为-->表):
如:
<porperty name="name" column="NAME" type="String" not-null="true">
==========================================================================
(1)
系统结构:
MyFirstHibernate
src
放置持久化类,映射文件,启动类
lib
db
放置相应的数据库驱动
hibernate
放置hibernate包,以及解压包中lib文件夹下的所有文件
classes
hibernate.cfg.xml,
各持久化类
相应的映射文件(*.hbm.xml)
启动类
build.xml
(2)
创建持久化类:
一个JavaBean,其中的变量名,变量数据类型与数据库中相应的表的列相对应.
//无void,就有return.
Customer.java
public class Customer {
private int id;
private String username;
private String password;
public int getId() {return id;}
public String getPassword() {return password;}
public String getUsername() {return username;}
public void setId(int id) {this.id = id;}
public void setPassword(String password) {this.password = password;}
public void setUsername(String username) {this.username = username;}
(2)
Customer.java映射文件:
Customer.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
" [url]http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd[/url]">
<hibernate-mapping>
<class name="Customer" table="CUSTOMER">
<id name="id" column="CID">
<generator class="increment" />
</id>
<property name="username" column="USERNAME" />
<property name="password" column="PASSWORD" />
</class>
</hibernate-mapping>
(3)
创建启动hibernate session的JAVA文件:
Test.java
import net.sf.hibernate.*;
import net.sf.hibernate.cfg.*;
public class Test {
public static void main(String[] args) {
try {
SessionFactory sf = new Configuration().configure().buildSessionFactory();
Session session = sf.openSession();
Transaction tx = session.beginTransaction();
//每往数据库插入一行记录,须新建一个customer实例,并session.save(customer).此实例可用相同的名,最后用tx.commit().
for (int i = 0; i < 20; i++) {
Customer customer = new Customer();
customer.setUsername("customer" + i);
customer.setPassword("customer");
session.save(customer);
}
Customer customer = new Customer();
customer.setUsername("jason");
customer.setPassword("hwj");
session.save(customer);
tx.commit();
session.close();
} catch (HibernateException e) {
e.printStackTrace();
}
}
}
(4)
hibernate配置文件:
位置:
此文件放于classes中. 此文件中,不但配置了driver,url,username,password,且配置了各数据表的映射文件。
改数据库:
以后如果你要更换数据库,只需要改变hibernate.cfg.xml描述文件里相应的值即可。
结构:
<?xml version="1.0"?>
<!DOCTYPE>
根目录是<hibernate-configuration>
<session-factory>
各个<property>:driver_class,url,username,password,dialect,show_sql
hibernate.cfg.xml具体如下:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
" [url]http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd[/url]">
<hibernate-configuration>
<session-factory name="java:/hibernate/HibernateFactory">
<property name="show_sql">true</property> -->是否在命令行中显示SQL语句
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="connection.url">
jdbc:mysql://localhost:3306/jason
</property>
<property name="connection.username">
access
</property>
<property name="connection.password">
ssecca1324
</property>
<property name="dialect">
net.sf.hibernate.dialect.MySQLDialect
</property>
<mapping resource="Customer.hbm.xml" />
</session-factory>
</hibernate-configuration>
(5)
注意:
在hibernate.cfg.xml中的<!DOCTYPE>与*.hbm.xml中的<!DOCTYPE>是不一样的.不能采用一样的,否则出错.
(6)
用myeclipse配置hibernate:
6.0
先在数据库中创建一个相应的表.并用myeclipse中的DB插件,进行连接.
6.1
先建一个web project -->添加hibernate的属性(myeclipse->add hibernate captility)-->配置数据库连接.(选择刚刚用DB插件配置的数据库)
6.2
若在src中新建一个文件夹insert,并在其中新建一个持久化类Customer.java,InsertSessionFactory.java,Customer.hbm.xml.
6.3
分别编写Customer.java,InsertSessionFactory.java,Customer.hbm.xml.
注意:
src文件夹-->对应编译后的class文件夹--->所以,src也就相当于根目录.
因为,Customer.java,Customer.hbm.xml放于insert文件夹中,
所以:
在写Customer.hbm.xml时,要注意<class name="insert.Customer" table="">.
hibernate.cfg.xml时,<mapping resource="insert/Customer.hbm.xml"/>.
6.4
在hibernate.cfg.xml中,添加相应持久化类的映射文件*.hbm.xml于<sessionFactory>中.
如上:
<mapping resource="insert/Customer.hbm.xml"/>
(7)
若在定义session后,并定义:
transaction tx=session.openTransaction();
则,在session.save(),session.update(),session.delete()后,须用tx.commit()才能正确写入数据库.可以用tx.rollback()来回流.但必须用到session.close()之前.
以下是session.find(),session.update(),session.delete()的用法:
(8)
session.find()的几种用法:
8.1
List customers=session.find("from Customer c where c.username='jason'");
8.2
String jason="jason";
//List customers=session.find("from Customer c where c.username="+jason); ->Wrong !
List customers=session.find("from Customer c where c.username='"+jason+"'");
8.3
List jcustomers=session.find("select c.username from Customer c");
Iterator ite=jcustomers.iterator();
while(ite.hasNext())
{
String username=(String)ite.next();
System.out.println("username:"+username);
}
8.4
List jcustomers=session.find("select cc.username,cc.password from Customer cc");
Iterator iter=jcustomers.iterator();
while(iter.hasNext())
{
Object[] rows=(Object[])iter.next();
System.out.println("username:"+rows[0]+"password:"+rows[1]);
}
(9)
session.update() / session.delete()在进行之前,要先session.find().
9.1
List customers=session.find("from Customer c where c.username='jason'");
Iterator iterator=customers.iterator();
Customer updated=null;
while(iterator.hasNext())
{
Customer scustomers=(Customer)iterator.next();
updated=scustomers;
updated.setUsername("TEST");
updated.setPassword("OK");
session.update(updated);
tx.commit();
}
9.2
List results=session.find("from Customer cu where cu.username like 'customer%' ");
for(Iterator it=results.iterator();it.hasNext();)
{
Customer scustomers=(Customer)it.next();
session.delete(scustomers);
tx.commit();
}
(10)
因为一般情况下,一个项目通常只需要一个SessionFactory就够.
在进行添,查,改,删时,在tx.commit之后,或session.save()/update()/delete()之后,就可以先关闭session.close().
再重新要用时,再开:
session=sf.openSession();
tx=session.beginTransaction();
........
(11)
HQL:
HQL与SQL并没有多大的区别.可以在SQL用的,基本都可以在HQL中用.
如:
where ,order by ,group by , ....
又如:
Hibernate进行多表关联查询
String sTest = "from tBookInfo book, BookSelection sel where book.id = sel.bookId";
(12)
hibernate在与struts结合时,
1.创建相应数据库;
2.在struts的项目中,添加hibernate的属性(myeclipse->add hibernate captility),且配置好数据库连接-->会生成hibernate.cfg.xml
3.编写持久化类;
4.在myeclipse中点击相应的数据库,右键,可以使其自动生成*.hbm.xml,且自动添加到hibernate.cfg.xml中的<mapping resource>中.
5.对于启动sessionFactory类,不一定需要.可以在相关的struts类中添加相应的代码就可以了.
(13)
判断session.find是否有值时,可以如下:
List login=session.find(".... where username=.. and password=...");
if(login.size()<=0){..不存在值..}
本文出自 “Changes we need ! ” 博客,转载请与作者联系!