关于JdbcTemplate的官方描述如下:

  • org.springframework.jdbc.core.JdbcTemplate

大约的讲,将JdbcTemplate返回的list结果集生成JavaBean我找到四种方式,都还不错。

本例比较特殊,该JavaBean里面包含一个child属性,该属性类型为List,见代码,而查询父子的SQL及需要的结果完全不同。

见代码

UserFuncEntity
package com.jpaandsecurity.entity;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Getter;
import lombok.Setter;import javax.persistence.Column;
import java.io.Serializable;
import java.util.List;@Getter
@Setter
public class UserFuncEntity implements Serializable {private static final long serialVersionUID = -816647127390476012L;@JSONField(ordinal = 1)@Column(name = "RESPONSIBILITY_NAME")private String name;@JSONField(ordinal = 2)private List<UserFuncEntity> child;@JSONField(ordinal = 3)private String controller;@JSONField(ordinal = 4)private String req_mapping;@JSONField(ordinal = 5)@Column(name = "RESPONSIBILITY_ID")private String resp_id;@JSONField(ordinal = 6)private String responsibility_name;@JSONField(ordinal = 7)@Column(name = "RESPONSIBILITY_APPLICATION_ID")private String resp_appl_id;@JSONField(ordinal = 8)@Column(name = "PROMPT")private String functionPrompt;@JSONField(ordinal = 9)private String params;public UserFuncEntity(){super();}public UserFuncEntity(String name,List<UserFuncEntity> child,String controller,String req_mapping,String resp_id,String resp_appl_id,String params){super();this.name = name;this.child = child;this.controller = controller;this.req_mapping = req_mapping;this.resp_id = resp_id;this.resp_appl_id = resp_appl_id;this.params = params;}public String getController() {if(getReq_mapping()!=null && getResp_appl_id()!=null && getResp_id()!=null){return "/init_responsiblity?req_mapping="+getReq_mapping()+"&resp_id="+getResp_id()+"&resp_appl_id="+getResp_appl_id()+"&params="+getParams();}else{return controller;}}@Overridepublic String toString(){return JSON.toJSONString(this);}}

UserResponEntity

package com.jpaandsecurity.entity;import lombok.Getter;
import lombok.Setter;
import org.springframework.jdbc.core.RowMapper;import java.io.Serializable;
import java.sql.ResultSet;
import java.sql.SQLException;@Getter
@Setter
public class UserResponEntity implements RowMapper<UserResponEntity>, Serializable {private String respId;private String responsibilityApplicationId;private String responsibilityName;private String prompt;public UserResponEntity(){super();}public UserResponEntity(String responsibilityId,String responsibilityApplicationId,String responsibilityName,String prompt){this.respId = responsibilityId;this.responsibilityApplicationId = responsibilityApplicationId;this.responsibilityName = responsibilityName;this.prompt = prompt;}@Overridepublic UserResponEntity mapRow(ResultSet rs, int rowNum) throws SQLException {UserResponEntity userResponEntity = new UserResponEntity();userResponEntity.setRespId(rs.getString("responsibility_id"));userResponEntity.setResponsibilityApplicationId(rs.getString("responsibility_application_id"));userResponEntity.setResponsibilityName(rs.getString("responsibility_name"));return  userResponEntity;}
}

