一:Hibernate的基本用法:
1,Hibernate的数据库操作:
在所有的ORM框架中有一个非常重要的媒介:PO(Persistence Object,持久化对象),持久化对象的作用是完成持久化操作,简单的说,通过该对象可以对数据进行增删改查的操作。
Hibernate的PO是非常简单的,Hibernate是低侵入式设计,完全采用普通的Java对象来作为持久化对象。
看下面的 一个普通的Java对象:
public class News
{
//消息类的标识属性
private int id;
//消息标题
private String title;
//消息内容
private String content;
//构造器
public News()
{
}
//标识属性的setter和getter方法
public void setId(int id)
{
this.id = id;
}
public int getId()
{
return (this.id);
}
//消息标题的setter方法和getter方法
public void setTitle(String title)
{
this.title = title;
}
public String getTitle()
{
return (this.title);
}
//消息内容的setter方法和getter方法
public void setContent(String content)
{
this.content = content;
}
public String getContent()
{
return (this.content);
}
}
News.hbm.xml:
<?xmlversion="1.0"?>
<!DOCTYPEhibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping
package="cn.huaxia.domain"
default-access="field">
<classname="News"table="table_news">
<idname="id">
<generatorclass="native"/>
</id>
<propertyname="name"column="uname"/>
<propertyname="sex"/>
<propertyname="age"/>
</class>
</hibernate-mapping>
这个普通的javaBean目前还不具备持久化操作的能力,为了使其具备持久化操作的能力,Hibernate采用XML映射文件,
如:
hibernate.cfg.xml:
<!DOCTYPEhibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factoryname="foo">
<propertyname="show_sql">true</property>
<propertyname="hibernate.connection.username">sa</property>
<propertyname="hibernate.connection.password">123</property>
<propertyname="ibernate.connection.pool_size">1000</property>
<propertyname="ibernate.connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
<propertyname="hibernate.connection.url">jdbc:sqlserver://localhost:1433;DataBaseName=WebExma</property>
<propertyname="hibernate.c3p0.min_size">5</property>
<propertyname="hibernate.c3p0.max_size">20</property>
<propertyname="hibernate.c3p0.timeout">1800</property>
<propertyname="hibernate.c3p0.max_statements">50</property>
<propertyname="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</property>
<propertyname="hibernate.hbm2ddl.auto">update</property>
<mappingresource="cn/huaxia/domain/News.hbm.xml"/>
</session-factory>
</hibernate-configuration>
hibernate-mapping元素下的class子元素,每一个class映射一个PO,所以可以这样说:
PO=POJO+映射文件
Hibernate的配置文件可以是一个properties文件也可以是一个xml文件,在实际应用中,通常使用xml文件,
例如:
<?xml version="1.0" encoding="GBK"?>
<!-- 指定Hibernate配置文件的DTD信息 -->
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<!-- hibernate- configuration是连接配置文件的根元素 -->
<hibernate-configuration>
<session-factory>
<!-- 指定连接数据库所用的驱动 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 指定连接数据库的url,hibernate连接的数据库名 -->
<property name="connection.url">jdbc:mysql://localhost/hibernate</property>
<!-- 指定连接数据库的用户名 -->
<property name="connection.username">root</property>
<!-- 指定连接数据库的密码 -->
<property name="connection.password">32147</property>
<!-- 指定连接池里最大连接数 -->
<property name="hibernate.c3p0.max_size">20</property>
<!-- 指定连接池里最小连接数 -->
<property name="hibernate.c3p0.min_size">1</property>
<!-- 指定连接池里连接的超时时长 -->
<property name="hibernate.c3p0.timeout">5000</property>
<!-- 指定连接池里最大缓存多少个Statement对象 -->
<property name="hibernate.c3p0.max_statements">100</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
<property name="hibernate.c3p0.acquire_increment">2</property>
<property name="hibernate.c3p0.validate">true</property>
<!-- 指定数据库方言 -->
<property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
<!-- 根据需要自动创建数据库 -->
<property name="hbm2ddl.auto">create</property>
<!-- 罗列所有的映射文件 -->
<mapping resource="News.hbm.xml"/>
</session-factory>
</hibernate-configuration>
Hibernate不推荐使用DriverManager来连接数据库,推荐使用C3P0数据源。
随着PO与Session的关联关系,PO有如下3种状态:
瞬时状态:如果PO实例从未与Session关联过,该PO实例处于瞬时状态。
持久状态:如果PO实例域Session关联起来,且该实例对应数据库记录,则该实例处于持久化状态。
脱管状态:如果PO实例曾与Session关联过,但因为Session关闭等原因,PO实例脱离了Session的管理,这种状态称之为脱管状态。
对PO的操作必须在Session管理下才能同步到数据库,Session由SessionFactory产生,SessionFactory是数据库编译后的内存镜像,通常一个应用对应一个SessionFactory对象。SessionFactory由Configuration对象产生,Configuration对象负责加载Hibernate配置文件。如:
publicclass NewsTest {
publicstatic void add(Object obj) {
Configuration conf =new Configuration().configure();
SessionFactory sessionFactory = conf.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction tr = session.beginTransaction();
session.save(obj);
tr.commit();
}
publicstatic void main(String[] args) {
News news =new News();
news.setAge(20);
news.setSex("男");
news.setName("johnny");
add(news);
}
}
2,JNDI数据源的连接属性:
如果无需使用hibernate自己管理数据源,而是直接访问容器管理数据源,hibernate可使用JNDI数据源的相关配置,下面是连接
JNDI数据源的主要配置属性:
hibernate.connection.datasource:指定数据源JNDI名字;
hibernate.jndi.url:指定JNDI提供者的URL,该属性是看可选的,如果JNDI与hibernate持久访问的代码处于同一个应用中,则无需指定该属性;
hibernate.jndi.class:指定JNDI InitialContextFactory的实现类,该属性也是可选的,如果JNDI与hibernate持久访问的代码处于同一个应用中,则无需指定该属性;
hibernate.connection.username:指定连接数据库的用户名;
hibernate.connection.password:指定连接数据库的密码。
注意:即使使用jndi数据源,一样需要指定连接数据库的方言,虽然设置数据库方言不是必须的,但是对于优化持久访问层很有必要。
3,改变持久化对象的状态的方法:
根据前面的介绍的内容,我们知道通过new新建一个持久化实例时,该实例处于瞬时状态,为了让瞬时对象转换为持久化状态,Hibernate Session提供如下几个方法:
Serializable save(Object obj)将Object 对象转变成持久化状态,该对象的属性值被保存到数据库中。
void persist(Object obj):将对象转化成持久化状态,该对象的属性保存到数据库中。 <