一.查询单个字段 

Object queryForObject(String sql, Object[] args, Class requiredType) 

其中Class requiredType 参数为返回值的类型(可以为常见的类库中的类类型)比如String.class

参数“requiredType”不可以是自定义的类

 

2.查询多个字段

Object queryForObject(String sql, Object[] args, RowMapper rowMapper) 

其中Rowmapper 需要new一下 给该接口一个类类型,它负责给你返回一个对象(需要什么值要自己set,建议全部set) 

如果要把查询结果封装为自定义的类,需要采用第2个方法 

 

//只查询一列:name
        String sql = "SELECT NAME FROM CUSTOMER WHERE CUST_ID = ?";
 
        String name = (String)getJdbcTemplate().queryForObject(
                        sql, new Object[] { custId }, String.class);
 
        return name;
       
        //查询返回自定义的类
        String sql = "SELECT * FROM CUSTOMER WHERE CUST_ID = ?";
 
        Customer customer = (Customer)getJdbcTemplate().queryForObject(
                        sql, new Object[] { custId }, 
                        new BeanPropertyRowMapper(Customer.class));

        return customer;

我们接着分析下BeanPropertyRowMapper 

其实不用看源码都知道思路了: 
new BeanPropertyRowMapper(User.class) 
mapRow(ResultSet rs, int rowNumber) 

遍历ResultSet,每一行对应一个User 对象 

遍历每一行时,顺序遍历各列,取得该列的值通过反射调用对应的setter方法,赋值给到User 对象 

注意到无论是取列名还是取列的值,都是通过index(1~columnCount)来取的

public T mapRow(ResultSet rs, int rowNumber) throws SQLException {
T mappedObject = BeanUtils.instantiate(this.mappedClass);
BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(mappedObject); ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
Set<String> populatedProperties = (isCheckFullyPopulated() ? new HashSet<String>() : null); for (int index = 1; index <= columnCount; index++) {
String column = JdbcUtils.lookupColumnName(rsmd, index);
PropertyDescriptor pd = this.mappedFields.get(column.replaceAll(" ", "").toLowerCase());
if (pd != null) {
try {
Object value = getColumnValue(rs, index, pd);
bw.setPropertyValue(pd.getName(), value);
if (populatedProperties != null) {
populatedProperties.add(pd.getName());
}
}
}
} if (populatedProperties != null && !populatedProperties.equals(this.mappedProperties)) {
throw new InvalidDataAccessApiUsageException("Given ResultSet does not contain all fields " +
"necessary to populate object of class [" + this.mappedClass + "]: " + this.mappedProperties);
} return mappedObject;
}

注意到mapRow方法里面,populatedProperties变量是用来检查是否所有的property都正确地实现了赋值 
再看看BeanPropertyRowMapper的构造函数:

public BeanPropertyRowMapper(Class<T> mappedClass) {
                initialize(mappedClass);
        }
       
        protected void initialize(Class<T> mappedClass) {
                this.mappedClass = mappedClass;
               
                /*保存field
                注意到对于驼峰式命名的field:
                例如,对于gameId, mappedFields 会同时保存"gameId"和"game_id"
                因此在sql语句中,
                select  id as game_id, name from game和
                select  id as gameId, name from game的效果是一样的
                */
                this.mappedFields = new HashMap<String, PropertyDescriptor>();
               
                //保存property
                this.mappedProperties = new HashSet<String>();
                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());
                        }
                }
        }
       
        //1. "game", return "game", unchanged
        //2. "gameId", return "game_id"
        private String underscoreName(String name) {
                //......

        }
 
 -----------------------------------------------------------------------------------------------------------------
二、查询返回对象或者list
思路:首先在Bean里面实现RowMapper和序列化接口(序列化可有可无)
          接着在maprow方法中将rs取出来的值set到当前Bean对象里面
          当然命名也要响应的变化下比如:UserPo,然后返回该对象最
          后在new 的RowMapper接口中直接new 该Po就ok
        【此方法适用于查询单个对象,或者多个对象组成的List或者Map】
 