SpringTest

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.jpaandsecurity.RunApplication;
import com.jpaandsecurity.entity.UserFuncEntity;
import com.jpaandsecurity.entity.UserResponEntity;
import lombok.extern.slf4j.Slf4j;
import org.apache.catalina.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;
import org.springframework.test.context.junit4.SpringRunner;import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import java.util.*;import static com.jpaandsecurity.entity.ReflectUtil.reflect;@Slf4j
@SpringBootTest(classes = {RunApplication.class})
@RunWith(SpringRunner.class)
@Component
public class QueryTest {@PersistenceContextprivate EntityManager em;@Autowiredprivate JdbcTemplate jdbcTemplate;@Testpublic void testQuery(){List<UserFuncEntity> menuList = new LinkedList<UserFuncEntity>();String respId = null;String respApplId = null;String respName = null;String name = null;long startTime = System.currentTimeMillis();String sql = "SELECT furg.responsibility_id,\n" +"       furg.responsibility_application_id,\n" +"       frv.responsibility_name\n" +"  FROM fnd_user_resp_groups_all furg, fnd_responsibility_vl frv\n" +" WHERE furg.user_id = ? \n"+"   AND furg.responsibility_id = frv.responsibility_id" +"   AND SYSDATE BETWEEN furg.start_date AND nvl(furg.end_date, SYSDATE + 1)";String userId = String.valueOf(1131);String respFuncSql = "SELECT res.responsibility_name,\n" +"       menu.menu_name,\n" +"       menu.user_menu_name,\n" +"       func.function_name,\n" +"       func.user_function_name,\n" +"       sub_menu.prompt,\n" +"       func.type\n" +"  FROM fnd_responsibility_vl res,\n" +"       fnd_menus_vl          menu,\n" +"       fnd_menu_entries_vl   sub_menu,\n" +"       fnd_form_functions_vl func\n" +" WHERE res.menu_id = sub_menu.menu_id\n" +"   AND menu.menu_id = sub_menu.menu_id\n" +"   AND sub_menu.function_id = func.function_id\n" +"   AND sub_menu.sub_menu_id IS NULL\n" +"   AND sub_menu.function_id IS NOT NULL\n" +"   AND sub_menu.prompt IS NOT NULL\n" +"   AND func.function_name NOT IN\n" +"       ('FNDCPSRSSSWA', 'FNDCPVIEWREQUEST', 'ICX_SSWA_USER_PREFERENCES')"+"   AND func.type = 'JSP'\n" +"   AND res.RESPONSIBILITY_ID = ? \n" +"UNION \n" +"SELECT res.responsibility_name,\n" +"       menu.menu_name,\n" +"       menu.user_menu_name,\n" +"       func.function_name,\n" +"       func.user_function_name,\n" +"       sub_menu1.prompt,\n" +"       func.type\n" +"  FROM fnd_responsibility_vl res,\n" +"       fnd_menus_vl          menu,\n" +"       fnd_menu_entries_vl   sub_menu,\n" +"       fnd_menu_entries_vl   sub_menu1,\n" +"       fnd_form_functions_vl func\n" +" WHERE res.menu_id = sub_menu.menu_id\n" +"   AND sub_menu.menu_id = menu.menu_id\n" +"   AND sub_menu.sub_menu_id = sub_menu1.menu_id\n" +"   AND sub_menu1.function_id = func.function_id\n" +"   AND sub_menu.sub_menu_id IS NOT NULL\n" +"   AND sub_menu.function_id IS NULL\n" +"   AND sub_menu1.prompt IS NOT NULL\n" +"   AND func.function_name NOT IN\n" +"       ('FNDCPSRSSSWA', 'FNDCPVIEWREQUEST', 'ICX_SSWA_USER_PREFERENCES')"+"   AND func.type = 'JSP'\n" +"   AND res.RESPONSIBILITY_ID = ?";startTime = System.currentTimeMillis();//jdbcTemplate中几个常用query的使用解释//https://blog.csdn.net/hjm4702192/article/details/39997379//方法1,普通,使用最原始的QueryForListList<Map<String, Object>> rows = jdbcTemplate.queryForList(sql,new Object[]{ userId });Iterator it = rows.iterator();while(it.hasNext()) {Map respMap = (Map) it.next();respId = String.valueOf( respMap.get("responsibility_id".toUpperCase()));respApplId = String.valueOf( respMap.get("responsibility_application_id".toUpperCase()));respName = String.valueOf( respMap.get("responsibility_name".toUpperCase()));name = respName;if(respName.startsWith("B18")){name = respName.substring(10);}UserFuncEntity userFuncEntity = new UserFuncEntity();userFuncEntity.setResp_id(respId);userFuncEntity.setResp_appl_id(respApplId);userFuncEntity.setName(name);List<UserFuncEntity> childList = new ArrayList<>();List funcRows = jdbcTemplate.queryForList(respFuncSql,new Object[]{respId, respId});Iterator funcIt = funcRows.iterator();//判断职责下是否有可用的功能int i=0;while (funcIt.hasNext()){Map funcMap = (Map) funcIt.next();name = String.valueOf(funcMap.get("prompt"));UserFuncEntity funcEntity = new UserFuncEntity();funcEntity.setResp_id(respId);funcEntity.setResp_appl_id(respApplId);funcEntity.setName(name);if(i%2==0)funcEntity.setReq_mapping("/test");elsefuncEntity.setReq_mapping("/echart");childList.add(funcEntity);i++;}if(i==0)continue;userFuncEntity.setChild(childList);menuList.add(userFuncEntity);}log.info("jdbcTemplate方法1消耗时长"+(System.currentTimeMillis()-startTime)+"rows.size "+rows.size());//方法二,使用反射//方法3和4不太适合本次两个SQL返回至同一个bean的情况//https://blog.csdn.net/will_awoke/article/details/12617383//https://blog.csdn.net/will_awoke/article/details/27683703
//        List<UserFuncEntity> menuList = new LinkedList<UserFuncEntity>();
//        menuList = new LinkedList<UserFuncEntity>();startTime = System.currentTimeMillis();menuList.clear();for (Map<String, Object> jdbcMapResult : rows){UserFuncEntity userRespon =reflect(UserFuncEntity.class, jdbcMapResult);List<Map<String, Object>> responFuncMenu =jdbcTemplate.queryForList(respFuncSql,new Object[]{userRespon.getResp_id(),userRespon.getResp_id()});List<UserFuncEntity> respFuncList = new LinkedList<UserFuncEntity>();int i=0;for (Map<String, Object> respFuncListMap: responFuncMenu){UserFuncEntity func = reflect(UserFuncEntity.class, respFuncListMap);func.setResp_id(userRespon.getResp_id());func.setResp_appl_id(userRespon.getResp_appl_id());if(i%2==0)func.setReq_mapping("/test");elsefunc.setReq_mapping("/echart");i++;respFuncList.add(func);}userRespon.setChild(respFuncList);//利用工具类反向生成bean
            menuList.add(userRespon);}log.info("jdbcTemplate方法2消耗时长"+(System.currentTimeMillis()-startTime)+"rows.size "+rows.size());log.info("jdbcTemplate方法2消耗时长 "+(System.currentTimeMillis()-startTime)+"\n"+JSON.toJSONString(menuList,SerializerFeature.PrettyFormat));//方法三,继承RowMapper接口进行实现//该方法已经不适合两个不同的SQL需要返回至同一个JavaBean的情况。//https://blog.csdn.net/fengshizty/article/details/43309055//https://blog.csdn.net/u011332918/article/details/45560117startTime = System.currentTimeMillis();List<UserResponEntity> list = jdbcTemplate.query(sql,new  UserResponEntity(),new Object[]{userId});log.info(JSON.toJSONString(list,SerializerFeature.PrettyFormat));log.info(" list  长度"+list.size()+"  "+(System.currentTimeMillis()-startTime));log.info("jdbcTemplate方法3消耗时长 "+(System.currentTimeMillis()-startTime)+"\n"+JSON.toJSONString(menuList,SerializerFeature.PrettyFormat));//方法四,使用BeanPropertyRowMapper,https://blog.csdn.net/u011332918/article/details/45560117//https://blog.csdn.net/limenghua9112/article/details/45096437//使用BeanPropertyRowMapper源码分析
//        https://www.cnblogs.com/VergiLyn/p/6040963.html//官方文档:https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/jdbc/core/BeanPropertyRowMapper.html//BeanPropertyRowMapper默认提供驼峰加下划线的规则将field和cloumn进行映射,并没有提供注解的方式实现映射,需要在SQL中写别名List<UserResponEntity> beanList = jdbcTemplate.query(sql,new Object[]{userId},new BeanPropertyRowMapper<UserResponEntity>(UserResponEntity.class));log.info(JSON.toJSONString(beanList,SerializerFeature.PrettyFormat));log.info(" list  长度"+beanList.size()+"  "+(System.currentTimeMillis()-startTime));//此处使用NativeQuery进行查询
//        startTime = System.currentTimeMillis();
//        Query query = em.createNativeQuery(sql);
//与Hiberante不同,jpa query从位置1开始
//        query.setParameter(1, userId);
//        List<Object[]> queryList = query.getResultList();
//        log.info("createNativeQuery消耗时长" + (System.currentTimeMillis() - startTime) + "queryList.size " + queryList.size());
}}

