1. 程式人生 > >Spring (六) 使用Spring 內建的JdbcTemplate操作資料庫

Spring (六) 使用Spring 內建的JdbcTemplate操作資料庫

       hibernate是一個很好的ORM框架,使用Hibernate可以很好的提高開發效率,而且操作起來也是非常簡單,但是Hibernate也有一定的靈活性限制,此時就可以使用spring內建的JDBC框架;JDBC框架是對純JDBC的一個封裝,簡化了一些繁瑣的操作,而且可以自己編寫sql語句,靈活的處理業務。         Spring JDBC框架(spring-jdbc-x.x.x.RELEASE.jar)由4個部分組成:
——core包:提供了JDBC模板類,JdbcTemplate是core包的核心類
——datasource包:提供簡化訪問JDBC資料來源工具類,並提供一些DataSource簡單實現類,從而使這些DataSource                                     獲取的連線能自動得到Spring事務管理的支援

——object包:提供關係資料的物件表現形式,如MappingSqlQuery、SqlUpdate、SqlCall、SqlFunction等。
——support包:提供將JDBC異常轉換為Dao非檢查異常的轉換類和一些工具類

一、基本操作

1.主要的實現步驟

(1)編寫spring配置檔案applicationContext.xml:

  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <beans
  3.     xmlns="http://www.springframework.org/schema/beans"
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5.     xmlns:p="http://www.springframework.org/schema/p"
  6.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
  7.     <!-- 1.配置資料來源:DriverManagerDataSource -->
  8.     <beanid="dataSource"class="org.springframework.jdbc.datasource.DriverManagerDataSource"
    >
  9.         <propertyname="driverClassName"value="oracle.jdbc.OracleDriver"/>
  10.         <propertyname="url"value="jdbc:oracle:thin:@localhost:1521:orcl"/>
  11.         <propertyname="username"value="scott"/>
  12.         <propertyname="password"value="tiger"/>
  13.     </bean>
  14.     <!--2.配置JdbcTemplate -->
  15.     <beanid="jdbcTemplate"class="org.springframework.jdbc.core.JdbcTemplate">
  16.         <propertyname="dataSource"ref="dataSource"/>
  17.     </bean>
  18.     <!-- 3.為dao介面注入jdbcTemplate屬性 -->
  19.     <beanid="userDao"class="com.wzj.dao.impl.UserDaoImpl">
  20.         <propertyname="jdbcTemplate"ref="jdbcTemplate"/>
  21.     </bean>
  22.     <!-- 業務層 、Struts2、事務等同往常一樣配置-->
  23. </beans>

(2)在dao介面中使用JdbcTemplate實現方法的實現:

  1. package com.wzj.dao.impl;  
  2. import java.sql.ResultSet;  
  3. import java.sql.SQLException;  
  4. import org.springframework.jdbc.core.JdbcTemplate;  
  5. import org.springframework.jdbc.core.RowMapper;  
  6. import com.wzj.dao.UserDao;  
  7. import com.wzj.entity.User;  
  8. publicclass UserDaoImpl implements UserDao{  
  9.     //定義JdbcTemplate屬性
  10.     private JdbcTemplate jdbcTemplate;  
  11.     //省略get、set方法
  12.     @Override
  13.     public User selectUserByName(String name) {  
  14.         //定義RowMapper的物件,可以將資料中的每一行資料封裝成使用者定義的類.
  15.         //RowMapper是介面,這裡建立了一個匿名類並實現了其中的方法
  16.         RowMapper<User> row=new RowMapper<User>() {  
  17.             @Override
  18.             public User mapRow(ResultSet rs, int arg1) throws SQLException {  
  19.                 User user=new User();  
  20.                 user.setUserId(Integer.parseInt(rs.getString("USERID")));  
  21.                 user.setName(rs.getString("USERNAME"));  
  22.                 user.setPassword(rs.getString("USERPWD"));  
  23.                 return user;  
  24.             }  
  25.         };   
  26.         String sql="select * from myuser1 where username=?";  
  27.         //執行查詢
  28.         User user=jdbcTemplate.queryForObject(sql, new Object[]{name}, row);  
  29.         return user;  
  30.     }  
  31.     @Override
  32.     publicint insert(User user) {  
  33.         String sql="insert into myuser1 values(user_sequence.nextVal,?,?)";  
  34.         //執行插入
  35.         int result=jdbcTemplate.update(sql, new Object[]{user.getName(),user.getPassword()});  
  36.         return result;  
  37.     }  
  38.     @Override
  39.     publicint delete(int userId) {  
  40.         String sql="delete from myuser1 where userid=?";  
  41.         //執行修改
  42.         int result=jdbcTemplate.update(sql, new Object[]{userId});  
  43.         return result;  
  44.     }  
  45.     @Override
  46.     publicint update(User user) {  
  47.         String sql="update myuser1 set username=?,userpwd=? where userid=?";  
  48.         //執行刪除
  49.         int result=jdbcTemplate.update(sql, new Object[]{user.getName(),user.getPassword(),user.getUserId()});  
  50.         return result;  
  51.     }  
  52. }  