/**
* 实现数据表与字段的映射
*
* @author andy
*
*/
public class UserInfo implements RowMapper<UserInfo>, Serializable { /**
*
*/
private static final long serialVersionUID = -8823504831198719837L; private Integer id; private String uname; private Integer unumber; private Date uRegisterTime; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getUname() {
return uname;
} public void setUname(String uname) {
this.uname = uname == null ? null : uname.trim();
} public Integer getUnumber() {
return unumber;
} public void setUnumber(Integer unumber) {
this.unumber = unumber;
} public Date getuRegisterTime() {
return uRegisterTime;
} public void setuRegisterTime(Date uRegisterTime) {
this.uRegisterTime = uRegisterTime;
} @Override
public UserInfo mapRow(ResultSet rs, int rowNum) throws SQLException {
UserInfo userInfo = new UserInfo();
userInfo.setId(rs.getInt("id"));
userInfo.setUname(rs.getString("uname"));
userInfo.setUnumber(rs.getInt("unumber"));
userInfo.setuRegisterTime(rs.getDate("uregister_time"));
return userInfo;
} }
@Autowired
private JdbcTemplate jdbcTemplate; @Autowired
private NamedParameterJdbcTemplate namedParameterJdbcTemplate; @Override
public UserInfo getById(Integer id) { String sql = "SELECT * FROM user_info WHERE id = ?"; UserInfo userInfo = jdbcTemplate.queryForObject(sql, new UserInfo(),
new Object[] { id }); return userInfo;
} @Override
public List<UserInfo> findAll() {
String sql = "SELECT * FROM user_info";
List<UserInfo> userInfos = jdbcTemplate.query(sql, new UserInfo());
return userInfos;
}

=====================================================================================================================

三、第三种方法

使用很少人使用的RowSet

SqlRowSet set =  queryForRowSet(sql,对象参数数组);

if(set==null){

  new AuthenticationException("null");

}

while(set.next){

遍历:

set.getString(此处参数类型为整形,表示你想要查出来的结果,按照顺序,依次是1、2、3.......索引从1开始)

}

注意该方法适用于:查询单个对象或者List,Map结果的情况

必须谨记若用他查出来一条数据或者一个对象时:

在判断条件的时候必须加set.next&&在跟其他条件,否则会报错"光标位置失效"

四、查询单个对象或者多个对象的第四种方法

User  user = jdbcManager.getJt().queryForObject(sql,new object[]{问号代表的参数,多个用逗号隔开},new BeanPropertyRowMapper<User>(User.class));

List<User> userList = jdbcManager.GetJt().query(sql,new object[]{问号代表的参数,多个用逗号隔开},new BeanPropertyRowMapper<User>(User.class));

用这两种方法去查询的时候切记:"定义的Bean也好,po,vo也罢一定要注意与数据库字段的匹配,否则无法查到"

