JdbcTemplate使用小结

  org.springframework.jdbc.core.JdbcTemplate.query(String sql, Object[] args, RowMapper<StaffUnionVO> rowMapper) throws DataAccessException

1.自定义rowMapper

public class StaffUnionVO implements RowMapper<StaffUnionVO>, Serializable {private static final long serialVersionUID = 1544023434308856628L;public StaffUnionVO() {}private String code;// 员工编码private String name;// 员工姓名public String getCode() {return code;}public void setCode(String code) {this.code = code;}public String getName() {return name;}public void setName(String name) {this.name = name;}private boolean isExistColumn(ResultSet rs, String columnName) {try {if (rs.findColumn(columnName) > 0) {return true;}} catch (SQLException e) {return false;}return false;}@Overridepublic StaffUnionVO mapRow(ResultSet rs, int row) throws SQLException {StaffUnionVO vo = new StaffUnionVO();     
 
    if (isExistColumn(rs, "code"))vo.setCode(rs.getString("code"));
    if (isExistColumn(rs, "name"))vo.setName(rs.getString("name"));
  
    return vo;} }

  示例: List<StaffUnionVO> vos = JdbcTemplate.query(sql, new Object[0], new StaffUnionVO() );

 

2.使用BeanPropertyRowMapper

public class StaffUnionVO implements Serializable {private static final long serialVersionUID = 1544023434308856628L;public StaffUnionVO() {}private String code;// 员工编码private String name;// 员工姓名public String getCode() {return code;}public void setCode(String code) {this.code = code;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

  示例:List<StaffUnionVO> vos = JdbcTemplate.query(sql, new Object[0], BeanPropertyRowMapper.newInstance(StaffUnionVO.class));

 

  看一下 BeanPropertyRowMapper.java 的源码,可以学到不少东西。

/*** Eclipse Class Decompiler plugin, copyright (c) 2016 Chen Chao (cnfree2000@hotmail.com) ***/
package org.springframework.jdbc.core;import java.beans.PropertyDescriptor;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.BeanWrapper;
import org.springframework.beans.NotWritablePropertyException;
import org.springframework.beans.PropertyAccessorFactory;
import org.springframework.beans.TypeMismatchException;
import org.springframework.dao.DataRetrievalFailureException;
import org.springframework.dao.InvalidDataAccessApiUsageException;
import org.springframework.jdbc.support.JdbcUtils;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;public class BeanPropertyRowMapper<T> implements RowMapper<T> {protected final Log logger = LogFactory.getLog(super.getClass());private Class<T> mappedClass;private boolean checkFullyPopulated = false;private boolean primitivesDefaultedForNullValue = false;private Map<String, PropertyDescriptor> mappedFields;private Set<String> mappedProperties;public BeanPropertyRowMapper() {}public BeanPropertyRowMapper(Class<T> mappedClass) {initialize(mappedClass);}public BeanPropertyRowMapper(Class<T> mappedClass, boolean checkFullyPopulated) {initialize(mappedClass);this.checkFullyPopulated = checkFullyPopulated;}public void setMappedClass(Class<T> mappedClass) {if (this.mappedClass == null) {initialize(mappedClass);} else if (!(this.mappedClass.equals(mappedClass)))throw new InvalidDataAccessApiUsageException(new StringBuilder().append("The mapped class can not be reassigned to map to ").append(mappedClass).append(" since it is already providing mapping for ").append(this.mappedClass).toString());}protected void initialize(Class<T> mappedClass) {this.mappedClass = mappedClass;this.mappedFields = new HashMap();this.mappedProperties = new HashSet();PropertyDescriptor[] pds = BeanUtils.getPropertyDescriptors(mappedClass);for (PropertyDescriptor pd : pds)if (pd.getWriteMethod() != null) {this.mappedFields.put(pd.getName().toLowerCase(), pd);String underscoredName = underscoreName(pd.getName());if (!(pd.getName().toLowerCase().equals(underscoredName))) {this.mappedFields.put(underscoredName, pd);}this.mappedProperties.add(pd.getName());}}//在大写的字符前加入下滑线private String underscoreName(String name) {if (!(StringUtils.hasLength(name))) {return "";}StringBuilder result = new StringBuilder();result.append(name.substring(0, 1).toLowerCase());for (int i = 1; i < name.length(); ++i) {String s = name.substring(i, i + 1);String slc = s.toLowerCase();if (!(s.equals(slc))) {result.append("_").append(slc);} else {result.append(s);}}return result.toString();}public final Class<T> getMappedClass() {return this.mappedClass;}public void setCheckFullyPopulated(boolean checkFullyPopulated) {this.checkFullyPopulated = checkFullyPopulated;}public boolean isCheckFullyPopulated() {return this.checkFullyPopulated;}public void setPrimitivesDefaultedForNullValue(boolean primitivesDefaultedForNullValue) {this.primitivesDefaultedForNullValue = primitivesDefaultedForNullValue;}public boolean isPrimitivesDefaultedForNullValue() {return this.primitivesDefaultedForNullValue;}public T mapRow(ResultSet rs, int rowNumber) throws SQLException {Assert.state(this.mappedClass != null, "Mapped class was not specified");Object mappedObject = BeanUtils.instantiate(this.mappedClass);BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(mappedObject);initBeanWrapper(bw);ResultSetMetaData rsmd = rs.getMetaData();int columnCount = rsmd.getColumnCount();Set populatedProperties = (isCheckFullyPopulated()) ? new HashSet() : null;//稀少的特性for (int index = 1; index <= columnCount; ++index) {String column = JdbcUtils.lookupColumnName(rsmd, index);PropertyDescriptor pd = (PropertyDescriptor) this.mappedFields.get(column.replaceAll(" ", "").toLowerCase());if (pd == null)continue;try {Object value = getColumnValue(rs, index, pd);if ((this.logger.isDebugEnabled()) && (rowNumber == 0))this.logger.debug(new StringBuilder().append("Mapping column '").append(column).append("' to property '").append(pd.getName()).append("' of type ").append(pd.getPropertyType()).toString());try {bw.setPropertyValue(pd.getName(), value);} catch (TypeMismatchException e) {if ((value == null) && (this.primitivesDefaultedForNullValue)) {this.logger.debug(new StringBuilder().append("Intercepted TypeMismatchException for row ").append(rowNumber).append(" and column '").append(column).append("' with value ").append(value).append(" when setting property '").append(pd.getName()).append("' of type ").append(pd.getPropertyType()).append(" on object: ").append(mappedObject).toString());} else {throw e;}}if (populatedProperties != null) {populatedProperties.add(pd.getName());}} catch (NotWritablePropertyException ex) {throw new DataRetrievalFailureException(new StringBuilder().append("Unable to map column ").append(column).append(" to property ").append(pd.getName()).toString(), ex);}}if ((populatedProperties != null) && (!(populatedProperties.equals(this.mappedProperties)))) {throw new InvalidDataAccessApiUsageException(new StringBuilder().append("Given ResultSet does not contain all fields necessary to populate object of class [").append(this.mappedClass).append("]: ").append(this.mappedProperties).toString());}return mappedObject;}protected void initBeanWrapper(BeanWrapper bw) {}protected Object getColumnValue(ResultSet rs, int index, PropertyDescriptor pd) throws SQLException {return JdbcUtils.getResultSetValue(rs, index, pd.getPropertyType());}public static <T> BeanPropertyRowMapper<T> newInstance(Class<T> mappedClass) {BeanPropertyRowMapper newInstance = new BeanPropertyRowMapper();newInstance.setMappedClass(mappedClass);return newInstance;}
}

