當前位置:首頁 » 操作系統 » hibernate資料庫連接

hibernate資料庫連接

發布時間: 2023-06-05 19:09:54

⑴ springmvc spring hibernate 怎麼配置連接兩個資料庫

persistent.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
<persistence-unit name="userPU" transaction-type="RESOURCE_LOCAL">
<!--jpa的提供者-->
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<!--聲明資料庫連接的驅動-->
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
<!--jdbc資料庫的連接地址-->
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/manager?characterEncoding=gbk"/>
<property name="hibernate.connection.username" value="root"/>
<property name="hibernate.connection.password" value="123456"/>
<!--配置方言-->
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
<!--激活查詢日誌功能-->
<property name="hibernate.show_sql" value="true"/>
<!--優雅地輸出Sql-->
<property name="hibernate.format_sql" value="true"/>
<!--添加一條解釋型標注-->
<property name="hibernate.use_sql_comments" value="false"/>
<!--配置如何根據java模型生成資料庫表結構,常用update,validate-->
<property name="hibernate.hbm2ddl.auto" value="update"/>
</properties>
</persistence-unit>
</persistence>
applicationContext.xml配置
<!--第二步-->
<!--定義實體的工廠bean-->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.">
<property name="persistenceUnitName" value="userPU" />
<property name="persistenceXmlLocation" value="classpath:persistence.xml"></property>
</bean>

<!--第三步-->
<!--定義事務管理器-->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>

⑵ 如何配置Hibernate連接oracle12c 的PDB和CDB資料庫

1 連接到CDB

和普通實例一樣的連接。 指定ORACLE_SID 以後可以使用OS認證,也可以使用密碼進行連接。

[oracle@Ora12c /]$ echo $ORACLE_SID
cndba
[oracle@Ora12c /]$ sqlplus / as sysdba

SQL*Plus: Release 12.1.0.1.0 Proction onMon Apr 28 11:33:43 2014

Copyright (c) 1982, 2013, Oracle. All rights reserved.

Connected to:
Oracle Database 12c Enterprise EditionRelease 12.1.0.1.0 - 64bit Proction
With the Partitioning, OLAP, AdvancedAnalytics and Real Application Testing options

SQL> conn system/oracle
Connected.
SQL>

--查看CDB中可用的service:
SQL> COLUMN name FORMAT A30
SQL> SELECT name,pdb
2 FROM v$services
3 ORDER BY name;

NAME PDB
------------------------------------------------------------
SYS$BACKGROUND CDB$ROOT
SYS$USERS CDB$ROOT
cndba CDB$ROOT
cndbaXDB CDB$ROOT
pcndba2 PCNDBA2
pdbcndba PDBCNDBA

6 rows selected.

--通過lsnrctl 也可以判斷:
[oracle@Ora12c /]$ lsnrctl service

LSNRCTL for Linux: Version 12.1.0.1.0 -Proction on 28-APR-2014 11:35:31

Copyright (c) 1991, 2013, Oracle. All rights reserved.

Connecting to(DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
Services Summary...
Service "cndba" has 1instance(s).
Instance "cndba", status READY, has 1 handler(s) for thisservice...
Handler(s):
"DEDICATED" established:0 refused:0 state:ready
LOCAL SERVER
Service "cndbaXDB" has 1instance(s).
Instance "cndba", status READY, has 1 handler(s) for thisservice...
Handler(s):
"D000" established:0 refused:0 current:0 max:1022 state:ready
DISPATCHER <machine: Ora12c, pid: 10085>
(ADDRESS=(PROTOCOL=tcp)(HOST=Ora12c)(PORT=14696))
Service "pcndba2" has 1instance(s).
Instance "cndba", status READY, has 1 handler(s) for thisservice...
Handler(s):
"DEDICATED" established:0 refused:0 state:ready
LOCAL SERVER
Service "pdbcndba" has 1instance(s).
Instance "cndba", status READY, has 1 handler(s) for thisservice...
Handler(s):
"DEDICATED" established:0 refused:0 state:ready
LOCAL SERVER
The command completed successfully
[oracle@Ora12c /]$

通過這些service,就可以遠程連接CDB。

--EZCONNECT
C:\Users\Dave>sqlplussystem/[email protected]:1521/cndba

SQL*Plus: Release 11.2.0.1.0 Proction on 星期三 4月 30 11:36:48 2014

Copyright (c) 1982, 2010, Oracle. All rights reserved.

連接到:
Oracle Database 12c Enterprise EditionRelease 12.1.0.1.0 - 64bit Proction
With the Partitioning, OLAP, AdvancedAnalytics and Real Application Testing options

SQL>

--通過TNSNAMES.ORA連接:

在tnsnames.ora 中配置如下:
cndba =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.10)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = cndba)
)
)

