zoukankan      html  css  js  c++  java
  • Spring的NamedParameterJdbcTemplate的简单使用

    原文地址:https://www.iteye.com/blog/itommy-2354746

    Spring JDBC包提供了JdbcTemplate和它的两个兄弟SimpleJdbcTemplate和NamedParameterJdbcTemplate。

     

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

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

     

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

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

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

     

    其中有两个比较实用的两个类,分别是BeanPropertySqlParameterSource、BeanPropertyRowMapper。

    BeanPropertySqlParameterSource:可以把实例转化成SqlParameterSource

         例,new BeanPropertySqlParameterSource(new User);

    BeanPropertyRowMapper:可以把返回的每一行转化成对应的对象

         例,new BeanPropertyRowMapper<>(CustomSearchVo.class);

     

    项目中的示例:

    @Service("repeatContactsService")  
    @Transactional  
    public class RepeatContactsService {  
      
        private static final Logger LOG = LoggerFactory.getLogger(RepeatContactsService.class);  
      
        @Resource  
        private NamedParameterJdbcTemplate namedParameterJdbcTemplate;  
      
        public int getRepeatContactsCountByPhone(String userid, String phone){  
            String sql= "SELECT count(1) FROM tab_user WHERE userid != :userid AND number = :phone";  
            Map parmas = ImmutableMap.of("userid",userid,"phone",phone);  
            Integer count = null;  
            try {  
                count = namedParameterJdbcTemplate.queryForObject(sql, parmas, Integer.class);  
            } catch (DataAccessException e) {  
                LOG.error("获取值时抛错:", e);  
            }  
            return count;  
        }  
      
        public List<RepeatContactsDetailVo> getAllRepeatContacts(String userid) {  
            DateTime before = DateTime.now();  
            Set<String> phoneSet = new HashSet<>();  
              
            String sql = "SELECT contacts_phone FROM tab_contacts WHERE userid=:userid";  
            Map param = ImmutableMap.of("userid", userid);  
            List<String> phoneList = null;  
            try {  
                phoneList = namedParameterJdbcTemplate.queryForList(sql , param, String.class);  
            } catch (DataAccessException e) {  
                LOG.error("获取用户的通讯录和运营商时抛错:", e);  
            }  
      
            //生成需要返回的结果  
            Map params = ImmutableMap.of("phones", phoneSet, "userid", userid);  
            String sql = "SELECT a.name,a.phone,MAX(a.type),b.name userName,b.phone userPhone,b.idcard userIdcard FROM tab_contacts a where call_number in (:phones) AND userid != :userid GROUP BY a.userid,a.phone";  
            List<RepeatContactsDetailVo> contactsList = new ArrayList<>();  
            try {  
                contactsList = namedParameterJdbcTemplate.  
                        query(sql, params, new BeanPropertyRowMapper<>(RepeatContactsDetailVo.class));  
            } catch (DataAccessException e) {  
                LOG.error("获取时抛错:", e);  
            }  
            return contactsList ;  
        }  
    }  

    推荐看讲NamedParameterJdbcTemplate:

    http://www.voidcn.com/blog/victor_cindy1/article/p-6153531.html

    讲解JdbcTemplate接口比较好的

    https://my.oschina.net/u/218421/blog/38598

  • 相关阅读:
    fsockopen
    Ambari安装之部署3个节点的HA分布式集群
    怎么让普通用户达到root用户也可以拥有权限修改文件(CentOS系统)
    谈大数据里各子项目搭建时的环境变量配置(深入)
    Zookeeper的多节点集群详细启动步骤(3或5节点)
    IntelliJ IDEA(Ultimate版本)的下载、安装和WordCount的初步使用(本地模式和集群模式)
    IDEA里如何多种方式打jar包,然后上传到集群
    Zookeeper(1、3、5节点)集群安装
    Hadoop Hive概念学习系列之HDFS、Hive、MySQL、Sqoop之间的数据导入导出(强烈建议去看)
    Hadoop概念学习系列之Java调用Shell命令和脚本,致力于hadoop/spark集群
  • 原文地址:https://www.cnblogs.com/dyh004/p/11549882.html
Copyright © 2011-2022 走看看