国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

香港云服务器
服務器之家 - 編程語言 - Java教程 - spring對JDBC和orm的支持實例詳解

spring對JDBC和orm的支持實例詳解

2021-01-05 10:57動力節點 Java教程

這篇文章主要介紹了spring對JDBC和orm的支持實例詳解,需要的朋友可以參考下

簡介

Spring提供的DAO(數據訪問對象)支持主要的目的是便于以標準的方式使用不同的數據訪問技術,如JDBC,Hibernate或者JDO等。它不僅可以讓你方便地在這些持久化技術間切換, 而且讓你在編碼的時候不用考慮處理各種技術中特定的異常。

一致的異常層次

Spring提供了一種方便的方法,把特定于某種技術的異常,如SQLException, 轉化為自己的異常,這種異常屬于以 DataAccessException 為根的異常層次。這些異常封裝了原始異常對象,這樣就不會有丟失任何錯誤信息的風險。

如果使用攔截器方式,你在應用中 就得自己小心處理HibernateException、 JDOException等,最好是委托給 SessionFactoryUtils的 convertHibernateAccessException、 convertJdoAccessException等方法。這些方法可以把相應的異常轉 化為與org.springframework.dao中定義的異常層次相兼容的異常。

一致的DAO支持抽象類

為了便于以一種一致的方式使用各種數據訪問技術,如JDBC、JDO和Hibernate, Spring提供了一套抽象DAO類供你擴展。這些抽象類提供了一些方法,通過它們你可以 獲得與你當前使用的數據訪問技術相關的數據源和其他配置信息。

1:JdbcDaoSupport - JDBC數據訪問對象的基類。 需要一個DataSource,同時為子類提供 JdbcTemplate。

2:HibernateDaoSupport - Hibernate數據訪問對象的基類。 需要一個SessionFactory,同時為子類提供 HibernateTemplate。也可以選擇直接通過 提供一個HibernateTemplate來初始化。

3:JdoDaoSupport - JDO數據訪問對象的基類。 需要設置一個PersistenceManagerFactory, 同時為子類提供JdoTemplate。

4:JpaDaoSupport - JPA數據訪問對象的基類。 需要一個EntityManagerFactory,同時 為子類提供JpaTemplate。

簡介

Spring JDBC抽象框架所帶來的價值將在以下幾個方面得以體現:(注:使用了Spring JDBC抽象框架之后,應用開發人員只需要完成斜體加粗字部分的編碼工作。)

1:指定數據庫連接參數

2:打開數據庫連接

3:聲明SQL語句

4:預編譯并執行SQL語句

5:遍歷查詢結果(如果需要的話)

6:處理每一次遍歷操作

7:處理拋出的任何異常

8:處理事務

9:關閉數據庫連接

Spring將替我們完成所有單調乏味的JDBC底層細節處理工作

Spring JDBC抽象框架由四個包構成:core、 dataSource、object以及support

1:core包由JdbcTemplate類以及相關的回調接口和類組成。

2:datasource包由一些用來簡化DataSource訪問的工具類,以及各種DataSource接口的簡單實現(主要用于單元測試以及在J2EE容器之外使用JDBC)組成。

3:object包由封裝了查詢、更新以及存儲過程的類組成,這些類的對象都是線程安全并且可重復使用的。它們類似于JDO,與JDO的不同之處在于查詢結果與數據庫是“斷開連接”的。它們是在core包的基礎上對JDBC更高層次的抽象。

4:support包提供了一些SQLException的轉換類以及相關的工具類。

在JDBC處理過程中拋出的異常將被轉換成org.springframework.dao包中定義的異常。因此使用Spring JDBC進行開發將不需要處理JDBC或者特定的RDBMS才會拋出的異常。所有的異常都是unchecked exception,這樣我們就可以對傳遞到調用者的異常進行有選擇的捕獲。

JdbcTemplate是core包的核心類。它替我們完成了資源的創建以及釋放工作,從而簡化了對JDBC的使用。它還可以幫助我們避免一些常見的錯誤,比如忘記關閉數據庫連接。