JdbcTemplate查询返回JavaBean的几种方法相关推荐

  1. mysql模糊查询xml_在userMapper.xml文件中模糊查询的常用的3种方法

    在userMapper.xml文件中新建映射sql的标签 select from users name like "%"#{name}"%" and phone ...

  2. 查询范围_企二哥:查询企业经营范围的三种方法

    一.查询企业经营范围的三种方法 1. 进经营地的工商局网站,有个"全国企业信用信息公示系统"进去后输入公司名称搜索就出来了. 2. 有个软件叫做天眼查,打开天眼查输入要查询的公司名 ...

  3. bash shell函数中返回任意值的四种方法

    From: http://www.jbxue.com/article/11322.html 本文介绍下,在bash shell编程中,从函数中返回任意值的几种方法,有需要的朋友参考下. 在bash中, ...

  4. 台式机计算机型号怎么查,电脑配置怎么查询?笔记本台式机查询电脑配置的四种方法...

    电脑配置怎么查询?虽然说现在网络非常的发达,但是并不是每个人都是电脑专家,还有一些不怎么接触电脑的小白用户,对于电脑配置怎么查询并不了解.今天智能手机网就为大家带来了电脑配置查询的具体方法,一起来瞧一 ...

  5. MySQL查询随机数据的4种方法和性能对比

    从MySQL随机选取数据也是我们最常用的一种发发,其最简单的办法就是使用"ORDER BY RAND()",本文介绍了包括ORDER BY RAND()的4种获取随机数据的方法,并 ...

  6. 常用WebServices返回数据的4种方法比较

    以前经常在群里听到朋友们说WebServices的性能特别的慢,说的如何如何.说实话,WebServices的确比调用本地数据要慢一些,可是究竟有多慢,真的如朋友们说的那么难以忍受吗?我个人感觉,多半 ...

  7. server sql top速度变慢解决方案_SQL Server的性能调优:解决查询速度慢的五种方法-数据库...

    编辑推荐: 本文主要通过一下几个方面介绍:使用SQL DMV查找慢速查询.通过APM解决方案查询报告.SQL Server扩展事件.SQL Azure查询性能洞察等相关内容. 本文来自博客园,由火龙果 ...

  8. c语言能返回字符串吗,C语言中函数返回字符串的四种方法

    在讨论着四种方法以前,首先要对函数有一个简单的认识,不管是在形实结合时,仍是在return语句返回时,都有一个拷贝的过程.你传进来的参数是个值,天然函数在工做以前要把这个值拷贝一份供本身使用,你传进来 ...

  9. 常用WebServices返回数据的4种方法比较 (转)

    以前经常在群里听到朋友们说WebServices的性能特别的慢,说的如何如何.说实话,WebServices的确比调用本地数据要慢一些,可是究竟有多慢,真的如朋友们说的那么难以忍受吗?我个人感觉,多半 ...