SpringJdbc之queryForXXX大全解读的更多相关文章

  1. 全面解读java虚拟机(面试考点大全)d

    学习java以来,jvm的原理已经看过好多遍了,可是很多知识点都串不起来. 今天我把jvm相关知识整理了一下,看完之后肯定会对JVM很的清楚. JVM是虚拟机,也是一种规范,他遵循着冯·诺依曼体系结构 ...

  2. 【机器学习Machine Learning】资料大全

    昨天总结了深度学习的资料,今天把机器学习的资料也总结一下(友情提示:有些网站需要"科学上网"^_^) 推荐几本好书: 1.Pattern Recognition and Machi ...

  3. APP设计尺寸规范大全,APP界面设计新手教程【官方版】(转)

    正值25学堂一周年之际,同时站长和APP设计同仁们在群里(APP界面设计 UI设计交流群,APP界面设计⑥群 APPUI设计③群58946771 APP设计资源⑤群 386032923欢迎大家加入交流 ...

  4. MVC5 + EF6 + Bootstrap3 (9) HtmlHelper用法大全(下)

    文章来源:Slark.NET-博客园 http://www.cnblogs.com/slark/p/mvc5-ef6-bs3-get-started-httphelper-part2.html 上一节 ...

  5. 经典创意slogan大全

    一句好的广告语,能强烈的激发人的感情,产生心理认同感.对于广告人来说,无论走到哪里,最敏感的就是广告语.一句广告语,可能只有短短几个字或一两句话,却是一个品牌的精华所在.能不能第一时间吸引受众眼球,抓 ...

  6. Jsoup代码解读之六-防御XSS攻击

    Jsoup代码解读之八-防御XSS攻击 防御XSS攻击的一般原理 cleaner是Jsoup的重要功能之一,我们常用它来进行富文本输入中的XSS防御. 我们知道,XSS攻击的一般方式是,通过在页面输入 ...

  7. Shrio登陆验证实例详细解读(转)

    摘要:本文采用了Spring+SpringMVC+Mybatis+Shiro+Msql来写了一个登陆验证的实例,下面来看看过程吧!整个工程基于Mavevn来创建,运行环境为JDK1.6+WIN7+to ...

  8. 三分钟解读springmvc依赖

    长期以来都在写SSM框架的项目,却未能深入理解框架的搭建原理,而只是浅薄的理解前辈的架构,然后不断套用,项目做过几个,但框架的内涵却没有把握.小编打算今天从SpringMVC的依赖分析做起,一步步进行 ...

  9. Alamofire源码解读系列(八)之安全策略(ServerTrustPolicy)

    本篇主要讲解Alamofire中安全验证代码 前言 作为开发人员,理解HTTPS的原理和应用算是一项基本技能.HTTPS目前来说是非常安全的,但仍然有大量的公司还在使用HTTP.其实HTTPS也并不是 ...

随机推荐

  1. CentOS7安装OpenStack(Rocky版)-07.安装horizon服务组件(控制节点dashboard)

    在上一篇文章分享了neutron网络服务的安装配置,本文分享openstack的horizon(dashboard)web界面管理服务,方便在浏览器操作 ---------------------- ...

  2. C高级第一次PTA作业

    作业要求一 附加题目 写程序证明P++等价于(p)++还是等价于*(p++)? 1.设计思路: (1).题目算法描述 第一步:定义变量p并赋初值 第二步:分三次计算每次分别输出 p++,(p)++,* ...

  3. opencv实现遍历文件夹下所有文件

    前言 最近需要将视频数据集中的每个视频进行分割,分割成等长的视频片段,前提是需要首先遍历数据集文件夹中的所有视频. 实现 1.了解opencv中的Directory类: 2.实现测试代码: 系统环境 ...

  4. 20155225 2016-2017-2 《Java程序设计》第五周学习总结

    20155225 2006-2007-2 <Java程序设计>第五周学习总结 教材学习内容总结 使用try.catch异常处理,异常处理继承架构等 使用Collection收集对象,了解C ...

  5. 51Nod - 1001:数组中和等于K的数对

    基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 给出一个整数K和一个无序数组A,A的元素为N个互不相同的整数,找出数组A中所有和等于K的数对.例如K = 8,数组A: ...

  6. eclipse 配置jdk和maven

    准备工作:确保已安装好jdk和maven,并完全配置环境.若是没有请参考前两篇博客: jdk:    http://www.cnblogs.com/qinbb/p/6861851.html maven ...

  7. (1)变量、常量、程序交互、数据类型、bool、基本运算符

    什么是变量 变量由变量名和变量值组成 name = 'Alex Li'  这个算式就是将一个值赋予给变量,也就是声明变量的意思 name 就是一个变量,也是一个变量的名字 'Alex Li' 就是一个 ...

  8. CTF之MD5

    MD5是一种常见的加密方式,但准确来说,它只是一种编码方式,它将任意有限长度的字符串通过哈希函数转换为特定长度的字符串. MD5编码具有单向性,即由明文变密文简单,由密文变明文困难. 破解时只能通过暴 ...

  9. (转)函数库调用 VS 系统调用

    Linux下对文件操作有两种方式:系统调用(system call)和库函数调用(Library functions).可以参考<Linux程序设计>(英文原版为<Beginning ...

  10. TP3.2整合uplodify文件上传

    HTML中:<style>#img_upload-queue{width:120px;float:left;} /*uploadify的上传进度条样式,前面的img_upload是根据上传 ...