首页 > 代码库 > JdbcTemplate学习笔记

JdbcTemplate学习笔记

JdbcTemplate学习笔记

1、使用JdbcTemplate的execute()方法执行SQL语句

Java 代码
        
  1. jdbcTemplate.execute("CREATE TABLE USER (user_id integer, name varchar(100))");
  2.     
  3. jdbcTemplate.execute("CREATE TABLE USER (user_id integer, name varchar(100))");  

2、如果是UPDATE或INSERT,可以用update()方法。

Java 代码
        
  1. jdbcTemplate.update("INSERT INTO USER VALUES(‘"  
  2.     
  3. + user.getId() + "‘, ‘"  
  4.     
  5. + user.getName() + "‘, ‘"  
  6.     
  7. + user.getSex() + "‘, ‘"  
  8.     
  9. + user.getAge() + "‘)");  
  10.     
  11. jdbcTemplate.update("INSERT INTO USER VALUES(‘"  
  12.     
  13. + user.getId() + "‘, ‘"  
  14.     
  15. + user.getName() + "‘, ‘"  
  16.     
  17. + user.getSex() + "‘, ‘"  
  18.     
  19. + user.getAge() + "‘)");  

3、带参数的更新

Java代码
        
  1. jdbcTemplate.update("UPDATE USER SET name = ? WHERE user_id = ?", new Object[] {name, id});    
  2.     
  3. jdbcTemplate.update("UPDATE USER SET name = ? WHERE user_id = ?", new Object[] {name, id});  
Java代码
        
  1. jdbcTemplate.update("INSERT INTO USER VALUES(?, ?, ?, ?)", new Object[] {user.getId(), user.getName(), user.getSex(), user.getAge()});    
  2.     
  3. jdbcTemplate.update("INSERT INTO USER VALUES(?, ?, ?, ?)", new Object[] {user.getId(), user.getName(), user.getSex(), user.getAge()});  

4、使用JdbcTemplate进行查询时,使用queryForXXX()等方法

Java代码
        
  1. int count = jdbcTemplate.queryForInt("SELECT COUNT(*) FROM USER");    
  2.     
  3. 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);    
  2.     
  3. 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.     
  3. List rows = jdbcTemplate.queryForList("SELECT * FROM USER");  
Java代码
        
  1. List rows = jdbcTemplate.queryForList("SELECT * FROM USER");  
  2.     
  3. Iterator it = rows.iterator();  
  4.     
  5. while(it.hasNext()) {  
  6.     
  7. Map userMap = (Map) it.next();  
  8.     
  9. System.out.print(userMap.get("user_id") + "\t");  
  10.     
  11. System.out.print(userMap.get("name") + "\t");  
  12.     
  13. System.out.print(userMap.get("sex") + "\t");  
  14.     
  15. System.out.println(userMap.get("age") + "\t");  
  16.     
  17. }  
  18.     
  19.   
  20.     
  21. List rows = jdbcTemplate.queryForList("SELECT * FROM USER");  
  22.     
  23.   
  24.     
  25. Iterator it = rows.iterator();  
  26.     
  27. while(it.hasNext()) {  
  28.     
  29. Map userMap = (Map) it.next();  
  30.     
  31. System.out.print(userMap.get("user_id") + "\t");  
  32.     
  33. System.out.print(userMap.get("name") + "\t");  
  34.     
  35. System.out.print(userMap.get("sex") + "\t");  
  36.     
  37. System.out.println(userMap.get("age") + "\t"); 
        
  38.     
  39. }  

JdbcTemplate将我们使用的JDBC的流程封装起来,包括了异常的捕捉、SQL的执行、查询结果的转换等等。spring大量使用Template Method模式来封装固定流程的动作,XXXTemplate等类别都是基于这种方式的实现。

除了大量使用Template Method来封装一些底层的操作细节,spring也大量使用callback方式类回调相关类别的方法以提供JDBC相关类别的功能,使传统的JDBC的使用者也能清楚了解spring所提供的相关封装类别方法的使用。

JDBC的PreparedStatement

