jdbctemplate_的使用

一、表的操做 

使用JdbcTemplate的execute()方法執行SQL語句 
    execute方法老是使用 java.sql.Statement,不接受參數,並且他不返回受影響記錄的計數,更適合於建立和丟棄表的語句。 
Java代碼   收藏代碼
  1. jdbcTemplate.execute("CREATE TABLE USER (user_id integer, name varchar(100))");    

二、增、刪和改 

update方法update方法返回的是受影響的記錄數目的一個計數,而且若是傳入參數的話,使用的是java.sql.PreparedStatement,更適合於插入,更新和刪除操做 

1)不帶參數的更新 
Java代碼   收藏代碼
  1. jdbcTemplate.update("INSERT INTO USER VALUES('"    
  2.            + user.getId() + "', '"    
  3.            + user.getName() + "', '"    
  4.            + user.getSex() + "', '"    
  5.            + user.getAge() + "')");  


2)帶參數的更新 
Java代碼   收藏代碼
  1. jdbcTemplate.update("UPDATE USER SET name = ? WHERE user_id = ?"new Object[]            {name, id});    
  2. 代碼:jdbcTemplate.update("INSERT INTO USER VALUES(?, ?, ?, ?)"new Object[] {user.g   etId(), user.getName(), user.getSex(), user.getAge()});   
  

3)JDBC的PreparedStatement 
------單個更新 
Java代碼   收藏代碼
  1. final String id = user.getId();     
  2. final String name = user.getName();     
  3. final String sex = user.getSex() + "";     
  4. final int age = user.getAge();     
  5.     
  6. jdbcTemplate.update("INSERT INTO USER VALUES(?, ?, ?, ?)",     
  7.                      new PreparedStatementSetter() {     
  8.                          public void setValues(PreparedStatement ps) throws SQLException {     
  9.                              ps.setString(1, id); //須要注意: 匿名內部類 只能訪問外部最終局部變量  
  10.                              ps.setString(2, name);               
  11.                              ps.setString(3, sex);     
  12.                              ps.setInt(4, age);     
  13.                          }     
  14.                      });   
  

------批量更新 
須要批處理,能夠實現org.springframework.jdbc.core.BatchPrepared- StatementSetter接口: 
Java代碼   收藏代碼
  1. package org.springframework.jdbc.core;  
  2. import java.sql.PreparedStatement;  
  3. import java.sql.SQLException;  
  4. public interface BatchPreparedStatementSetter {  
  5.     void setValues(PreparedStatement ps,  
  6.                       int i) throws SQLException;  
  7.     int getBatchSize();  
  8. }  
  9.    
  10. ...  
  11. public int[] insertUsers(final List users) {  
  12.     String sql = "INSERT INTO user (name,age) VALUES(?,?)";  
  13.     BatchPreparedStatementSetter setter =  
  14.       new BatchPreparedStatementSetter() {  
  15.         public void setValues(  
  16.             PreparedStatement ps, int i) throws SQLException {  
  17.             User user = (User) users.get(i);  
  18.             ps.setString(1, user.getName());  
  19.             ps.setInt(2, user.getAge().intValue());  
  20.         }  
  21.         public int getBatchSize() {  
  22.             return users.size();  
  23.         }  
  24.       };  
  25.     return jdbcTemplate.batchUpdate(sql, setter);  
  26. }  

... 
若是JDBC驅動程序支持批處理,則直接使用它的功能,若是不支持, Spring則會一個一個自動處理更新以模擬批處理。 
三、查詢 