--連接:
C:\Users\Dave>sqlplussystem/oracle@cndba

SQL*Plus: Release 11.2.0.1.0 Proction on 星期三 4月 30 11:40:01 2014

Copyright (c) 1982, 2010, Oracle. All rights reserved.

連接到:
Oracle Database 12c Enterprise EditionRelease 12.1.0.1.0 - 64bit Proction
With the Partitioning, OLAP, AdvancedAnalytics and Real Application Testing options

SQL>

2 在不同Container database中切換

在12c的架構中,因為有CDB和 PDB的存在,所以會有很多不同的container,所以在連接到不同的container時,就需要進行切換。

--查看當前的container:
SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT
SQL> SELECT SYS_CONTEXT('USERENV','CON_NAME') FROM al;

SYS_CONTEXT('USERENV','CON_NAME')
--------------------------------------------------------------------------------
CDB$ROOT

SQL> set lin 140
SQL> select con_id, dbid,guid, name , open_mode from v$pdbs;

CON_ID DBID GUID NAME OPEN_MODE
---------- ------------------------------------------ ---------- ----------
2 4088301206 PDB$SEED READ ONLY
3 PDBCNDBA READ WRITE
4 1231796139 PCNDBA2 READ WRITE

--切換container:
SQL> alter session setcontainer=pcndba2;
Session altered.

SQL> show con_name

CON_NAME
------------------------------
PCNDBA2

3 連接到PDB

--EZCONNECT:

C:\Users\Dave>sqlplussystem/[email protected]:1521/pcndba2

SQL*Plus: Release 11.2.0.1.0 Proction on 星期三 4月 30 11:54:30 2014

Copyright (c) 1982, 2010, Oracle. All rights reserved.

連接到:
Oracle Database 12c Enterprise EditionRelease 12.1.0.1.0 - 64bit Proction
With the Partitioning, OLAP, AdvancedAnalytics and Real Application Testing options

SQL>

--TNSNAMES.ora

在tnsnames.ora 中添加如下內容:
pcndba =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.10)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = pcndba2)
)
)

C:\Users\Dave>sqlplussystem/oracle@pcndba

SQL*Plus: Release 11.2.0.1.0 Proction on 星期三 4月 30 11:55:50 2014

Copyright (c) 1982, 2010, Oracle. All rights reserved.

連接到:
Oracle Database 12c Enterprise EditionRelease 12.1.0.1.0 - 64bit Proction
With the Partitioning, OLAP, AdvancedAnalytics and Real Application Testing options

SQL>

⑶ hibernate連接h2資料庫配置怎麼寫

大家可以參考下這個網站http://eoffice.im.fju.e.tw/phpbb/viewtopic.php?p=28685

1.先啟動項目上的h2/bin下的h2.bat或h2w.bat文件,把h2資料庫啟動起來

2.SSH2框架和h2資料庫整合方法
2.1先在資料庫下創建 schema目錄(相當於一個資料庫實例)

create schema fdrkftcode
目的是解決這種異常 org.h2.jdbc.JdbcSQLException: Schema "fdrkftcode" not found; ...

2.2在schema目錄下創建表,如創建系統用戶表admin
create table fdrkftcode.admin(
id int primary key,
adminname varchar(50),
username varchar(50),
userpwd varchar(50),
adminrights varchar(50),
createdate datetime,
usedtimes int,
lastlogin datetime,
curstatus int,
remark varchar(200)
)

3.為了使用hibernate操作h2,需要作如下設置,在sql編輯窗口輸入下面這些腳本
對於實體pojo對象的映射,我是用的annotation,關鍵是id主鍵的映射,如下:
@Column(name = "ID", nullable = false)