定義接口如下:

java代碼:

?
1
2
3
public interface Api {
public boolean create(UserModel um); 
}

定義實現類如下:

java代碼:

?
1
2
3
4
5
6
7
8
9
10
11
public class Impl implements Api{
private DataSource ds = null;
public void setDs(DataSource ds){
this.ds = ds;
}
public boolean create(UserModel um) {
JdbcTemplate jt = new JdbcTemplate(ds);
jt.execute("insert into tbl_user (uuid,name) values('"+um.getUuid()+"','"+um.getName()+"')");
return false;
}
}

配置文件

java代碼:

?
1
2
3
4
5
6
7
8
9
<bean name="api" class="com.bjpowernode.Spring3.jdbc.Impl">
<property name="ds" ref="dataSource"></property>
</bean>
<bean name="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"><value>oracle.jdbc.driver.OracleDriver</value></property>
<property name="url"><value>jdbc:oracle:thin:@localhost:1521:orcl</value></property>
<property name="username"> <value>test</value> </property>
<property name="password" value="test"/>
</bean>

客戶端

java代碼:

?
1
2
3
4
5
6
7
8
9
public static void main(String[] args)throws Exception {
ApplicationContext context = new ClassPathXmlApplicationContext(
  new String[] {"applicationContext-jdbc.xml"});
Api api = (Api)context.getBean("api");
UserModel um = new UserModel();
um.setUuid("test1");
um.setName("test1");
api.create(um);
}

如果是需要向里面傳遞參數的,就需要回調接口,如下:

java代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public boolean create(UserModel um1){
JdbcTemplate jt = new JdbcTemplate(ds);
final UserModel um = um1;
class myCallBack implements PreparedStatementCallback{
public Object doInPreparedStatement(PreparedStatement pstmt)
throws SQLException, DataAccessException {
pstmt.setString(1,um.getUuid());
pstmt.setString(2,um.getName());
System.out.println("dddddddd");
return pstmt.executeUpdate();
}
}
jt.execute("insert into tbl_user (uuid,name) values(?,?)",new myCallBack());
return false;
}

spring對JDBC和orm的支持實例詳解

NamedParameterJdbcTemplate類在SQL語句中支持使用命名參數,比較適合做查詢,如果做更新,同樣需要使用回調方法,如下:

java代碼:

?
1
2
3
4
5
6
7
8
9
NamedParameterJdbcTemplate jt = new NamedParameterJdbcTemplate(ds);
Map paramMap = new HashMap();
paramMap.put("uuid",um.getUuid());
List list = jt.queryForList("select * from tbl_user where uuid=:uuid",paramMap);
Iterator it = list.iterator();
while(it.hasNext()){
Map map = (Map)it.next();
System.out.println("uuid="+map.get("uuid")+",name="+map.get("name"));
}

NamedParameterJdbcTemplate類是線程安全的,該類的最佳使用方式不是每次操作的時候實例化一個新的

NamedParameterJdbcTemplate,而是針對每個DataSource只配置一個NamedParameterJdbcTemplate實例

NamedParameterJdbcTemplate也可以自己做mapper,如下:

java代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
NamedParameterJdbcTemplate jt = new NamedParameterJdbcTemplate(ds);
Map paramMap = new HashMap();
paramMap.put("uuid",um1.getUuid());
RowMapper mapper = new RowMapper() { 
  public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
   UserModel um = new UserModel();
   um.setName(rs.getString("name"));
   um.setUuid(rs.getString("uuid"));
   return um;
  }
 };
List list = jt.query("select * from tbl_user where uuid=:uuid",paramMap,mapper);
Iterator it = list.iterator();
while(it.hasNext()){
UserModel tempUm = (UserModel)it.next();
System.out.println("uuid="+tempUm.getUuid()+",name="+tempUm.getName());
}

SimpleJdbcTemplate類

SimpleJdbcTemplate類是JdbcTemplate類的一個包裝器(wrapper),它利用了Java 5的一些語言特性,比如Varargs和Autoboxing。

SQLExceptionTranslator接口