  1.通过PropertyDescriptor反映射调用set和get方法

  2.HashSet、TreeSet equals方法

  AbstractSet.java

  public
boolean equals(Object o) {if (o == this)return true;if (!(o instanceof Set))return false;Collection<?> c = (Collection<?>) o;if (c.size() != size())return false;try {return containsAll(c);} catch (ClassCastException unused) {return false;} catch (NullPointerException unused) {return false;}}

 

  3.BeanPropertyRowMapper checkFullyPopulated 默认是false,这样的话如果 sql结果集中的字段 和 DTO 字段不匹配,就会抛异常。可以手动设置这个值。

  4.PO BO VO DTO POJO DAO概念及其作用(附转换图)

 

转载于:https://www.cnblogs.com/hujunzheng/p/6306769.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/531276.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ安装和使用(和Spring集成)

一、安装Rabbit MQ   Rabbit MQ 是建立在强大的Erlang OTP平台上&#xff0c;因此安装Rabbit MQ的前提是安装Erlang。通过下面两个连接下载安装3.2.3 版本&#xff1a; 下载并安装 Eralng OTP For Windows (vR16B03)运行安装 Rabbit MQ Server Windows Installer (v3.2.3)具体…

单点登录实现(spring session+redis完成session共享)

一、前言 项目中用到的SSO&#xff0c;使用开源框架cas做的。简单的了解了一下cas&#xff0c;并学习了一下 单点登录的原理&#xff0c;有兴趣的同学也可以学习一下&#xff0c;写个demo玩一玩。 二、工程结构 我模拟了 sso的客户端和sso的服务端&#xff0c; sso-core中主要是…

maven deploy上传私服出错

error 内容如下 Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.5: deploy (default-deploy) on project XXX pom文件增加如下配置 <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifa…

加密策略

一、前言 这两天研究了一下项目中的密码加密&#xff0c;可以说得上是学到了很多。下面来大致说一下。 二、常用加密 1.单向加密算法 单向加密算法主要用来验证数据传输的过程中&#xff0c;是否被篡改过。 BASE64 严格地说&#xff0c;属于编码格式&#xff0c;而非加密算法 …

Spring Data JPA: 实现自定义Repository

一、前言 由于项目中的 实体&#xff08;entity&#xff09;默认都是继承一个父类&#xff08;包含一些公共的属性&#xff0c;比如创建时间&#xff0c;修改时间&#xff0c;是否删除&#xff0c;主键id&#xff09;。为了实现逻辑删除&#xff0c;一般会自己实现RepositoryFa…

java json和对象互相装换

java json和对象互相装换 1.com.alibaba.fastjson.JSON 2.com.fasterxml.jackson.databind.ObjectMapper 转载于:https://www.cnblogs.com/hujunzheng/p/6593491.html

js冲刺一下

js中__proto__和prototype的区别和关系 1.对象有属性__proto__,指向该对象的构造函数的原型对象。  2.方法除了有属性__proto__,还有属性prototype&#xff0c;prototype指向该方法的原型对象。 深入浅出妙用 Javascript 中 apply、call、bind ***两道面试题*** 关于js中伪数…

springmvc 源码分析

DispatcherServlet的初始化流程 HandlerMapping - RequestMappingHandlerMapping初始化 DefaultAnnotationHandlerMapping 和RequestMappingHandlerMapping RequestToViewNameTranslator请求到视图名称的转换 (如果没有responsebody&#xff0c;并且没有返回一个view&#xff0…

EntityManager的使用

1、最基础的查询 CriteriaBuilder cb entityManager.getCriteriaBuilder(); CriteriaQuery<User> cq cb.createQuery(User.class); Root<User> root cq.from(User.class); //from User cq.select(root); //select * from User javax.persistence.criteria.Predi…

Jackson序列化实例

参考文章 Jackson使用ContextualSerializer在序列化时获取字段注解的属性 使用BeanSerializerModifier定制jackson的自定义序列化(null值的处理) 关于使用ContextualSerializer的补充 BeanSerializerFactory中有如下代码&#xff0c; 关于设置SerializerModifier&#xff0c;如…

maven自定义脚手架(快速生成项目)

Maven之自定义archetype生成项目骨架 利用脚手架生成 新项目 命令行方式 mvn archetype:generate \ -DarchetypeGroupIdcom.xxx \ -DarchetypeArtifactIdarchetype-spring-boot \ -DarchetypeVersion1.0.0 \ -DgroupIdcom.xxx \ -DartifactIddemo-archetype-generate \ -Dversi…

JSONObject 自定义过滤配置

一、自定义过滤器说明 PropertyPreFilter 根据PropertyName判断是否序列化   PropertyFilter 根据PropertyName和PropertyValue来判断是否序列化   NameFilter 修改Key&#xff0c;如果需要修改Key,process返回值则可   ValueFilter 修改Value   BeforeFilter 序列化时…

springmvc防止重复提交拦截器

一、拦截器实现&#xff0c;ResubmitInterceptorHandler.java import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.handler.Hand…

Mac idea 快捷键

Mac键盘符号和修饰键说明 ⌘ Command⇧ Shift⌥ Option⌃ Control↩︎ Return/Enter⌫ Delete⌦ 向前删除键&#xff08;FnDelete&#xff09;↑ 上箭头↓ 下箭头← 左箭头→ 右箭头⇞ Page Up&#xff08;Fn↑&#xff09;⇟ Page Down&#xff08;Fn↓&#xff09;Home Fn ←…

cas4.2.7实现单点登录

准备前参考&#xff1a;  cas server下载地址 cas client 下载地址 安全cookie setSecure详解 Spring通过构造方法注入的四种方式 cas 学习博文 自定义登录页和登录认证 cas server端的login-webflow详细流程 CAS服务端自定义数据库认证用户 准备工作 1. cas server下载之后解…

log4j之log4j2.xml使用

依赖jar包 log4j-api-2.6.2.jar log4j-core-2.6.2.jar log4j-slf4j-impl-2.6.2.jar slf4j-api-1.7.12.jar 在resources目录下新建log4j2.xml&#xff0c;内容如下。 <?xml version"1.0" encoding"UTF-8"?><!--status : 这个用于设置log4j2自身内…

cas4.2.7与shiro进行整合

准备工作 cas单点登录开始前准备&#xff0c;请参考cas4.2.7实现单点登录。 与shiro进行整合 注&#xff1a;准备工作的基础上&#xff0c;对cas客户端进行如下改进。 引入相关jar包 shiro-cas-1.2.6.jar shiro-core-1.2.6.jar shiro-spring-1.2.6.jar shiro-web-1.2.6.jar web…

命令行fuck神器

文章 thefuck git thefuck 转载于:https://www.cnblogs.com/hujunzheng/p/6935587.html

springmvc配置MappingJackson2HttpMessageConverter实现属性驼峰和下划线的转换

需求 php调用java接口时&#xff0c;因为php那边的属性都是下划线风格&#xff0c;java这边的属性都是驼峰的风格。配置springmvc的json转换&#xff0c;在requestBody的时候&#xff08;调用对象的set 方法&#xff09;将java属性name映射成下划线形式 和 请求的参数匹配&…

springmvc中使用MockMvc测试controller

示例代码 import com.alibaba.fastjson.JSONObject; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springfra…