@Id

@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "ABC_ID_SEQ")

@SequenceGenerator(name = "ABC_ID_SEQ", sequenceName = "ABC_ID_SEQ")

protected Long id;

注意這里的GeneratedValue和SequenceGenerator的使用,這屬於JPA規范,全部來自javax.persisten

4.配置applicationContext.xml文件,主要有三個地方要注意:
4.1修改連接資料庫的JDBC驅動 driverClass的值為org.h2.Driver
4.2修改連接資料庫所用的URL字元串 jdbcUrl的值為jdbc:h2:tcp://localhost/~/FDRKFTCODE;MODE=MySQL;AUTO_SERVER=TRUE
4.3修改Hibernate的資料庫方言hibernate.dialect為org.hibernate.dialect.H2Dialect

5.h2資料庫一些常用操作
5.1幫助命令help
5.2表中某欄位重命名 ALTER TABLE fdrkftcode.admin ALTER COLUMN usepwd rename to userpwd
5.3表中新增欄位 ALTER TABLE fdrkftcode.admin ADD IF NOT EXISTS abc varchar(50)
5.4表中刪除欄位 ALTER TABLE fdrkftcode.admin DROP COLUMN IF EXISTS abc
5.5查找表中記錄 SELECT * from fdrkftcode.admin
5.6往表中插入記錄 INSERT INTO fdrkftcode.admin VALUES (1,'管理員','admin','admin','10000000000000000000','2013-05-1 00:12:34',3,'2013-05-1 15:32:57',1,'超過級管理員')
5.7修改表中某記錄 UPDATE fdrkftcode.admin SET fdrkftcode.admin.adminname='超級管理員' where fdrkftcode.admin.id=1

5.8刪除表中某記錄 DELETE FROM fdrkftcode.admin WHERE fdrkftcode.admin.id=1
6.下面是我項目的applicationContext.xml配置方法,大家可以參考下
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

<!-- 定義使用C3P0連接池的數據源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<!-- 指定連接資料庫的JDBC驅動 -->
<property name="driverClass">
<value>org.h2.Driver</value>
</property>
<!-- 連接資料庫所用的URL -->
<property name="jdbcUrl">
<value>jdbc:h2:tcp://localhost/~/FDRKFTCODE;MODE=MySQL;AUTO_SERVER=TRUE</value>
</property>
<!-- 連接資料庫的用戶名 -->
<property name="user">
<value>sa</value>
</property>
<!-- 連接資料庫的密碼 -->
<property name="password">
<value></value>
</property>
<!-- 設置資料庫連接池的最大連接數 -->
<property name="maxPoolSize">
<value>50</value>
</property>
<!-- 設置資料庫連接池的最小連接數 -->
<property name="minPoolSize">
<value>5</value>
</property>
<!-- 設置資料庫連接池的初始化連接數 -->
<property name="initialPoolSize">
<value>5</value>
</property>
<!-- 設置資料庫連接池的連接的最大空閑時間,單位為秒 -->
<property name="maxIdleTime">
<value>20</value>
</property>
</bean>

<!-- 定義Hibernate的SessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<!-- 依賴注入上面定義的數據源dataSource -->
<property name="dataSource" ref="dataSource"/>
<!-- 注冊Hibernate的ORM映射文件 -->
<property name="mappingResources">
<list>
<value>com/sungoal/ORM/Admin.hbm.xml</value>
</list>
</property>
<!-- 設置Hibernate的相關屬性 -->
<property name="hibernateProperties">
<props>
<!-- 設置Hibernate的資料庫方言 -->
<prop key="hibernate.dialect">org.hibernate.dialect.H2Dialect</prop>
<!-- 設置Hibernate是否在控制台輸出SQL語句,開發調試階段通常設為true -->
<prop key="show_sql">true</prop>
<!-- 設置Hibernate一個提交批次中的最大SQL語句數 -->
<prop key="hibernate.jdbc.batch_size">50</prop>
</props>
</property>
</bean>

