1:login.JSP
<form action="
login.action" method="post">
username:<input type="text" name="username"> <br/>
password:<input type="text" name="password"> <br/>
<input type="submit" name="submit"/>
</form>
<s:form action="login">
<s:textfield name="username" label="username"></s:textfield>
<s:password name="password" label="password"> </s:password>
<s:submit name="submit"></s:submit>
</s:form>
2:action
package com.test.action;
public class LoginAction {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String execute() throws Exception {
return "success";
}
}
package com.test.action;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String execute() throws Exception {
if("smallfa".equals(this.getUsername().trim())&&"smallfa".equals(this.getPassword().trim()))
{
return "success";
}
else
{
this.addFieldError(username, "username or password errors");
return "failer";
}
}
@Override
public void validate() {
if(null==this.getUsername()||"".equals(this.getUsername().trim()))
{
this.addFieldError(username, "username required");
}
if(null==this.getPassword()||"".equals(this.getPassword().trim()))
{
this.addFieldError(username, "username required");
}
}
}
3:struts-xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="struts2" namespace="/" extends="struts-default">
<action name="login" class="com.test.action.LoginAction">
<result name="success">/result.jsp</result>
</action>
</package>
</struts>
4:web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<filter>
<!-- 定義核心Filter的名字 -->
<filter-name>struts2</filter-name>
<!-- 定義核心Filter的實現類 -->
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
5:result.jsp
username:${requestScope.username}<br/>
password:${requestScope.password}<br/>
6:參考視頻
視頻:
Struts2入門與配置 浪曦 J2EE Struts 2應用開發(fā)詳解系列視頻
http://v.youku.com/v_show/id_XNTY4MDUwMzY=.html
離上次打球隔有一段時間了,終于有一個晚上等到好朋友早點下班,到了場地因天氣冷,既是場地有照明燈,過來的人比昔日還顯得稀少,直到打到后面基本也就我們兩隊在玩,今天打的還是挺過隱的,外投好多個球,其中最自感有一個是假動作,突跨步一接三步路擦板進,確實好久沒進這樣的球,只不過有點遺憾的我們隊竟有一個超極品的兄臺,傳球失誤、防過老漏人、亂面、無語。讓我想了前個晚上比賽那位仁兄。
關于數據庫的學習,個人意見,僅供參考,本人也在學習中。
首先需要了解下 數據模型 關系數據庫 DBMS 范式 自然運算 等等概念性的東西,可以去書店或者圖書館查閱相關書籍,可以了解下,沒必要完全掌握,當然你要能掌握的話,那么對你的以后是非常有幫助的。
其實然后就是SQL標準 對象關系SQL 基本的SQL查詢,以及最基本的SELECT/UPDATE/INSERT/DELETE語法,各種不同的數據庫大同小異的。
然后就是不同的數據庫,不同的用法,你也可以專學一門,比如ORACLE
或者MSSQL MYSQL INFORMIX DB2主要這幾種~
這些入門了就可以學習嵌入數據庫了,訪問數據庫的程序
以及數據庫的性能優(yōu)化,完整性,視圖,安全 目錄 備份 還原等等
當然主要學習ORACLE的話你也可以先直接挑本ORACLE入門看,類似ORACLE10G入門,ORACLE基礎的書,不求完全懂,能看一點是一點,學習ORACLE是一個長期的過程,你在懂了一些后,再去看別的書,你會找到很多相同點,那時候就會有恍然大悟的感覺,一點點看就OK了~
到了一定的程度,你就知道自己怎么去學習,需要掌握些什么,像什么方向發(fā)展了。
另外在學習的過程中推薦有疑問的就自己做實驗操作,或者去各大論壇像CSDN,CNOUG,ITPUB,CNBLOGS查找答案或者提問,也可以下載里面的基礎區(qū)的教程了,不過大多是達人們整理出來的文檔,也很不錯的,尤其前面兩個論壇你能學到很多東西的,不過還是推薦你先完整的看一本入門的后再說,不管理解了幾成,有什么問題記下來,以后慢慢一點點解決。
ORACLE視頻教程的話有個中科院的什么絕版培訓教程oracle 10g的04年的視頻,非常不錯,迅雷上搜索中科院oracle 10g培訓教程就能搜索到。
數據庫開發(fā)工具的話 有TOAD(客戶端連接工具),POWERDESIGN(數據庫設計建模工具,), PL/SQL DESIGNER(PL/SQL開發(fā)工具),一般這3個就夠用了,可以自己去迅雷搜索下載最新版本,另外的話還有一個叫DBATRIN,E/R 什么的工具,很多的,其實裝了ORACLE客戶端工具后,自帶的JAVA控制臺也很好用的。
當然你想一蹴而就的話,可以直接去網上找相關的ORACLE入門資料,那些都是些整理出來的條條,不過不推薦,最好多看書,多做實驗。
Hibernate的對象有3種狀態(tài),分別為:瞬時態(tài)(Transient)、 持久態(tài)(Persistent)、脫管態(tài)(Detached)。處于持久態(tài)的對象也稱為PO(Persistence Object),瞬時對象和脫管對象也稱為VO(Value Object)。
由new命令開辟內存空間的java對象,
eg. Person person = new Person("amigo", "女");
如果沒有變量對該對象進行引用,它將被java虛擬機回收。
瞬時對象在內存孤立存在,它是攜帶信息的載體,不和數據庫的數據有任何關聯關系,在Hibernate中,可通過session的save()或saveOrUpdate()方法將瞬時對象與數據庫相關聯,并將數據對應的插入數據庫中,此時該瞬時對象轉變成持久化對象。
處于該狀態(tài)的對象在數據庫中具有對應的記錄,并擁有一個持久化標識。如果是用hibernate的delete()方法,對應的持久對象就變成瞬時對象,因數據庫中的對應數據已被刪除,該對象不再與數據庫的記錄關聯。
當一個session執(zhí)行close()或clear()、evict()之后,持久對象變成脫管對象,此時持久對象會變成脫管對象,此時該對象雖然具有數據庫識別值,但它已不在HIbernate持久層的管理之下。
持久對象具有如下特點:
1. 和session實例關聯;
2. 在數據庫中有與之關聯的記錄。
當與某持久對象關聯的session被關閉后,該持久對象轉變?yōu)槊摴軐ο蟆.斆摴軐ο蟊恢匦玛P聯到session上時,并再次轉變成持久對象。
脫管對象擁有數據庫的識別值,可通過update()、saveOrUpdate()等方法,轉變成持久對象。
脫管對象具有如下特點:
1. 本質上與瞬時對象相同,在沒有任何變量引用它時,JVM會在適當的時候將它回收;
2. 比瞬時對象多了一個數據庫記錄標識值。
本文摘自孫衛(wèi)琴的《精通Hibernate:Java對象持久化技術詳情》
Hibernate有如下5個核心接口:
- Configuration接口:該對象用于配置并且根啟動Hibernate。Hibernate應用通過Configuration實例來指定對象-關系映射文件的位置或動態(tài)配置Hibernate的屬性,然后創(chuàng)建SessionFactory實例。
- SessionFactory接口:一個SessionFactory實例對應一個數據存儲源,應用從SessionFactory中獲得Session實例。它具有如下特點:
1)它是線程安全的,這意味著它的同一個實例可以被應用的各個線程共享。
2)它是重量級的,這意味著不能隨意創(chuàng)建或銷毀它的實例。如果應用只訪問一個數據庫,只需創(chuàng)建一個SessionFactory實例,在應用初始化的時候創(chuàng)建該實例。如果應用同時訪問多個數據庫,則需要為每個數據庫創(chuàng)建一個單獨的SessionFactory實例。
之所以說SessionFactory是重量級的,是因為它需要一個很大的緩存,用來存放預定義的SQL語句以及映射元數據等。用戶還可以為SessionFactory配置一個緩存插件,這個緩存插件被稱為Hibernate的第二級緩存,該緩存用來存放被工作單元讀過的數據,將來其它工作單元可能會重用這些數據,因此這個緩存中的數據能夠被所有工作單元共享,一個工作單元通常對應一個數據庫事務。
- Session接口:該接口是Hibernate應用使用最廣泛的接口。Session也被稱為持久化管理器,提供了和持久化相關的操作,如添加、更新、刪除、加載和查詢對象。Session具有一下特點:
1)不是線程安全的,因此在設計軟件架構時,應該避免多個線程共享同一個Session實例;
2)Session實例是輕量級的,所謂輕量級,是指它的創(chuàng)建和銷毀不需要消耗太多的資源。這意味著在程序中可以經常創(chuàng)建和銷毀Session對象,例如為每個客戶請求分配單獨的Session實例,或者為每個工作單元分配單獨的Session實例。
Session有一個緩存,被稱為Hibernate的第一級緩存,它存放被當前工作單元加載的對象。每個Session實例都有自己的緩存,這個Session實例的緩存,這個Session實例的緩存只能被當前工作單元訪問。
- Transaction:該接口是Hibernate的數據庫事務接口,它對底層的事務接口做了封裝,底層事務接口包括:JDBC API、JTA(Java Transaction API)、CORBA(Common Object Requet Broker Architecture) API.
Hibernate應用可通過一致的Transaction接口來聲明事務邊界,這有助于應用在不同環(huán)境或容器中移植。
- Query和Criteria接口:它們是Hibernate的查詢接口,用于向數據庫查詢對象,以及控制執(zhí)行查詢的過程。Query實例封裝了一個HQL(Hibernate Query Language)查詢語句,HQL是面向對象的,它引用類名及類的屬性名,而不是表名及表的字段名。Criteria接口完全封裝了基于字符串形式的查詢語句,比Query接口更加面向對象,Criteria接口更擅長于執(zhí)行動態(tài)查詢。
<set
name="propertyName" (1)
table="table_name" (2)
schema="schema_name" (3)
lazy="true|false" (4)
inverse="true|false" (5)
cascade="all|none|save-update|delete|all-delete-orphan" (6)
sort="unsorted|natural|comparatorClass" (7)
order-by="column_name asc|desc" (8)
where="arbitrary sql where condition" (9)
outer-join="true|false|auto" (10)
batch-size="N" (11)
access="field|property|ClassName" (12)
>
<key .... />
<index .... />
<element .... />
</set>
(1) name 集合屬性的名稱
(2) table (可選——默認為屬性的名稱)這個集合表的名稱(不能在一對多的關聯關系中使用)
(3) schema (可選) 表的schema的名稱, 他將覆蓋在根元素中定義的schema
(4) lazy (可選——默認為false) lazy(可選--默認為false) 允許延遲加載(lazy initialization )(不能在數組中使用)
(5) inverse (可選——默認為false) 標記這個集合作為雙向關聯關系中的方向一端。
(6) cascade (可選——默認為none) 讓操作級聯到子實體
(7) sort(可選)指定集合的排序順序, 其可以為自然的(natural)或者給定一個用來比較的類。
(8) order-by (可選, 僅用于jdk1.4) 指定表的字段(一個或幾個)再加上asc或者desc(可選), 定義Map,Set和Bag的迭代順序
(9) where (可選) 指定任意的SQL where條件, 該條件將在重新載入或者刪除這個集合時使用(當集合中的數據僅僅是所有可用數據的一個子集時這個條件非常有用)
(10) outer-join(可選)指定這個集合,只要可能,應該通過外連接(outer join)取得。在每一個SQL語句中, 只能有一個集合可以被通過外連接抓取(譯者注: 這里提到的SQL語句是取得集合所屬類的數據的Select語句)
(11) batch-size (可選, 默認為1) 指定通過延遲加載取得集合實例的批處理塊大小("batch size")。
(12) access(可選-默認為屬性property):Hibernate取得屬性值時使用的策略
摘要: 原文出處:http://tech.it168.com/j/d/2007-05-14/200705141007843.shtml
說明:該文不得轉載
摘要:本文以詳盡的實例展示了hibernate3.x中調用存儲過程各步驟,從建立測試表、存儲過程的建立、工程的建立以及類的編寫和測試一步一步引導用戶學習hibernate3.x中調用存儲過程的方法.
如果底層數據庫(eg. Oracle、mysq...
閱讀全文
Hibernate的描述文件可以是一個properties屬性文件,也可以是一個xml文件。下面講一下Hibernate.cfg.xml的配置。配置格式如下:
1. 配置數據源
在Hibernate.cfg.xml中既可以配置JDBC,也可以配置JNDI。在本小節(jié)中講述數據源如何配置。
hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 各屬性的配置-->
<!—為true表示將Hibernate發(fā)送給數據庫的sql顯示出來 -->
<property name="show_sql">true</property>
<!-- SQL方言,這邊設定的是MySQL -->
<property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property>
<!-- 一次讀的數據庫記錄數 -->
<property name="jdbc.fetch_size">50</property>
<!-- 設定對數據庫進行批量刪除 -->
<property name="jdbc.batch_size">30</property>
<!—下面為JNDI的配置 -->
<!-- 數據源的名稱 -->
<property name="connection.datasource">java:comp/env/jdbc/datasourcename</property>
<!-- Hibernate的連接加載類 -->
<property name="connection.provider_class">net.sf.hibernate.connection.DatasourceConnectionProvider</property>
<property name="dialect">net.sf.hibernate.dialect.SQLServerDialect</property>
<!—映射文件 -->
<mapping resource="com/amigo/pojo/User.hbm.xml"/>
<mapping resource="com/amigo/pojo/Org.hbm.xml"/>
</session-factory>
</hibernate-configuration>
2. c3p0連接池
c3p0連接池是Hibernate推薦使用的連接池,若需要使用該連接池時,需要將c3p0的jar包加入到classpath中。c3p0連接池的配置示例如下:
hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 顯示實際操作數據庫時的SQL -->
<property name="show_sql">true</property>
<!-- SQL方言,這邊設定的是MySQL -->
<property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property>
<!--驅動程序,在后續(xù)的章節(jié)中將講述mysql、sqlserver和Oracle數據庫的配置 -->
<property name="connection.driver_class">……</property>
<!-- JDBC URL -->
<property name="connection.url">……</property>
<!-- 數據庫用戶名 -->
<property name="connection.username">user</property>
<!-- 數據庫密碼 -->
<property name="connection.password">pass</property>
<property name="c3p0.min_size">5</property>
<property name="c3p0.max_size">20</property>
<property name="c3p0.timeout">1800</property>
<property name="c3p0.max_statements">50</property>
<!-- 對象與數據庫表格映像文件 -->
<mapping resource="com/amigo/pojo/User.hbm.xml"/>
<mapping resource="com/amigo/pojo/Org.hbm.xml"/>
</session-factory>
</hibernate-configuration>
在上述配置中,Hibernate根據配置文件生成連接,再交給c3p0管理。
3. proxool連接池
proxool跟c3p0以及dbcp不一樣,它是自己生成連接的,因此連接信息放在proxool配置文件中。使用它時,需要將proxool-0.8.3.jar加入到classespath中。配置舉例如下:
hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 顯示實際操作數據庫時的SQL -->
<property name="show_sql">true</property>
<!-- SQL方言,這邊設定的是MySQL -->
<property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property>
<!—proxool的配置 -->
<property name="proxool.pool_alias">pool1</property>
<property name="proxool.xml">ProxoolConf.xml</property>
<property name="connection.provider_class">net.sf.hibernate.connection.ProxoolConnectionProvider</property>
<!-- 對象與數據庫表格映像文件 -->
<mapping resource="com/amigo/pojo/User.hbm.xml"/>
<mapping resource="com/amigo/pojo/Org.hbm.xml"/>
</session-factory>
</hibernate-configuration>
在hibernate.cfg.xml的同目錄下編寫proxool的配置文件:ProxoolConf.xml,該文件的配置實例如下:
ProxoolConf.xml
<?xml version="1.0" encoding="utf-8"?>
<!-- the proxool configuration can be embedded within your own application's.
Anything outside the "proxool" tag is ignored. -->
<something-else-entirely>
<proxool>
<alias>pool1</alias>
<!--proxool只能管理由自己產生的連接-->
<!-- 驅動的url-->
<!-- jdbc:mysql://localhost:3306/dbname?useUnicode=true&characterEncoding=GBK-->
<driver-url>… </driver-url>
<!-- 驅動類,eg. com.mysql.jdbc.Driver-->
<driver-class>… </driver-class>
<driver-properties>
<!-- 數據庫用戶名,eg. value為root-->
<property name="user" value="…"/>
<!-- 數據庫密碼,eg. value為root-->
<property name="password" value="…."/>
</driver-properties>
<!-- proxool自動偵察各個連接狀態(tài)的時間間隔(毫秒),偵察到空閑的連接就馬上回收,超時的銷毀-->
<house-keeping-sleep-time>90000</house-keeping-sleep-time>
<!-- 指因未有空閑連接可以分配而在隊列中等候的最大請求數,超過這個請求數的用戶連接就不會被接受-->
<maximum-new-connections>20</maximum-new-connections>
<!-- 最少保持的空閑連接數-->
<prototype-count>5</prototype-count>
<!-- 允許最大連接數,超過了這個連接,再有請求時,就排在隊列中等候,最大的等待請求數由maximum-new-connections決定-->
<maximum-connection-count>100</maximum-connection-count>
<!-- 最小連接數-->
<minimum-connection-count>10</minimum-connection-count>
</proxool>
</something-else-entirely>
4. dbcp連接池
在hibernate3.0中,已經不再支持dbcp了,hibernate的作者在hibernate.org中,明確指出在實踐中發(fā)現dbcp有 BUG,在某些種情會產生很多空連接不能釋放,所以拋棄了對dbcp的支持。若需要使用dbcp,開發(fā)人員還需要將commons-pool-1.2.jar 和commons-dbcp-1.2.1.jar兩個jar包加入到classpath中。dbcp與c3p0一樣,都是由hibernate建立連接的。
在hibernate2.0中的配置建立如下:
hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 顯示實際操作數據庫時的SQL -->
<property name="show_sql">true</property>
<!-- SQL方言,這邊設定的是MySQL -->
<property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property>
<!--驅動程序,在后續(xù)的章節(jié)中將講述mysql、sqlserver和Oracle數據庫的配置 -->
<property name="connection.driver_class">……</property>
<!-- JDBC URL -->
<property name="connection.url">……</property>
<!-- 數據庫用戶名,eg. root -->
<property name="connection.username">…</property>
<!-- 數據庫密碼, eg. root-->
<property name="connection.password">…</property>
<property name="dbcp.maxActive">100</property>
<property name="dbcp.whenExhaustedAction">1</property>
<property name="dbcp.maxWait">60000</property>
<property name="dbcp.maxIdle">10</property>
<property name="dbcp.ps.maxActive">100</property>
<property name="dbcp.ps.whenExhaustedAction">1</property>
<property name="dbcp.ps.maxWait">60000</property>
<property name="dbcp.ps.maxIdle">10</property>
<!-- 對象與數據庫表格映像文件 -->
<mapping resource="com/amigo/pojo/User.hbm.xml"/>
<mapping resource="com/amigo/pojo/Org.hbm.xml"/>
</session-factory>
</hibernate-configuration>
5. MySql連接配置
在hibernate中,可以配置很多種數據庫,例如MySql、Sql Server和Oracle,MySql的配置舉例如下:
hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 各屬性的配置-->
<!—為true表示將Hibernate發(fā)送給數據庫的sql顯示出來 -->
<property name="show_sql">true</property>
<!-- SQL方言,這邊設定的是MySQL -->
<property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property>
<!-- 一次讀的數據庫記錄數 -->
<property name="jdbc.fetch_size">50</property>
<!-- 設定對數據庫進行批量刪除 -->
<property name="jdbc.batch_size">30</property>
<!--驅動程序-->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- JDBC URL -->
<property name="connection.url">jdbc:mysql://localhost/dbname?characterEncoding=gb2312</property>
<!-- 數據庫用戶名-->
<property name="connection.username">root</property>
<!-- 數據庫密碼-->
<property name="connection.password">root</property>
<!—映射文件 -->
<mapping resource="com/amigo/pojo/User.hbm.xml"/>
<mapping resource="com/amigo/pojo/Org.hbm.xml"/>
</session-factory>
</hibernate-configuration>
上面使用的驅動類是com.mysql.jdbc.Driver。需要將MySql的連接器jar包(eg. mysql-connector-java-5.0.4-bin.jar)加入到classpath中。
6. Sql Server連接配置
本小節(jié)講述一下Sql Server數據庫的hibernate連接設置,在此只給出連接部分的內容,其余部分與2.2.1.5一樣,在此不再贅述。內容如下:
<!--驅動程序-->
<property name="connection.driver_class">net.sourceforge.jtds.jdbc.Driver</property>
<!-- JDBC URL -->
<property name="connection.url">jdbc:jtds:sqlserver://localhost:1433;DatabaseName=dbname</property>
<!-- 數據庫用戶名-->
<property name="connection.username">sa</property>
<!-- 數據庫密碼-->
<property name="connection.password"></property>
上例的驅動類使用的是jtds的驅動類,因此讀者需要將jtds的jar包(eg. jtds-1.2.jar)加入到classpath中。
7. Oracle連接配置
本小節(jié)講述一下Sql Server數據庫的hibernate連接設置,在此只給出連接部分的內容,其余部分與2.2.1.5一樣,在此不再贅述。內容如下:
<!--驅動程序-->
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<!-- JDBC URL -->
<property name="connection.url">jdbc:oracle:thin:@localhost:1521:dbname</property>
<!-- 數據庫用戶名-->
<property name="connection.username">test</property>
<!-- 數據庫密碼-->
<property name="connection.password">test</property>
上例使用的驅動類為:oracle.jdbc.driver.OracleDriver,開發(fā)人員需要將相關的jar包(ojdbc14.jar)加入到classpath中。
http://www.tkk7.com/amigoxie/archive/2007/12/29/171395.html
本節(jié)講述如何使用Hibernate實現記錄的增、刪、改和查功能。
1 查詢
在Hibernate中使用查詢時,一般使用Hql查詢語句。
HQL(Hibernate Query Language),即Hibernate的查詢語言跟SQL非常相像。不過HQL與SQL的最根本的區(qū)別,就是它是面向對象的。
使用HQL時需要注意以下幾點:
l 大小寫敏感
因為HQL是面向對象的,而對象類的名稱和屬性都是大小寫敏感的,所以HQL是大小寫敏感的。
Eg.
HQL語句:from Cat as cat where cat.id > 1;與from Cat as cat where cat.ID > 1;是不一樣的,這點與SQL不同。
l from子句
Eg. from Cat,該句返回Cat對象實例,開發(fā)人員也可以給其加上別名,eg. from Cat as cat,對于多表查詢的情況,可參考如下:
from Cat as cat, Dog as dog
其它方面都與SQL類似,在此不再贅述。
接下來講一個在Hibernate中查詢的例子。
1.1簡單查詢
List list = session.createQuery("from User as user order by user.loginName").list();
1.2帶單個參數的查詢
List list = session.find("from User as user where user.loginName=?",
loginName,
Hibernate.STRING);
1.3多個參數的查詢
Eg1. 此例采用“?”占位符的方式
String hql = "from User as user where user.loginName=? and user.orgId=? ";
Query query = session.createQuery(hql);
query.setParameter(1, 'amigo');
query.setParameter(2, new Long(1)) ;
List list = query .list();
Eg2. 此例采用“:paramName”的方式
String hql = "from User as user where user.loginName=:loginName and user.orgId=:orgId ";
Query query = session.createQuery(hql);
query.setParameter('loginName', 'amigo');
query.setParameter('orgId', new Long(1)) ;
List list = query .list();
1.4查詢數量
int count = (Integer) session.createQuery("select count(*) from User").uniqueResult().intValue();
1.5限制查詢起始值和數量的查詢
這種一般是在記錄需要分頁的時候需要用到,例如,在如下的代碼中,限制查詢的開始記錄的位置為50,最大查詢條數為50。
String hql = "from User as user order by user.loginName";
int firstResult= 50;
int maxResults = 50;
Query query = session.createQuery(hql);
query = query.setFirstResult(firstResult);
query.setMaxResults(maxResults);
1.6子查詢
在某些情況下,也需要用到子查詢,例如在下面的例子中,User為用戶對象,UserRole為用戶與角色關聯對象。如下HQL語句將沒有分配角色的用戶對象查找出來。
String hql = "from User user where user.loginName"
+ " not in(select ur.user.loginName from UserRole ur) ";
List list = (session.createQuery(hql)).list();
1.7原生SQL查詢
對于某些復雜的查詢語句,需要調用某種特定的數據庫的特定函數才能解決,Hibernate雖然不推薦使用原生SQL語句來查詢,因為這將破壞數據庫的易移植性,但是Hibernate中也提供了使用原生SQL進行查詢的方法,只需要獲得連接即可。
Eg. 在下面的例子中,用到了Sql Server數據庫中的原生sql語句,如下所示:
String timeUnit = "13";
String sql = "select count(*) count, CONVERT(VARCHAR(" + timeUnit +"), log.gen_datetime,121) timeUnit " + "from Log log";
SQLQuery query = session.createSQLQuery(sql)
.addScalar("count", Hibernate.INTEGER)
.addScalar("timeUnit", Hibernate.STRING);
List list = query.list();
2 新增
在數據庫中新增記錄在Hibernate中不需要使用insert命令,只需要構造新增的對象后,調用Session對象的save(…)方法即可。
2.1新增單個對象
新增單個對象的實例如下,該實例將在用戶表中新增一條記錄。
Session session = HibernateSessionFactory.getSession();
Transaction ts = null;
try {
ts = session.beginTransaction();
User user = new User();
user.setLoginName("amigo");
user.setFullName("阿蜜果");
……
session.save(user) ;
ts.commit();
} catch (Exception e) {
if (ts != null) {
ts.rollback();
}
} finally {
HibernateSessionFactory.closeSession();
}
2.2批量新增對象
對于批量新增對象的情況,需要在新增一部分對象后flush和clear一次,例如,沒批量新增20個對象時手動的flush一次,假設在list為一個用戶列表,里面包含很多User對象,那么要將實現這些對象的批量新增,可采用如下方法:
Session session = HibernateSessionFactory.getSession();
Transaction ts = null;
try {
ts = session.beginTransaction();
for (int i = 0; i < list.size(); i++) {
User user = (User) list.get(i);
session.save(user) ;
if (i % 20 == 0) {
session.flush();
session.clear();
}
}
ts.commit();
} catch (Exception e) {
if (ts != null) {
ts.rollback();
}
} finally {
HibernateSessionFactory.closeSession();
}
3 更新
在hibernate中,更新對象前不需要使用查詢語句:update…,一般需要在取得需要更新的持久化對象后,執(zhí)行Session對象的update(…)方法。例如:
Session session = HibernateSessionFactory.getSession();
Transaction ts = null;
try {
ts = session.beginTransaction();
//取得持久化對象
User user = session.get(User.class, "amigo");
//對需要修改的屬性進行修改
user.setFullName("阿蜜果");
……
session.update(user) ;
ts.commit();
} catch (Exception e) {
if (ts != null) {
ts.rollback();
}
} finally {
HibernateSessionFactory.closeSession();
}
4 刪除
4.1刪除單個對象
一般在取得某對象后,開發(fā)人員可以調用Session對象的delete(…)方法刪除該對象。
Eg. 下面的實例中取得loginName(主鍵)為“amigo”的User對象后,將它刪除。
Session session = HibernateSessionFactory.getSession();
Transaction ts = null;
try {
ts = session.beginTransaction();
//取得持久化對象
User user = session.get(User.class, "amigo");
session.delete(user) ;
ts.commit();
} catch (Exception e) {
if (ts != null) {
ts.rollback();
}
} finally {
HibernateSessionFactory.closeSession();
}
4.2批量刪除對象
對于批量刪除對象的情況,開發(fā)人員可以在取得待刪除的對象列表后,一個一個的將對象刪除,對于每個對象的刪除方法,見3.4.1小節(jié)。開發(fā)人員還可以hql語句來做批量刪除。
Eg. 該實例通過delete語句來刪除記錄,除了loginName為“amigo”的對象為,其余都刪除,代碼如下所示:
Session session = HibernateSessionFactory.getSession();
Transaction ts = null;
try {
ts = session.beginTransaction();
String hql = "delete User as user where user.loginName != 'amigo'";
Query query = session.createQuery(hql);
int count = query.executeUpdate();
ts.commit();
System.out.println("delete count : " + count); //刪除條數
} catch (Exception e) {
if (ts != null) {
ts.rollback();
}
} finally {
HibernateSessionFactory.closeSession();
}
http://www.tkk7.com/amigoxie/archive/2008/01/01/171972.html
本文總結Hibernate中常見的異常。
1. net.sf.hibernate.MappingException
當出現net.sf.hibernate.MappingException: Error reading resource:…異常時一般是因為映射文件出現錯誤。
當出現net.sf.hibernate.MappingException: Resource: … not found是因為XML配置文件沒找到所致,有可能是放置目錄不正確,或者沒將其加入hibernate.cfg.xml中。
2. net.sf.hibernate.PropertyNotFoundException
當出現net.sf.hibernate.PropertyNotFoundException: Could not find a setter for property name in class …時,原因一般是因為XML映射文件中的屬性與對應的Java類中的屬性的getter或setter方法不一致。
3. org.hibernate.id.IdentifierGenerationException
當出現org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save():異常時,一般是因為<id>元素配置不正確,<id>元素缺少其子元素<generator></generator>的配置引起。
解決方案:<id>元素映射了相應數據庫表的主鍵字段,對其子元素<generator class="">,其中class的取值可以為increment、identity、sequence、hilo、native……等,更多的可參考hibernate參考文檔,一般取其值為native 。具體可參考2.2.2.1小節(jié)。
4. a different object with the same identifier value was already associated with the session
當出現a different object with the same identifier value was already associated with the session時,一般是因為在hibernate中同一個session里面有了兩個相同標識但是是不同實體。
有如下幾種解決方案:
(1)使用session.clean(),如果在clean操作后面又進行了saveOrUpdate(object)等改變數據狀態(tài)的操作,有可能會報出"Found two representations of same collection"異常。
(2)使用session.refresh(object),當object不是數據庫中已有數據的對象的時候,不能使用session.refresh(object)因為該方法是從hibernate的session中去重新取object,如果session中沒有這個對象,則會報錯所以當你使用saveOrUpdate(object)之前還需要判斷一下。
(3)session.merge(object),Hibernate里面自帶的方法,推薦使用。
5. SQL Grammer Exception,Could not execute JDBC batch update
當出現SQL Grammer Exception,Could not execute JDBC batch update異常時,一般是由如下問題引起:
(1)SQL語句中存在語法錯誤或是傳入的數據有誤;
(2)數據庫的配置不合法,或者說是配置有誤。較容易出現的有數據表的映射文件(,hbm.xml文件)配置有誤;Hibernate.cfg.xml文件配置有誤;
(3) 當前的數據庫用戶權限不足,不能操作數據庫。以是以Oracle 數據庫為例,這種情況下在錯誤提示中會顯示java.sql.BatchUpdateException: ORA-01031: insufficient privileges這樣的信息。
針對上面的各種原因,開發(fā)人員可以找出對應的解決方案。
http://www.tkk7.com/amigoxie/category/19976.html