1)使用JdbcTemplate進行查詢時,使用queryForXXX()等方法 
•         Queries, using convenience methods 
代碼:
Java代碼   收藏代碼
  1. int count = jdbcTemplate.queryForInt("SELECT COUNT(*) FROM   
USER");  
代碼:
Java代碼   收藏代碼
  1. String name = (String) jdbcTemplate.queryForObject("SELECT name FROM USER WHERE user_id = ?"new Object[] {id}, java.lang.String.class);   

代碼:
Java代碼   收藏代碼
  1. List rows = jdbcTemplate.queryForList("SELECT * FROM USER");    
  2. Returns an ArrayList (one entry for each row) of HashMaps (one entry for each column using the column name as the key)  


代碼: 
Java代碼   收藏代碼
  1. List rows = jdbcTemplate.queryForList("SELECT * FROM USER");     
  2. Iterator it = rows.iterator();     
  3. while(it.hasNext()) {     
  4.     Map userMap = (Map) it.next();     
  5.     System.out.print(userMap.get("user_id") + "\t");     
  6.     System.out.print(userMap.get("name") + "\t");     
  7.     System.out.print(userMap.get("sex") + "\t");     
  8.     System.out.println(userMap.get("age") + "\t");     
  9. }   


2)JDBC的callback方式 
•         Queries, using callback method 

A)processRow 
    在查詢到數據以後先做一些處理再傳回。能夠實現org.springframework.jdbc.core.RowCallbackHandler接口 
代碼:------單行查詢 
Java代碼   收藏代碼
  1. final User user = new User();     
  2. jdbcTemplate.query("SELECT * FROM USER WHERE user_id = ?",     
  3.                     new Object[] {id},     
  4.                     new RowCallbackHandler() {     
  5.                         public void processRow(ResultSet rs) throws SQLException { //須要注意: 匿名內部類 只能訪問外部最終局部變量  
  6.                             user.setId(rs.getString("user_id"));     
  7.                             user.setName(rs.getString("name"));     
  8.                             user.setSex(rs.getString("sex").charAt(0));     
  9.                             user.setAge(rs.getInt("age"));     
  10.                         }     
  11.                     });    

代碼:------多行查詢 
Java代碼   收藏代碼
  1. final List employees = new LinkedList();  
  2. jdbc.query("select EMPNO, FIRSTNME, LASTNAME from EMPLOYEE",  
  3.      new RowCallbackHandler() {  
  4.          public void processRow(ResultSet rs) throws SQLException {  
  5.              Employee e = new Employee();  
  6.              e.setEmpNo(rs.getString(1));  
  7.             e.setFirstName(rs.getString(2));  
  8.             e.setLastName(rs.getString(3));  
  9.             employees.add(e);  
  10.         }  
  11.     }  
  12. );  
  13. employees list will be populated with Employee objects  


B) RowMapper 
一次要取回不少查詢結果的對象,則能夠先實現org.springframe- work.jdbc.core.RowMapper接口。 
代碼:------將數據表中的數據影射成其對應的JAVA類的對象,mapRow回調方法會被ResultSet中的每一行調用。 
Java代碼   收藏代碼
  1. class UserRowMapper implements RowMapper {     
  2.     public Object mapRow(ResultSet rs, int index) throws SQLException {     
  3.         User user = new User();     
  4.     
  5.         user.setId(rs.getString("user_id"));     
  6.         user.setName(rs.getString("name"));     
  7.         user.setSex(rs.getString("sex").charAt(0));     
  8.         user.setAge(rs.getInt("age"));     
  9.     
  10.         return user;     
  11.     }     
  12. }    


傳回的結果已使用UserRowMapper的定義,將之封裝爲User對象。 

Java代碼   收藏代碼
  1. //返回多行查詢結果    
  2. public List findAllByRowMapperResultReader() {     
  3.     String sql = "SELECT * FROM USER";     
  4.     return jdbcTemplate.query(sql, new RowMapperResultReader(new UserRowMapper()));     
  5. }     
  6. the return list will be populated with User objects  
  7.    
  8. //返回單行查詢結果  
  9. 在getUser(id)裏面使用UserRowMapper  
  10. 代碼  
  11. public User getUser(final String id) throws DataAccessException {     
  12.     String sql = "SELECT * FROM USER WHERE user_id=?";     
  13.     final Object[] params = new Object[] { id };     
  14.     List list = jdbcTemplate.query(sql, params, new RowMapperResultReader(new UserRowMapper()));     
  15.     
  16.     return (User) list.get(0);     
相關文章
相關標籤/搜索