<!--定義Hibernate的事務管理器HibernateTransactionManager -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<!-- 依賴注入上面定義的sessionFactory -->
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- 裝配通用資料庫訪問類BaseDAOImpl -->
<bean id="" class="com.sungoal.DAO.BaseDAOImpl">
<!-- 依賴注入上面定義的sessionFactory -->
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- 部署系統用戶管理業務控制器AdminAction -->
<bean id="adminAction" class="com.sungoal.struts.action.AdminAction" scope="prototype">
<property name="" ref=""/>
</bean>
</beans>

⑷ hibernate,jpa資料庫連接問題。我沒法確定要連接什麼資料庫,但是我要用原生sql來update數據

寫個適配器器吧,傳入資料庫類型,輸出拼接的sql。

其實個人更建議你使用hibernate的Hql來作sql相關操作,首先它語法和通用Sql是近似的,不一樣的地方在於 語句里寫的是類名 不是表名,最後hibernate會根據Hql翻譯成當前資料庫可執行的sql來執行,這樣你就不需要去判斷究竟是什麼資料庫,寫法支持不支持。

當然,如果你的語句特復雜一定得用Sql server或者Oracle的特殊語法,那沒辦法,寫個適配器吧

以下是HQL相關資料

HQL查詢:
Criteria查詢對查詢條件進行了面向對象封裝,符合編程人員的思維方式,不過HQL(Hibernate Query Lanaguage)查詢提供了更加豐富的和靈活的查詢特性,因此
Hibernate將HQL查詢方式立為官方推薦的標准查詢方式,HQL查詢在涵蓋Criteria查詢的所有功能的前提下,提供了類似標准SQL語句的查詢方式,同時也提供了更
加面向對象的封裝。完整的HQL語句形勢如下:
Select/update/delete…… from …… where …… group by …… having …… order by …… asc/desc
其中的update/delete為Hibernate3中所新添加的功能,可見HQL查詢非常類似於標准SQL查詢。由於HQL查詢在整個Hibernate實體操作體系中的核心地位,這一節我
將專門圍繞HQL操作的具體技術細節進行講解。
1、 實體查詢:
有關實體查詢技術,其實我們在先前已經有多次涉及,比如下面的例子:
String hql=」from User user 」;
List list=session.CreateQuery(hql).list();
上面的代碼執行結果是,查詢出User實體對象所對應的所有數據,而且將數據封裝成User實體對象,並且放入List中返回。這里需要注意的是,Hibernate的實體查
詢存在著對繼承關系的判定,比如我們前面討論映射實體繼承關系中的Employee實體對象,它有兩個子類分別是HourlyEmployee,SalariedEmployee,如果有這樣的
HQL語句:「from Employee」,當執行檢索時Hibernate會檢索出所有Employee類型實體對象所對應的數據(包括它的子類HourlyEmployee,SalariedEmployee對應
的數據)。
因為HQL語句與標准SQL語句相似,所以我們也可以在HQL語句中使用where字句,並且可以在where字句中使用各種表達式,比較操作符以及使用「and」,」or」連接
不同的查詢條件的組合。看下面的一些簡單的例子:
from User user where user.age=20;
from User user where user.age between 20 and 30;
from User user where user.age in(20,30);
from User user where user.name is null;
from User user where user.name like 『%zx%』;
from User user where (user.age%2)=1;
from User user where user.age=20 and user.name like 『%zx%』;
2、 實體的更新和刪除:
在繼續講解HQL其他更為強大的查詢功能前,我們先來講解以下利用HQL進行實體更新和刪除的技術。這項技術功能是Hibernate3的新加入的功能,在Hibernate2
中是不具備的。比如在Hibernate2中,如果我們想將資料庫中所有18歲的用戶的年齡全部改為20歲,那麼我們要首先將年齡在18歲的用戶檢索出來,然後將他們的
年齡修改為20歲,最後調用Session.update()語句進行更新。在Hibernate3中對這個問題提供了更加靈活和更具效率的解決辦法,如下面的代碼:
Transaction trans=session.beginTransaction();
String hql=」update User user set user.age=20 where user.age=18」;
Query queryupdate=session.createQuery(hql);
int ret=queryupdate.executeUpdate();
trans.commit();
通過這種方式我們可以在Hibernate3中,一次性完成批量數據的更新,對性能的提高是相當的可觀。同樣也可以通過類似的方式來完成delete操作,如下面的代碼