SQLExceptionTranslator是一個接口,如果你需要在 SQLException和org.springframework.dao.DataAccessException之間作轉換,那么必須實現該接口。

轉換器類的實現可以采用一般通用的做法(比如使用JDBC的SQLState code),如果為了使轉換更準確,也可以進行定制(比如使用Oracle的error code)。

SQLErrorCodeSQLExceptionTranslator是SQLExceptionTranslator的默認實現。 該實現使用指定數據庫廠商的error code,比采用SQLState更精確。

DataSourceUtils類

DataSourceUtils是一個幫助類提供易用且強大的數據庫訪問能力,們可以使用該類提供的靜態方法從JNDI獲取數據庫連接以及在必要的時候關閉之。

尤其在使用標準JDBC,但是又想要使用Spring的事務的時候,最好從DataSourceUtils類來獲取JDBC的連接。

SmartDataSource接口

SmartDataSource是DataSource 接口的一個擴展,用來提供數據庫連接。使用該接口的類在指定的操作之后可以檢查是否需要關閉連接。

AbstractDataSource類

它實現了DataSource接口的 一些無關痛癢的方法,如果你需要實現自己的DataSource,那么繼承 該類是個好主意 。

SingleConnectionDataSource類

是SmartDataSource接口 的一個實現,其內部包裝了一個單連接。該連接在使用之后將不會關閉,很顯然它不能在多線程 的環境下使用

簡介

Spring在資源管理,DAO實現支持以及事務策略等方面提供了與 JDO、JPA、Hibernate、TopLink及iBATIS的集成。以Hibernate為例,Spring通過使用許多IoC的便捷特性對它提供了一流的支持,幫助你處理很多典型的Hibernate整合的問題。所有的這些支持,都遵循Spring通用的事務和DAO異常體系。通常來說有兩種不同的整合風格:你可以使用Spring提供的DAO模板,或者直接使用Hibernate/JDO/TopLink等工具的原生API編寫DAO。無論采取哪種風格,這些DAO都可以通過IoC進行配置,并參與到Spring的資源和事務管理中去。

使用Spring構建你的O/R Mapping DAO的好處包括:

1:測試簡單

2:異常封裝

3:通用的資源管理

4:綜合的事務管理

5:避免綁定特定技術允許mix-and-match的實現策略

在Spring的application context中創建 SessionFactory ,如下:

java代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<bean id="hbConfig"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource"><ref local="dataSource"/></property>
<property name="mappingResources">
<list>
<value>com/lx/Parent.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.Oracle9Dialect
</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>

定義接口如下:

java代碼:

?
1
2
3
public interface Api {
public boolean create(UserModel um);
}

實現類如下:

java代碼:

?
1
2
3
4
5
6
7
8
9
10
11
public class Impl implements Api{
private SessionFactory sf = null;
public void setSf(SessionFactory sf){
this.sf = sf;
}
public boolean create(UserModel um){
HibernateTemplate ht = new HibernateTemplate(sf);
ht.save(um);
return false;
}
}

配置文件如下:

java代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
<bean name="api" class="com.bjpowernode.Spring3.h3.Impl">
<property name="sf" ref="hbConfig"></property>
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName">
<value>oracle.jdbc.driver.OracleDriver</value>
</property>
<property name="url">
<value>jdbc:oracle:thin:@localhost:1521:orcl</value>
</property>
<property name="username"> <value>test</value> </property>
<property name="password" value="test"/>
</bean>

配置文件如下:

java代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<bean id="hbConfig" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource"><ref local="dataSource"/></property>
<property name="mappingResources">
<list> <value>cn/bjpowernode/Spring3/h3/UserModel.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.Oracle8iDialect
</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>

客戶端文件如下:

java代碼:

?
1
2
3
4
5
6
7
8
9
public static void main(String[] args)throws Exception {
ApplicationContext context = new ClassPathXmlApplicationContext(
  new String[] {"applicationContext-h3.xml"});
Api api = (Api)context.getBean("api");
UserModel um = new UserModel();
um.setUuid("test1");
um.setName("test1");
api.create(um);
}