最新文章

  1. Http Hijacker
  2. JavaScript 开发的40个经典技巧
  3. linux网络编程之sockaddr_in和in_addr区别
  4. sourcetree 推送找不到bash.exe_找旅伴 | 周末轻旅行
  5. Spring的cache缓存介绍
  6. ubuntu 下mysql 不显示当前的数据库名解决方法
  7. 安装.Net Framework提示:无法建立到信任根颁发机构的证书链
  8. 定时任务Quartz配置
  9. 谷歌浏览器截取长屏幕(全屏截图)
  10. 灰度化处理——灰度化
  11. 关于Word目录英文自动大写无法更改问题的处理办法
  12. python巡检网络设备_pyhton对网络设备的日常巡检
  13. win10 更新之后使用win+s 或者 win+Q 出现新闻推荐和热门搜索
  14. Manjaro为包管理器pacman和yaourt\yay 添加多线程下载
  15. PHPstorm 函数时间注释的修改   正常的PHPstorm里面函数方法的注释是没有动态时间设置的,但是看了PHP file里面有时间日期的注释,而PHP Function Doc Commen
  16. networkx常用函数总结(持续更新)
  17. 基于蓝牙与Android设备的控制系统设计
  18. Nginx 教程(一)-- 工作原理及安装配置
  19. ETL工程师的岗位详情岗位职责
  20. 【PyQt】PyQt+百度API实现图像识别应用(附代码)

热门文章

  1. 20155226 实验三 敏捷开发与XP实践 实验报告
  2. 仿分词统计的MapReduce 程序。
  3. 何登成 MYSQL 博客
  4. 废话少说 分析java抽象类与接口的区别
  5. 在ruby使用终端启用外部程序
  6. 如何用T—SQL命令查询一个数据库中有哪些表?
  7. 图像处理之---双线性插值
  8. 硕博经验——科研论文阅读与写作实战技巧
  9. python使用函数输出指定范围内fibonacci数的个数_第6章函数-4 使用函数输出指定范围内Fibonacci数的个数...
  10. OpenCV图像处理(2)——形态学操作