Transaction trans=session.beginTransaction();
String hql=」delete from User user where user.age=18」;
Query queryupdate=session.createQuery(hql);
int ret=queryupdate.executeUpdate();
trans.commit();
如果你是逐個章節閱讀的化,那麼你一定會記起我在第二部分中有關批量數據操作的相關論述中,討論過這種操作方式,這種操作方式在Hibernate3中稱為bulk
delete/update,這種方式能夠在很大程度上提高操作的靈活性和運行效率,但是採用這種方式極有可能引起緩存同步上的問題(請參考相關論述)。
3、 屬性查詢:
很多時候我們在檢索數據時,並不需要獲得實體對象所對應的全部數據,而只需要檢索實體對象的部分屬性所對應的數據。這時候就可以利用HQL屬性查詢技術
,如下面程序示例:
List list=session.createQuery(「select user.name from User user 」).list();
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
我們只檢索了User實體的name屬性對應的數據,此時返回的包含結果集的list中每個條目都是String類型的name屬性對應的數據。我們也可以一次檢索多個屬性,
如下面程序:
List list=session.createQuery(「select user.name,user.age from User user 」).list();
for(int i=0;i<list.size();i++){
Object[] obj=(Object[])list.get(i);
System.out.println(obj[0]);
System.out.println(obj[1]);
}
此時返回的結果集list中,所包含的每個條目都是一個Object[]類型,其中包含對應的屬性數據值。作為當今我們這一代深受面向對象思想影響的開發人員,可能
會覺得上面返回Object[]不夠符合面向對象風格,這時我們可以利用HQL提供的動態構造實例的功能對這些平面數據進行封裝,如下面的程序代碼:
List list=session.createQuery(「select new User(user.name,user.age) from User user 」).list();
for(int i=0;i<list.size();i++){
User user=(User)list.get(i);
System.out.println(user.getName());
System.out.println(user.getAge());
}
這里我們通過動態構造實例對象,對返回結果進行了封裝,使我們的程序更加符合面向對象風格,但是這里有一個問題必須注意,那就是這時所返回的User對象,
僅僅只是一個普通的Java對象而以,除了查詢結果值之外,其它的屬性值都為null(包括主鍵值id),也就是說不能通過Session對象對此對象執行持久化的更新操
作。如下面的代碼:
List list=session.createQuery(「select new User(user.name,user.age) from User user 」).list();
for(int i=0;i<list.size();i++){
User user=(User)list.get(i);
user.setName(「gam」);
session.saveOrUpdate(user);//這里將會實際執行一個save操作,而不會執行update操作,因為這個User對象的id屬性為null,Hibernate會把它作為一個自由對
象(請參考持久化對象狀態部分的論述),因此會對它執行save操作。
}
4、 分組與排序
A、Order by子句:
與SQL語句相似,HQL查詢也可以通過order by子句對查詢結果集進行排序,並且可以通過asc或者desc關鍵字指定排序方式,如下面的代碼:
from User user order by user.name asc,user.age desc;
上面HQL查詢語句,會以name屬性進行升序排序,以age屬性進行降序排序,而且與SQL語句一樣,默認的排序方式為asc,即升序排序。
B、Group by子句與統計查詢:
在HQL語句中同樣支持使用group by子句分組查詢,還支持group by子句結合聚集函數的分組統計查詢,大部分標準的SQL聚集函數都可以在HQL語句中使用,比如:
count(),sum(),max(),min(),avg()等。如下面的程序代碼:
String hql=」select count(user),user.age from User user group by user.age having count(user)>10 」;
List list=session.createQuery(hql).list();
C、優化統計查詢:
假設我們現在有兩張資料庫表,分別是customer表和order表,它們的結構如下:
customer
ID varchar2(14)
age number(10)
name varchar2(20)

order
ID varchar2(14)
order_number number(10)
customer_ID varchar2(14)
現在有兩條HQL查詢語句,分別如下:
from Customer c inner join c.orders o group by c.age;(1)

