• jdbcTemplate学习(四)


    前面三节讲了jdbcTemplate的使用,这一节讲解NamedParameterJdbcTemplate的使用方法:

    NamedParameterJdbcTemplate类是基于JdbcTemplate类,NamedParameterJdbcTemplate内部包含了一个JdbcTemplate,所以JdbcTemplate能做的事情NamedParameterJdbcTemplate都能干;NamedParameterJdbcTemplate相对于JdbcTemplate主要增加了参数可以命名的功能。

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

    spring配置jdbcTemplate:

    (1)第一步,spring提供了类org.springframework.jdbc.core.JdbcTemplate,所以使用bean注入数据源对象:

    <bean id="logJdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="logDataSource" />
    </bean>

    (2)第二步,dao类实现类中使用注解将bean对象logJdbcTemplate注入到成员变量中:

    @Autowired
    protected JdbcTemplate logJdbcTemplate;

    spring配置NamedParameterJdbcTemplate:

    (1)第一步,spring提供了类org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate,所以使用bean注入数据源对象,不过这里是使用构造器注入的:

    <bean id="logNamedJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
    <constructor-arg ref="logDataSource"></constructor-arg>
    </bean>

    (2)第二步,dao类实现类中使用注解将bean对象logNamedJdbcTemplate注入到成员变量中:

    @Autowired
    protected NamedParameterJdbcTemplate logNamedJdbcTemplate;

    @Test  
    public void testNamedParameterJdbcTemplate1() {  
    NamedParameterJdbcTemplate namedParameterJdbcTemplate = null;  
    //namedParameterJdbcTemplate =  
    //    new NamedParameterJdbcTemplate(dataSource);  
    namedParameterJdbcTemplate =  
    new NamedParameterJdbcTemplate(jdbcTemplate);  
        String insertSql = "insert into test(name) values(:name)";  
        String selectSql = "select * from test where name=:name";  
        String deleteSql = "delete from test where name=:name";  
        Map<String, Object> paramMap = new HashMap<String, Object>();  
        paramMap.put("name", "name5");  
        namedParameterJdbcTemplate.update(insertSql, paramMap);  
        final List<Integer> result = new ArrayList<Integer>();  
    namedParameterJdbcTemplate.query(selectSql, paramMap,  
    new RowCallbackHandler() {  
            @Override  
            public void processRow(ResultSet rs) throws SQLException {  
                result.add(rs.getInt("id"));  
            }  
        });  
    Assert.assertEquals(1, result.size());  
    SqlParameterSource paramSource = new MapSqlParameterSource(paramMap);  
    namedParameterJdbcTemplate.update(deleteSql, paramSource);  
    }  

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

    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对象属性来决定命名参数的值。

    使用BeanPropertySqlParameterSource封装javaBean对象传递sql参数的例子如下:

    package cn.javass.spring.chapter7;  
    public class UserModel {  
        private int id;  
        private String myName;     
        //省略getter和setter       
    }  
    @Test  
    public void testNamedParameterJdbcTemplate2() {  
        NamedParameterJdbcTemplate namedParameterJdbcTemplate = null;  
        namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate);  
        UserModel model = new UserModel();  
        model.setMyName("name5");  
        String insertSql = "insert into test(name) values(:myName)";  
        SqlParameterSource paramSource = new BeanPropertySqlParameterSource(model);  
        namedParameterJdbcTemplate.update(insertSql, paramSource);  
    }  

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

    本文参考来自:http://blog.csdn.net/dyllove98/article/details/7772470

  • 相关阅读:
    LeetCode 1748. 唯一元素的和
    LeetCode 2047. 句子中的有效单词数
    LeetCode 1345. 跳跃游戏 IV
    LeetCode 1725. 可以形成最大正方形的矩形数目
    LeetCode 1765. 地图中的最高点
    LeetCode 2034. 股票价格波动
    LeetCode 1996. 游戏中弱角色的数量
    LeetCode 2013. 检测正方形
    LeetCode 1219. 黄金矿工
    LeetCode 2045. 到达目的地的第二短时间
  • 原文地址:https://www.cnblogs.com/cainiao-Shun666/p/7865232.html
Copyright © 2020-2023  润新知