JDBCTemplate---方法介绍和简单示例

当sql等查询方式不能满足性能或灵活性的要求,必须使用SQL时,大家有三种选择:

第一、使用Hibernate 的sql 查询函数,将查询结果对象转为Entity对象。

第二、使用Hibernate Session的getConnection 获得JDBC Connection,然后进行纯JDBC API操作;

第三、选择把Spring的JDBCTemplate作为一种很不错的JDBC Utils来使用。

[java]  view plain copy print ?
  1. /*使用jdbcTemplate查询数据的时候可以使用queryForXXX等方法。下面我们就一一解析一下:*/    
  2. 1、jdbcTemplate.queryForInt()和jdbcTemplate.queryForLong()    
  3. //使用queryForInt返回user表中的记录数量,queryForInt搭配这样的sql可以在分页的时候计算总记录数    
  4. jdbcTemplate.queryForInt("select count(*) from user");    
  5.     
  6. 2、jdbcTemplate.queryForObject()    
  7. //本质上和queryForInt相同,只是可以返回不同的对象,例如返回一个String对象    
  8. String name = (String) jdbcTemplate.queryForObject(  --3个参数: 1、sql 2、要传递的参数数组 3、返回来的对象class    
  9. "SELECT name FROM USER WHERE id = ?",      
  10. new Object[] {id},      
  11. java.lang.String.class);    
  12.     
  13. 3、jdbcTemplate.queryForList(???)    
  14. //返回一个装有map的list,每一个map是一条记录,map里面的key是字段名    
  15. List rows = jdbcTemplate.queryForList("SELECT * FROM user");  //得到装有map的list    
  16. for(int i=0;i<rows.size();i++){                   //遍历    
  17. Map userMap=rows.get(i);    
  18. System.out.println(userMap.get("id"));      
  19. System.out.println(userMap.get("name"));      
  20. System.out.println(userMap.get("age"));    
  21. }    
  22.     
  23.     
  24. 4、jdbcTemplate.queryForMap(SQL)    
  25. //这个查询只能是查询一条记录的查询,返回一个map,key的值是column的值    
  26. Map map = jdbcTemplate.queryForMap("select count(*) as keyval from user");    
  27. map.get("keyval")    
  28.     
  29.     
  30. 5、jdbcTemplate.queryForRowSet(???)    
  31. //返回一个RowSet   然后调用.getString或者getInt等去取值    
  32.     
  33.     
  34.     
  35.     
  36. 6、jdbc1.query(sql, new RowCallbackHandler()    
  37. //返回一个ResultSet对象, processRow有自动循环的机制,它会自动执行processRow中的语句直到    
  38. //rs的size执行完了为止。我们可以在这其中用list完成对象的转移,只不过list要用final来修饰    
  39. jdbc1.query(sql, new RowCallbackHandler() { //editing    
  40.             public void processRow(ResultSet rs) throws SQLException {    
  41.         VideoSearch vs = new VideoSearch();    
  42.         vs.setRECORDINGFILENAME(rs.getString("RECORDINGFILENAME"));    
  43.         vs.setCALLID(rs.getString("CALLID"));    
  44.         list.add(vs);    
  45.     
  46.     }    
  47.     }    
  48. 7.更新操作  
  49. //执行sql语句,无返回执,可用于插入等操作  
  50. jdbcTemplate.execute(sql);  
  51.   
  52. //更新操作,返回受影响的行数  
  53. jdbcTemplate.update(strSql.toString());  
  54. //执行批量更新,参数为string数组  
  55. jdbcTemplate.batchUpdate(sql);  
  56. //更新,args为对象数组  
  57. jdbcTemplate.update(strSql, args);  
  58.   
  59. /* 
  60. 说明:   
  61. JDBCTemplate的使用方法:   
  62. 在ApplicationContext.xml中定义一个jdbcTemplate的节点,使用POJO注入,获得注入后可以执行操作   
  63. 不需要继承什么基类   
  64. */    
  65. <bean id="jdbcTemplate"    
  66. class="org.springframework.jdbc.core.JdbcTemplate">                
  67.       <property name="dataSource" ref="dataSource"/>             
  68. </bean>    
  69.     
  70. SqlRowSet rs = jdbcTemplate.queryForRowSet(sql, params);    
  71. /* 
  72. jdbcTemplate有很多的ORM化回调操作将返回结果转为对象列表,   
  73. 但很多时候还是需要返回ResultSet,Spring有提供一个类似ResultSet的,实现JDBC3.0 RowSet接口的Spring SqlRowSet   
  74. 注意   
  75. jdbcTemplate尽量只执行查询操作,莫要进行更新,否则会破坏Hibernate的二级缓存体系  
  76. */  


以下转载。


1. Spring的基本概念

       Spring框架核心的思想就是建立一个Java对象的大工厂,用户只要给工厂一个指令,工厂就能将用户需要的对象根据配置文件组装好返还给用户。用户需要做的许多工作则可以写成简单的配置文件。

2. 丑陋的JDBC代码

01 Connection con = null;
02 PreparedStatement pStmt = null;
03 ResultSet rs = null;
04 try {
05      con = ods.getConnection();
06      String sql = "select * from admin";
07      pStmt = con.prepareStatement(sql);
08      rs = pStmt.executeQuery();
09      while (rs.next()) {
10      }
11 catch (Exception ex) {
12      try {
13           con.rollback();
14      catch (SQLException sqlex) {
15           sqlex.printStackTrace(System.out);
16      }
17      ex.printStackTrace();
18  
19 finally {
20      try {
21           rs.close();
22           pStmt.close();
23           con.close();
24      catch (Exception e) {
25           e.printStackTrace();
26      }
27 }

 

以上是常见的JDBC代码,简单的select语句也需要冗长的出错处理,并且每个函数都不断地重复同样的代码。

 

3. JdbcTemplate的作用

       JdbcTemplate正是为了减少上述繁琐的代码而设计出来的。它是对JDBC的一种封装,抽象我们常用的一些方法。Simple and Stupid就是它的目标。下面是完成了刚才JDBC代码同样功能的JdbcTemplate的代码:

1 String sql = "select * from admin";
2  
3 jdbcTemplate.query(sql,new RowCallbackHandler() {
4  
5          public void processRow(ResultSet rs) throws SQLException { 
6  
7                 }
8  
9             } );

 

 

环境搭建:

1. 数据库的配置

      本文使用Mysql数据库,新建表admin:

1 CREATE TABLE `admin` (
2   `ID` bigint(20) unsigned NOT NULL auto_increment,
3   `NAMEvarchar(100) NOT NULL,
4   `PASSWORDvarchar(200) NOT NULL,
5   PRIMARY KEY  (`ID`)
6 ) ENGINE=InnoDB DEFAULT CHARSET=utf8

 

  2. Spring配置

       JdbcTemplate的使用需要有DataSource的支持,所以在配置文件中,我们首先要配置一个OracleDataSource,然后在将这个DataSource配置到JdbcTemplate里。接着将JdbcTemplate配置进DAO层,最后将DAO配置进Model层。简要的关系如下:

JDBCTemplate---方法介绍和简单示例_第1张图片

 

 

01 <?xml version="1.0" encoding="UTF-8"?>
02 <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
03     "http://www.springframework.org/dtd/spring-beans.dtd">
04 <beans>
05     <bean id="dataSource"
06         class="org.springframework.jdbc.datasource.DriverManagerDataSource">
07         <property name="driverClassName" value="com.mysql.jdbc.Driver" />
08         <property name="url" value="jdbc:mysql://localhost:3306/zuidaima_admin?useUnicode=true&amp;characterEncoding=utf-8" />
09         <property name="username" value="root" />
10         <property name="password" value="111111" />
11     </bean>
12  
13     <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
14         <property name="dataSource">
15             <ref bean="dataSource" />
16         </property>
17     </bean>
18  
19     <bean id="userDao" class="com.zuidaima.dao.impl.UserDaoImpl">
20         <property name="jdbcTemplate">
21             <ref bean="jdbcTemplate" />
22         </property>
23     </bean>
24  
25     <bean id="user" class="com.zuidaima.model.User">
26         <property name="dao">
27             <ref bean="userDao" />
28         </property>
29     </bean>
30  
31 </beans>

 

 

3. 项目截图:

      JDBCTemplate---方法介绍和简单示例_第2张图片

 

使用方法:

1.查找

多行查询:

01 class UserRowMapper implements RowMapper {
02  
03         public Object mapRow(ResultSet rs,int index) throws SQLException
04  
05         {
06  
07             User u = new User();
08  
09             u.setId(rs.getString("ID"));
10  
11             u.setName(rs.getString("Name"));
12  
13             u.setPassword(rs.getString("Password"));
14  
15             return u;
16  
17         }
18  
19     }
20  
21 public List select(String where)
22  
23     {
24  
25         List list;     
26  
27         String sql = "select * from admin "+where;     
28  
29         list = jdbcTemplate.query(sql,new RowMapperResultReader(new UserRowMapper()));
30  
31         return list;
32  
33     }

 

 

List最终返回的是满足条件的User队列。

 

单行查询:

01 public User selectById(String id){
02  
03     String sql = "select * from admin where id=?";
04  
05     final User u = new User();
06  
07     final Object[] params = new Object[] {id};
08  
09     jdbcTemplate.query(sql, params, new RowCallbackHandler(){
10  
11                         public void processRow(ResultSet rs) throws SQLException {
12  
13                                  u.setId(rs.getString("ID"));
14  
15                                  u.setName(rs.getString("NAME"));
16  
17                                  u.setPassword(rs.getString("PASSWORD"));
18  
19                         }                   
20  
21     });       
22  
23     return u;
24  
25 }

 

 

2.      插入

01 public void insert(User u)
02  
03 {
04  
05      String sql = "insert into admin (ID,NAME,PASSWORD) values (admin_id_seq.nextval,?,?)";
06  
07      Object[] params = new Object[] {
08  
09                                                 u.getName(),
10  
11                                                 u.getPassword() };
12  
13      jdbcTemplate.update(sql,params);
14  
15 }

 

admin_id_seq.nextval为Oracle设置好的序列,问号“?”被params里的数据依次替代,最终执行sql。

 

3.       修改

非常简单:

1 public void update(String how)
2  
3 {
4  
5         jdbcTemplate.update(how);
6  
7     }

 

 

运行截图

JDBCTemplate---方法介绍和简单示例_第3张图片

数据库截图

JDBCTemplate---方法介绍和简单示例_第4张图片


你可能感兴趣的:(JDBCTemplate---方法介绍和简单示例)