select c.ID,c.name,c.age,o.ID,o.order_number,o.customer_ID
from Customer c inner join c.orders c group by c.age;(2)
這兩條語句使用了HQL語句的內連接查詢(我們將在HQL語句的連接查詢部分專門討論),現在我們可以看出這兩條查詢語句最後所返回的結果是一樣的,但是它們
其實是有明顯區別的,語句(1)檢索的結果會返回Customer與Order持久化對象,而且它們會被置於Hibernate的Session緩存之中,並且Session會負責它們在緩存
中的唯一性以及與後台資料庫數據的同步,只有事務提交後它們才會從緩存中被清除;而語句(2)返回的是關系數據而並非是持久化對象,因此它們不會佔用
Hibernate的Session緩存,只要在檢索之後應用程序不在訪問它們,它們所佔用的內存就有可能被JVM的垃圾回收器回收,而且Hibernate不會同步對它們的修改。
在我們的系統開發中,尤其是Mis系統,不可避免的要進行統計查詢的開發,這類功能有兩個特點:第一數據量大;第二一般情況下都是只讀操作而不會涉及到對統
計數據進行修改,那麼如果採用第一種查詢方式,必然會導致大量持久化對象位於Hibernate的Session緩存中,而且Hibernate的Session緩存還要負責它們與數據
庫數據的同步。而如果採用第二種查詢方式,顯然就會提高查詢性能,因為不需要Hibernate的Session緩存的管理開銷,而且只要應用程序不在使用這些數據,它
們所佔用的內存空間就會被回收釋放。
因此在開發統計查詢系統時,盡量使用通過select語句寫出需要查詢的屬性的方式來返回關系數據,而避免使用第一種查詢方式返回持久化對象(這種方式是在有
修改需求時使用比較適合),這樣可以提高運行效率並且減少內存消耗。㊣真正的高手並不是精通一切,而是精通在合適的場合使用合適的手段。
5、 參數綁定:
Hibernate中對動態查詢參數綁定提供了豐富的支持,那麼什麼是查詢參數動態綁定呢?其實如果我們熟悉傳統JDBC編程的話,我們就不難理解查詢參數動態綁定,
如下代碼傳統JDBC的參數綁定:
PrepareStatement pre=connection.prepare(「select * from User where user.name=?」);
pre.setString(1,」zhaoxin」);
ResultSet rs=pre.executeQuery();
在Hibernate中也提供了類似這種的查詢參數綁定功能,而且在Hibernate中對這個功能還提供了比傳統JDBC操作豐富的多的特性,在Hibernate中共存在4種參數綁
定的方式,下面我們將分別介紹:
A、 按參數名稱綁定:
在HQL語句中定義命名參數要用」:」開頭,形式如下:
Query query=session.createQuery(「from User user where user.name=:customername and user.customerage=:age 」);
query.setString(「customername」,name);
query.setInteger(「customerage」,age);
上面代碼中用:customername和:customerage分別定義了命名參數customername和customerage,然後用Query介面的setXXX()方法設定名參數值,setXXX()方法包
含兩個參數,分別是命名參數名稱和命名參數實際值。
B、 按參數位置邦定:
在HQL查詢語句中用」?」來定義參數位置,形式如下:
Query query=session.createQuery(「from User user where user.name=? and user.age =? 」);
query.setString(0,name);
query.setInteger(1,age);
同樣使用setXXX()方法設定綁定參數,只不過這時setXXX()方法的第一個參數代表邦定參數在HQL語句中出現的位置編號(由0開始編號),第二個參數仍然代表參
數實際值。
註:在實際開發中,提倡使用按名稱邦定命名參數,因為這不但可以提供非常好的程序可讀性,而且也提高了程序的易維護性,因為當查詢參數的位置發生改變時
,按名稱邦定名參數的方式中是不需要調整程序代碼的。
C、 setParameter()方法:
在Hibernate的HQL查詢中可以通過setParameter()方法邦定任意類型的參數,如下代碼:
String hql=」from User user where user.name=:customername 」;
Query query=session.createQuery(hql);
query.setParameter(「customername」,name,Hibernate.STRING);
如上面代碼所示,setParameter()方法包含三個參數,分別是命名參數名稱,命名參數實際值,以及命名參數映射類型。對於某些參數類型setParameter()方法可
以更具參數值的Java類型,猜測出對應的映射類型,因此這時不需要顯示寫出映射類型,像上面的例子,可以直接這樣寫:
query.setParameter(「customername」,name);但是對於一些類型就必須寫明映射類型,比如java.util.Date類型,因為它會對應Hibernate的多種映射類型,比如
Hibernate.DATA或者Hibernate.TIMESTAMP。
D、 setProperties()方法:
在Hibernate中可以使用setProperties()方法,將命名參數與一個對象的屬性值綁定在一起,如下程序代碼:
Customer customer=new Customer();
customer.setName(「pansl」);
customer.setAge(80);
Query query=session.createQuery(「from Customer c where c.name=:name and c.age=:age 」);
query.setProperties(customer);
setProperties()方法會自動將customer對象實例的屬性值匹配到命名參數上,但是要求命名參數名稱必須要與實體對象相應的屬性同名。
這里還有一個特殊的setEntity()方法,它會把命名參數與一個持久化對象相關聯,如下面代碼所示:
Customer customer=(Customer)session.load(Customer.class,」1」);
Query query=session.createQuery(「from Order order where order.customer=:customer 」);
query. setProperties(「customer」,customer);
List list=query.list();
上面的代碼會生成類似如下的SQL語句:
Select * from order where customer_ID=』1』;
E、 使用綁定參數的優勢:
我們為什麼要使用綁定命名參數?任何一個事物的存在都是有其價值的,具體到綁定參數對於HQL查詢來說,主要有以下兩個主要優勢:
①、 可以利用資料庫實施性能優化,因為對Hibernate來說在底層使用的是PrepareStatement來完成查詢,因此對於語法相同參數不同的SQL語句,可
以充分利用預編譯SQL語句緩存,從而提升查詢效率。
②、 可以防止SQL Injection安全漏洞的產生:
SQL Injection是一種專門針對SQL語句拼裝的攻擊方式,比如對於我們常見的用戶登錄,在登錄界面上,用戶輸入用戶名和口令,這時登錄驗證程序可能會生成如
下的HQL語句:
「from User user where user.name=』」+name+」』 and user.password=』」+password+」』 」
這個HQL語句從邏輯上來說是沒有任何問題的,這個登錄驗證功能在一般情況下也是會正確完成的,但是如果在登錄時在用戶名中輸入」zhaoxin or 『x』=』x」,
這時如果使用簡單的HQL語句的字元串拼裝,就會生成如下的HQL語句:
「from User user where user.name=』zhaoxin』 or 『x』=』x』 and user.password=』admin』 」;
顯然這條HQL語句的where字句將會永遠為真,而使用戶口令的作用失去意義,這就是SQL Injection攻擊的基本原理。
而使用綁定參數方式,就可以妥善處理這問題,當使用綁定參數時,會得到下面的HQL語句:
from User user where user.name=』』zhaoxin』』 or 『』x=』』x』』 『 and user.password=』admin』;由此可見使用綁定參數會將用戶名中輸入的單引號解
析成字元串(如果想在字元串中包含單引號,應使用重復單引號形式),所以參數綁定能夠有效防止SQL Injection安全漏洞。

熱點內容
scratch少兒編程課程 發布:2025-04-16 17:11:44 瀏覽:627
榮耀x10從哪裡設置密碼 發布:2025-04-16 17:11:43 瀏覽:356
java從入門到精通視頻 發布:2025-04-16 17:11:43 瀏覽:73
php微信介面教程 發布:2025-04-16 17:07:30 瀏覽:297
android實現陰影 發布:2025-04-16 16:50:08 瀏覽:787
粉筆直播課緩存 發布:2025-04-16 16:31:21 瀏覽:337
機頂盒都有什麼配置 發布:2025-04-16 16:24:37 瀏覽:202
編寫手游反編譯都需要學習什麼 發布:2025-04-16 16:19:36 瀏覽:800
proteus編譯文件位置 發布:2025-04-16 16:18:44 瀏覽:356
土壓縮的本質 發布:2025-04-16 16:13:21 瀏覽:582