Java代码
        
  1. final String id = user.getId();    
  2.     
  3. final String name = user.getName();    
  4.     
  5. final String sex = user.getSex() + "";    
  6.     
  7. final int age = user.getAge();  
  8.     
  9.   
  10.     
  11. jdbcTemplate.update("INSERT INTO USER VALUES(?, ?, ?, ?)",  
  12.     
  13.   
  14.     
  15. new PreparedStatementSetter() {    
  16.     
  17. public void setValues(PreparedStatement ps) throws SQLException {    
  18.     
  19. ps.setString(1, id);  
  20.     
  21. ps.setString(2, name);  
  22.     
  23. ps.setString(3, sex);  
  24.     
  25. ps.setInt(4, age);  
  26.     
  27. }  
  28.     
  29. });  
  30.     
  31.   
  32.     
  33. final String id = user.getId();  
  34.     
  35. final String name = user.getName();  
  36.     
  37. final String sex = user.getSex() + "";  
  38.     
  39. final int age = user.getAge();  
  40.     
  41.     
  42.     
  43. jdbcTemplate.update("INSERT INTO USER VALUES(?, ?, ?, ?)",  
  44.     
  45.     
  46.     
  47. new PreparedStatementSetter() {      
  48.     
  49. public void setValues(PreparedStatement ps) throws SQLException {    
  50.     
  51. ps.setString(1, id);    
  52.     
  53. ps.setString(2, name);      
  54.     
  55. ps.setString(3, sex);    
  56.     
  57. ps.setInt(4, age);      
  58.     
  59. }    
  60.     
  61. });        
Java代码
        
  1. final User user = new User();      
  2.     
  3. jdbcTemplate.query("SELECT * FROM USER WHERE user_id = ?",    
  4.     
  5. new Object[] {id},    
  6.     
  7. new RowCallbackHandler() {    
  8.     
  9. public void processRow(ResultSet rs) throws SQLException {    
  10.     
  11. user.setId(rs.getString("user_id"));  
  12.     
  13. user.setName(rs.getString("name"));  
  14.     
  15. user.setSex(rs.getString("sex").charAt(0));    
  16.     
  17. user.setAge(rs.getInt("age"));    
  18.     
  19. }  
  20.     
  21. });  
  22.     
  23.   
  24.     
  25. final User user = new User();  
  26.     
  27.     
  28.     
  29. jdbcTemplate.query("SELECT * FROM USER WHERE user_id = ?",    
  30.     
  31. new Object[] {id},      
  32.     
  33. new RowCallbackHandler() {  
  34.     
  35.   
  36.     
  37.   
  38.     
  39. public void processRow(ResultSet rs) throws SQLException {    
  40.     
  41. user.setId(rs.getString("user_id"));    
  42.     
  43. user.setName(rs.getString("name"));    
  44.     
  45. user.setSex(rs.getString("sex").charAt(0));    
  46.     
  47. user.setAge(rs.getInt("age"));    
  48.     
  49. }    
  50.     
  51. });  
Java代码
        
  1. class UserRowMapper implements RowMapper {  
  2.     
  3.   
  4.     
  5. public Object mapRow(ResultSet rs, int index) throws SQLException {  
  6.     
  7.   
  8.     
  9. User user = new User();  
  10.     
  11. user.setId(rs.getString("user_id"));      
  12.     
  13. user.setName(rs.getString("name"));    
  14.     
  15. user.setSex(rs.getString("sex").charAt(0));      
  16.     
  17. user.setAge(rs.getInt("age"));      
  18.     
  19. return user;         
  20.     
  21. }         
  22.     
  23. }  
  24.     
  25.     
  26.     
  27. public List findAllByRowMapperResultReader() {      
  28.     
  29.   
  30.     
  31. String sql = "SELECT * FROM USER";  
  32.     
  33.   
  34.     
  35. return jdbcTemplate.query(sql, new RowMapperResultReader(new UserRowMapper()));  
  36.     
  37.   
  38.     
  39. }  
  40.     
  41.   
  42.     
  43. class UserRowMapper implements RowMapper {  
  44.     
  45.   
  46.     
  47. public Object mapRow(ResultSet rs, int index) throws SQLException {  
  48.     
  49. User user = new User();    
  50.     
  51. user.setId(rs.getString("user_id"));    
  52.     
  53. user.setName(rs.getString("name"));    
  54.     
  55. user.setSex(rs.getString("sex").charAt(0));    
  56.     
  57. user.setAge(rs.getInt("age"));    
  58.     
  59. return user;    
  60.     
  61. }    
  62.     
  63. }  
  64.     
  65.   
  66.     
  67. public List findAllByRowMapperResultReader() {      
  68.     
  69. String sql = "SELECT * FROM USER";    
  70.     
  71. return jdbcTemplate.query(sql, new RowMapperResultReader(new UserRowMapper()));  
  72.     
  73. }  