前面的演示是更新操作,那么查詢怎么做呢?如下:

java代碼:

?
1
List<UserModel> list = ht.find("select o from UserModel o");

要傳入參數怎么做呢?如下:

java代碼:

?
1
2
3
Object params[] = new Object[1];
params[0] = "test1";
List<UserModel> list = ht.find("select o from UserModel o where o.uuid=?",params);

要傳入命名參數怎么做呢?如下:

java代碼:

?
1
2
3
4
5
Object params[] = new Object[1];
params[0] = "test1";
String names[] = new String[1];
names[0] = "uuid";
List<UserModel> list = ht.findByNamedParam("select o from UserModel o where o.uuid=:uuid",names,params);

如果需要使用Hibernate的Query接口,該怎么做呢?如下:

java代碼:

?
1
2
3
4
5
6
7
8
HibernateCallback hcb =new HibernateCallback(){
public Object doInHibernate(Session session)throws HibernateException, SQLException {
Query q = session.createQuery("select o from UserModel o where o.uuid=:uuid");
q.setString("uuid", um.getUuid());
return q.list();
}
};
Collection<UserModel> list = (Collection<UserModel>)ht.execute(hcb);

一個回調實現能夠有效地在任何Hibernate數據訪問中使用。HibernateTemplate 會確保當前Hibernate的 Session 對象的正確打開和關閉,并直接參與到事務管理中去。 Template實例不僅是線程安全的,同時它也是可重用的。因而他們可以作為外部對象的實例變量而被持有。
實現類改成如下:

java代碼:

?
1
2
3
4
5
6
7
8
9
public class Impl extends HibernateDaoSupport implements Api{
public Collection testQuery(){
List<UserModel> list = this.getHibernateTemplate().find("select o from UserModel o");
for(UserModel tempUm : list){
System.out.println("uuid=="+tempUm.getUuid()+",name="+tempUm.getName());
}
return list;
}
}

配置文件改成如下:

java代碼:

?
1
2
3
<bean name="api" class="com.bjpowernode.Spring3.h3.Impl">
<property name="sessionFactory" ref="hbConfig"></property>
</bean>

 要想使用Session怎么辦?如下:

java代碼:

?
1
Session session = getSession(getSessionFactory(), false);

通常將一個false作為參數(表示是否允許創建)傳遞到 getSession(..) 方法中進行調用。 此時,整個調用將在同一個事務內完成(它的整個生命周期由事務控制,避免了關閉返回的 Session 的需要)。

總結

以上所述是小編給大家介紹的spring對JDBC和orm的支持實例詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!

原文鏈接:http://blog.sina.com.cn/s/blog_9c6852670102wvy5.html

延伸 · 閱讀

精彩推薦
570
主站蜘蛛池模板: 亚洲精品网址 | 中国黄色毛片 大片 | 亚洲午夜精品毛片成人播放器 | 国产精品毛片久久久久久久 | 特级av | 91在线视频观看 | 欧美a级网站 | 色乱码一区二区三区网站 | 四虎av成人| 国产成人精品一区二区三区四区 | 中文字幕一区二区三区精彩视频 | 国产亚洲综合一区二区 | 色香蕉在线 | 久久专区 | 亚洲精品国产精品国自产在线 | 国产综合久久 | caoporn视频| 欧美中文在线 | 久久精品视频一区 | 干中文字幕 | 黄色影视在线免费观看 | 欧洲毛片| 成人免费看黄色 | 国产在线观看一区二区 | 狠狠色狠色综合曰曰 | 成年人免费在线观看视频网站 | 伊人伊人网| 粉嫩欧美一区二区三区高清影视 | 日韩亚洲 | 久久久久久高清 | 欧美怡红院视频一区二区三区 | 午夜视频在线免费观看 | 色婷婷综合久久久中字幕精品久久 | 黄色av免费 | 国产第一区二区三区 | 99热新 | 亚洲精品1| 午夜电影| 最新国产在线 | 成年女人免费v片 | 中文字幕在线观看精品视频 |