Spring NamedParameterJdbcTemplate详解(带配置)

http://blog.csdn.net/arkblue/article/details/6230948

http://blog.csdn.net/dyllove98/article/details/7772470

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jdbc/core/namedparam/NamedParameterJdbcTemplate.html

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

1 配置文件,添加bean定义

[xhtml] view plain copy
  1. <bean id="namedParameterJdbcTemplate"  
  2.     class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">  
  3.     <constructor-arg ref="dataSource" />  
  4. </bean>  
  5.   
  6. <bean id="namedParameterProductDao"  
  7.     class="springapp.repository.NamedParameterJdbcTemplateProductDao">  
  8.     <property name="jdbcTemplate" ref="namedParameterJdbcTemplate"></property>  
  9. </bean>  

 

2 NamedParameterJdbcTemplateProductDao.java源码

  1. public class NamedParameterJdbcTemplateProductDao implements ProductDao {  
  2.   
  3.     private NamedParameterJdbcTemplate jdbcTemplate;  
  4.   
  5.     public void setJdbcTemplate(NamedParameterJdbcTemplate jdbcTemplate) {  
  6.         this.jdbcTemplate = jdbcTemplate;  
  7.     }  
  8.   
  9.     @Override  
  10.     public List<Product> getProductList() {  
  11.         // TODO Auto-generated method stub  
  12.         return null;  
  13.     }  
  14.   
  15.     @Override  
  16.     public void saveProduct(Product prod) {  
  17.         String sql = "insert into products (id, price, description) values (:id, :price, description)";  
  18.         Map para = new HashMap();  
  19.         para.put("id", prod.getId());  
  20.         para.put("price", prod.getPrice());  
  21.         para.put("description", prod.getDescription());  
  22.         jdbcTemplate.update(sql, para);  
  23.     }  
  24.   
  25. }  

 

3 测试代码

  1. public class NamedParameterJdbcTemplateProductDaoTest {  
  2.     static ApplicationContext ctx = new ClassPathXmlApplicationContext(  
  3.             new String[] { "file:src/test-context.xml" });  
  4.   
  5.     public static void main(String[] args) {  
  6.         ProductDao dao = (ProductDao) ctx.getBean("productDao");  
  7.         Product product = new Product();  
  8.         product.setId(2);  
  9.         product.setPrice(12.2);  
  10.         product.setDescription("description1");  
  11.   
  12.         dao.saveProduct(product);  
  13.     }  


----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

NamedParameterJdbcTemplate类是基于JdbcTemplate类,并对它进行了封装从而支持命名参数特性。

NamedParameterJdbcTemplate主要提供以下三类方法:execute方法、query及queryForXXX方法、update及batchUpdate方法。

首先让我们看个例子吧:

 

java代码:
Java代码   收藏代码
  1. @Test  
  2. public void testNamedParameterJdbcTemplate1() {  
  3. NamedParameterJdbcTemplate namedParameterJdbcTemplate = null;  
  4. //namedParameterJdbcTemplate =  
  5. //    new NamedParameterJdbcTemplate(dataSource);  
  6. namedParameterJdbcTemplate =  
  7. new NamedParameterJdbcTemplate(jdbcTemplate);  
  8.     String insertSql = "insert into test(name) values(:name)";  
  9.     String selectSql = "select * from test where name=:name";  
  10.     String deleteSql = "delete from test where name=:name";  
  11.     Map<String, Object> paramMap = new HashMap<String, Object>();  
  12.     paramMap.put("name""name5");  
  13.     namedParameterJdbcTemplate.update(insertSql, paramMap);  
  14.     final List<Integer> result = new ArrayList<Integer>();  
  15. namedParameterJdbcTemplate.query(selectSql, paramMap,  
  16. new RowCallbackHandler() {  
  17.         @Override  
  18.         public void processRow(ResultSet rs) throws SQLException {  
  19.             result.add(rs.getInt("id"));  
  20.         }  
  21.     });  
  22. Assert.assertEquals(1, result.size());  
  23. SqlParameterSource paramSource = new MapSqlParameterSource(paramMap);  
  24. namedParameterJdbcTemplate.update(deleteSql, paramSource);  
  25. }  

 

接下来让我们分析一下代码吧:

1)NamedParameterJdbcTemplate初始化:可以使用DataSource或JdbcTemplate 对象作为构造器参数初始化;

2)insert into test(name) values(:name):其中“:name”就是命名参数;

3) update(insertSql, paramMap):其中paramMap是一个Map类型,包含键为“name”,值为“name5”的键值对,也就是为命名参数设值的数据;

4)query(selectSql, paramMap, new RowCallbackHandler()……):类似于JdbcTemplate中介绍的,唯一不同是需要传入paramMap来为命名参数设值;

5)update(deleteSql, paramSource):类似于“update(insertSql, paramMap)”,但使用SqlParameterSource参数来为命名参数设值,此处使用MapSqlParameterSource实现,其就是简单封装java.util.Map。

 

 

NamedParameterJdbcTemplate类为命名参数设值有两种方式:java.util.Map和SqlParameterSource:

1)java.util.Map:使用Map键数据来对于命名参数,而Map值数据用于设值;

2)SqlParameterSource:可以使用SqlParameterSource实现作为来实现为命名参数设值,默认有MapSqlParameterSource和BeanPropertySqlParameterSource实现;MapSqlParameterSource实现非常简单,只是封装了java.util.Map;而BeanPropertySqlParameterSource封装了一个JavaBean对象,通过JavaBean对象属性来决定命名参数的值。

 

java代码:
Java代码   收藏代码
  1. package cn.javass.spring.chapter7;  
  2. public class UserModel {  
  3.     private int id;  
  4.     private String myName;     
  5.     //省略getter和setter       
  6. }  

 

 

 

java代码:
Java代码   收藏代码
  1. @Test  
  2. public void testNamedParameterJdbcTemplate2() {  
  3.     NamedParameterJdbcTemplate namedParameterJdbcTemplate = null;  
  4.     namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate);  
  5.     UserModel model = new UserModel();  
  6.     model.setMyName("name5");  
  7.     String insertSql = "insert into test(name) values(:myName)";  
  8.     SqlParameterSource paramSource = new BeanPropertySqlParameterSource(model);  
  9.     namedParameterJdbcTemplate.update(insertSql, paramSource);  
  10. }  

 

可以看出BeanPropertySqlParameterSource使用能减少很多工作量,但命名参数必须和JavaBean属性名称相对应才可以。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值