在getUser(id)里面使用UserRowMapper

Java代码
        
  1. public User getUser(final String id) throws DataAccessException {    
  2.     
  3. String sql = "SELECT * FROM USER WHERE user_id=?";    
  4.     
  5. final Object[] params = new Object[] { id };    
  6.     
  7. List list = jdbcTemplate.query(sql, params, new RowMapperResultReader(new UserRowMapper()));      
  8.     
  9. return (User) list.get(0);    
  10.     
  11. }
  12.     
  13.   
  14.     
  15. public User getUser(final String id) throws DataAccessException {  
  16.     
  17. String sql = "SELECT * FROM USER WHERE user_id=?";      
  18.     
  19. final Object[] params = new Object[] { id };      
  20.     
  21. List list = jdbcTemplate.query(sql, params, new RowMapperResultReader(new UserRowMapper()));      
  22.     
  23. return (User) list.get(0);      
  24.     
  25. }

网上收集

org.springframework.jdbc.core.PreparedStatementCreator 返回预编译SQL 不能于Object[]一起用

Java代码
        
  1. public PreparedStatement createPreparedStatement(Connection con) throwsSQLException {    
  2.     
  3. return con.prepareStatement(sql);    
  4.     
  5. }  
  6.     
  7.   
  8.     
  9. public PreparedStatement createPreparedStatement(Connection con) throwsSQLException {    
  10.     
  11. return con.prepareStatement(sql);    
  12.     
  13. }  

1.增删改

org.springframework.jdbc.core.JdbcTemplate 类(必须指定数据源dataSource)

Java代码
        
  1. template.update("insert into web_person values(?,?,?)",Object[]);    
  2.     
  3. template.update("insert into web_person values(?,?,?)",Object[]);  
        

Java代码
        
  1. template.update("insert into web_person values(?,?,?)",new PreparedStatementSetter(){ //匿名内部类 只能访问外部最终局部变量    
  2.     
  3. public void setValues(PreparedStatement ps) throws SQLException {    
  4.     
  5. ps.setInt(index++,3);    
  6.     
  7. });  
  8.     
  9.   
  10.     
  11. template.update("insert into web_person values(?,?,?)",new PreparedStatementSetter(){ //匿名内部类 只能访问外部最终局部变量  
  12.     
  13.   
  14.     
  15. public void setValues(PreparedStatement ps) throws SQLException {    
  16.     
  17. ps.setInt(index++,3);    
  18.     
  19. });  
  20.     
  21.   
  22.     
  23. org.springframework.jdbc.core.PreparedStatementSetter //接口 处理预编译SQL        
  24.     
  25. public void setValues(PreparedStatement ps) throws SQLException {    
  26.     
  27. ps.setInt(index++,3);    
  28.     
  29. }  
  30.     
  31.   
  32.     
  33. public void setValues(PreparedStatement ps) throws SQLException {    
  34.     
  35. ps.setInt(index++,3);    
  36.     
  37. }  

2.查询JdbcTemplate.query(String,[Object[]/PreparedStatementSetter],RowMapper/RowCallbackHandler)

org.springframework.jdbc.core.RowMapper 记录映射接口 处理结果集

Java代码
        
  1. public Object mapRow(ResultSet rs, int arg1) throws SQLException { //int表当前行数    
  2.     
  3. person.setId(rs.getInt("id"));    
  4.     
  5. }    
  6.     
  7. List template.query("select * from web_person where id=?",Object[],RowMapper);    
  8.     
  9. public Object mapRow(ResultSet rs, int arg1) throws SQLException { //int表当前行数    
  10.     
  11. person.setId(rs.getInt("id"));    
  12.     
  13. }    
  14.     
  15. List template.query("select * from web_person where id=?",Object[],RowMapper);  

org.springframework.jdbc.core.RowCallbackHandler 记录回调管理器接口 处理结果集

Java代码
          
    1. template.query("select * from web_person where id=?",Object[],new RowCallbackHandler(){    
    2.     
    3. public void processRow(ResultSet rs) throws SQLException {    
    4.     
    5. person.setId(rs.getInt("id"));    
    6.     
    7. });  

JdbcTemplate学习笔记