Spring (六) 使用Spring 內建的JdbcTemplate操作資料庫
阿新 • • 發佈:2019-01-25
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非檢查異常的轉換類和一些工具類
——core包:提供了JDBC模板類,JdbcTemplate是core包的核心類
——datasource包:提供簡化訪問JDBC資料來源工具類,並提供一些DataSource簡單實現類,從而使這些DataSource 獲取的連線能自動得到Spring事務管理的支援
——object包:提供關係資料的物件表現形式,如MappingSqlQuery、SqlUpdate、SqlCall、SqlFunction等。
——support包:提供將JDBC異常轉換為Dao非檢查異常的轉換類和一些工具類
一、基本操作
1.主要的實現步驟
(1)編寫spring配置檔案applicationContext.xml:
- <?xmlversion="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-4.0.xsd">
- <!-- 1.配置資料來源:DriverManagerDataSource -->
- <beanid="dataSource"class="org.springframework.jdbc.datasource.DriverManagerDataSource"
- <propertyname="driverClassName"value="oracle.jdbc.OracleDriver"/>
- <propertyname="url"value="jdbc:oracle:thin:@localhost:1521:orcl"/>
- <propertyname="username"value="scott"/>
- <propertyname="password"value="tiger"/>
- </bean>
- <!--2.配置JdbcTemplate -->
- <beanid="jdbcTemplate"class="org.springframework.jdbc.core.JdbcTemplate">
- <propertyname="dataSource"ref="dataSource"/>
- </bean>
- <!-- 3.為dao介面注入jdbcTemplate屬性 -->
- <beanid="userDao"class="com.wzj.dao.impl.UserDaoImpl">
- <propertyname="jdbcTemplate"ref="jdbcTemplate"/>
- </bean>
- <!-- 業務層 、Struts2、事務等同往常一樣配置-->
- </beans>
(2)在dao介面中使用JdbcTemplate實現方法的實現:
- package com.wzj.dao.impl;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import org.springframework.jdbc.core.JdbcTemplate;
- import org.springframework.jdbc.core.RowMapper;
- import com.wzj.dao.UserDao;
- import com.wzj.entity.User;
- publicclass UserDaoImpl implements UserDao{
- //定義JdbcTemplate屬性
- private JdbcTemplate jdbcTemplate;
- //省略get、set方法
- @Override
- public User selectUserByName(String name) {
- //定義RowMapper的物件,可以將資料中的每一行資料封裝成使用者定義的類.
- //RowMapper是介面,這裡建立了一個匿名類並實現了其中的方法
- RowMapper<User> row=new RowMapper<User>() {
- @Override
- public User mapRow(ResultSet rs, int arg1) throws SQLException {
- User user=new User();
- user.setUserId(Integer.parseInt(rs.getString("USERID")));
- user.setName(rs.getString("USERNAME"));
- user.setPassword(rs.getString("USERPWD"));
- return user;
- }
- };
- String sql="select * from myuser1 where username=?";
- //執行查詢
- User user=jdbcTemplate.queryForObject(sql, new Object[]{name}, row);
- return user;
- }
- @Override
- publicint insert(User user) {
- String sql="insert into myuser1 values(user_sequence.nextVal,?,?)";
- //執行插入
- int result=jdbcTemplate.update(sql, new Object[]{user.getName(),user.getPassword()});
- return result;
- }
- @Override
- publicint delete(int userId) {
- String sql="delete from myuser1 where userid=?";
- //執行修改
- int result=jdbcTemplate.update(sql, new Object[]{userId});
- return result;
- }
- @Override
- publicint update(User user) {
- String sql="update myuser1 set username=?,userpwd=? where userid=?";
- //執行刪除
- int result=jdbcTemplate.update(sql, new Object[]{user.getName(),user.getPassword(),user.getUserId()});
- return result;
- }
- }
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)執行無返回值的儲存過程:
- package com.wzj.test;
- import org.springframework.jdbc.core.JdbcTemplate;
- publicclass Demo{
- private JdbcTemplate jdbcTemplate;
- //省略get、set
- publicvoid test(){
- jdbcTemplate.execute("{call procedureName(param,param...)}");
- }
- }
(2)執行返回非結果集的儲存過程:
建立儲存過程:- createorreplaceprocedure get_user_name(id in varchar2,username out varchar2) is
- begin
- select username fromUserwhere userid=id;
- end
- publicvoid test(){
- jdbcTemplate.execute(new CallableStatementCreator() {
- @Override
- public CallableStatement createCallableStatement(Connection con)
- throws SQLException {
- String userid="22";
- //建立物件
- CallableStatement cs=con.prepareCall("call get_user_name(?,?)");
- //設定引數
- cs.setString(1, userid);
- //設定輸出引數
- cs.registerOutParameter(2, OracleTypes.VARCHAR);
- return cs;
- }
- }, new CallableStatementCallback() {
- @Override
- public Object doInCallableStatement(CallableStatement cs)
- throws SQLException, DataAccessException {
- //執行儲存過程
- cs.execute();
- //獲取輸出引數
- return cs.getString(2);
- }
- });
- }
(3)執行返回結果集的儲存過程:
①建立程式包:- createorreplace package userpackage as
- type user_cursor is ref cursor;
- end userpackage;
- createorreplaceprocedure get_user(user_cursor out userpackage.user_cursor) is
- begin
- open user_cursor forselect * fromUser;
- end;
- publicvoid test() {
- List userList = (List) jdbcTemplate.execute(
- new CallableStatementCreator() {
- public CallableStatement createCallableStatement(Connection con) throws SQLException {
- CallableStatement cs = con.prepareCall("{call get_user(?)}");
- cs.registerOutParameter(1, OracleTypes.CURSOR);// 註冊輸出引數的型別
- return cs;
- }
- }, new CallableStatementCallback() {
- public Object doInCallableStatement(CallableStatement cs) throws SQLException,DataAccessException {
- List userMap = new ArrayList();
- cs.execute();
- ResultSet rs = (ResultSet) cs.getObject(1);// 獲取遊標一行的值
- while (rs.next()) {// 轉換每行的返回值到Map中
- Map rowMap = new HashMap();
- rowMap.put("userid", rs.getString("userid"));
- rowMap.put("username", rs.getString("username"));
- userMap.add(rowMap);
- }
- rs.close();
- return userMap;
- }
- });
- for (int i = 0; i < userList.size(); i++) {
- Map rowMap = (Map) userList.get(i);
- String id = rowMap.get("userid").toString();
- String name = rowMap.get("username").toString();
- System.out.println("usreid=" + id + ";username=" + name);
- }
- }