2.JdbcTemplate類的常用方法

方法名稱 說明
void execute(String sql) 可以用於任何sql語句
int update(String sql,Object..args) 執行DML語句,如UPDATE、INSERT、DELETE,args是其對應的引數
List<T> query(String sql,RowMapper<T> rowMapper) 執行sql查詢語句,並根據RowMapper具體的實現類返回結果型別
int queryForInt(String sql) queryForXXX(),XXX代表結果型別,執行sql查詢語句,返回結果是整數
T queryForObject(String sql,Object[] args,RowMapper<T> rowMapper) 根據sql語句和引數返回結果物件
List<Map<String,Object>> queryForList(String sql,Object..args) 根據sql語句和引數返回結果列表,每個Map的key是列名,value是該列對應的資料

二、呼叫儲存過程

Spring JdbcTemplate支援對儲存過程的呼叫(JDK最低1.5版本),JdbcTemplate支援的儲存過程回撥類如下:

——CallableStatementCreator:

通過回撥獲取JdbcTemplate提供的Connection,由使用者使用該Connection建立相關的CallableStatement

——CallableStatementCallback:

通過回撥獲取JdbcTemplate提供的CallableStatement,使用者可以再CallableStatement執行任何操作

(1)執行無返回值的儲存過程:

  1. package com.wzj.test;  
  2. import org.springframework.jdbc.core.JdbcTemplate;  
  3. publicclass Demo{  
  4.     private JdbcTemplate jdbcTemplate;  
  5.     //省略get、set
  6.     publicvoid test(){  
  7.         jdbcTemplate.execute("{call procedureName(param,param...)}");  
  8.     }  
  9. }  

(2)執行返回非結果集的儲存過程:

建立儲存過程:
  1. createorreplaceprocedure get_user_name(id in varchar2,username out varchar2) is
  2. begin
  3.     select username fromUserwhere userid=id;  
  4. end
呼叫:
  1. publicvoid test(){  
  2.     jdbcTemplate.execute(new CallableStatementCreator() {  
  3.         @Override
  4.         public CallableStatement createCallableStatement(Connection con)  
  5.                 throws SQLException {  
  6.             String userid="22";  
  7.             //建立物件
  8.             CallableStatement cs=con.prepareCall("call get_user_name(?,?)");  
  9.             //設定引數
  10.             cs.setString(1, userid);  
  11.             //設定輸出引數
  12.             cs.registerOutParameter(2, OracleTypes.VARCHAR);  
  13.             return cs;  
  14.         }  
  15.     }, new CallableStatementCallback() {  
  16.         @Override
  17.         public Object doInCallableStatement(CallableStatement cs)  
  18.                 throws SQLException, DataAccessException {  
  19.             //執行儲存過程
  20.             cs.execute();  
  21.             //獲取輸出引數
  22.             return cs.getString(2);  
  23.         }  
  24.     });  
  25. }  

(3)執行返回結果集的儲存過程:

①建立程式包:
  1. createorreplace package userpackage as
  2.   type user_cursor is ref cursor;   
  3. end userpackage;   
②建立儲存過程:
  1. createorreplaceprocedure get_user(user_cursor out userpackage.user_cursor) is
  2. begin
  3.      open user_cursor forselect * fromUser;   
  4. end;   
③呼叫:
  1. publicvoid test() {   
  2.     List userList = (List) jdbcTemplate.execute(   
  3.             new CallableStatementCreator() {   
  4.                 public CallableStatement createCallableStatement(Connection con) throws SQLException {   
  5.                     CallableStatement cs = con.prepareCall("{call get_user(?)}");   
  6.                     cs.registerOutParameter(1, OracleTypes.CURSOR);// 註冊輸出引數的型別 
  7.                     return cs;   
  8.                 }   
  9.             }, new CallableStatementCallback() {   
  10.                 public Object doInCallableStatement(CallableStatement cs) throws SQLException,DataAccessException {   
  11.                     List userMap = new ArrayList();   
  12.                     cs.execute();   
  13.                     ResultSet rs = (ResultSet) cs.getObject(1);// 獲取遊標一行的值 
  14.                     while (rs.next()) {// 轉換每行的返回值到Map中 
  15.                         Map rowMap = new HashMap();   
  16.                         rowMap.put("userid", rs.getString("userid"));   
  17.                         rowMap.put("username", rs.getString("username"));   
  18.                         userMap.add(rowMap);   
  19.                     }   
  20.                     rs.close();   
  21.                     return userMap;   
  22.                 }   
  23.             });   
  24.     for (int i = 0; i < userList.size(); i++) {   
  25.         Map rowMap = (Map) userList.get(i);   
  26.         String id = rowMap.get("userid").toString();   
  27.         String name = rowMap.get("username").toString();   
  28.         System.out.println("usreid=" + id + ";username=" + name);   
  29.     }   
  30. }