关于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;
}
} @Override
public 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;
} @Override
public 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 {
@PersistenceContext
private EntityManager em; @Autowired
private JdbcTemplate jdbcTemplate; @Test
public 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,普通,使用最原始的QueryForList
List<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");
else
funcEntity.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");
else
func.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/45560117
startTime = 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. Activity的跳转及返回值 的四种方法

    Activity生命周期 从创建到销毁的生命周期: onCreate()→onStart()→onResume()→onPouse()→onStop()→onDestroy() 从起动到后台再到前台: ...

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

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

  3. Java多线程初学者指南(8):从线程返回数据的两种方法

    从线程中返回数据和向线程传递数据类似.也可以通过类成员以及回调函数来返回数据.但类成员在返回数据和传递数据时有一些区别,下面让我们来看看它们区别在哪. 一.通过类变量和方法返回数据 使用这种方法返回数 ...

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

    在userMapper.xml文件中新建映射sql的标签 <!-- ******************** 模糊查询的常用的3种方式:********************* --> ...

  5. C语言中函数返回字符串的四种方法

    在讨论着四种方法之前,首先要对函数有一个简单的认识,无论是在形实结合时,还是在return语句返回时,都有一个拷贝的过程.你传进来的参数是个值,自然函数在工作之前要把这个值拷贝一份供自己使用,你传进来 ...

  6. ORACLE查询删除重复记录三种方法

    本文列举了3种删除重复记录的方法,分别是rowid.group by和distinct,小伙伴们可以参考一下.   比如现在有一人员表 (表名:peosons) 若想将姓名.身份证号.住址这三个字段完 ...

  7. ibatis SQLmap mysql模糊查询字符串拼的三种方法

    在通常情况下iBATIS的参数在sqlmap中使用#param#的形式,参数名以’#’包着,但当使用sql的LIKE语句时就发生了问题,在单引号中无法使用#param#这种形式,下面列举出了3种方法来 ...

  8. MS数据库优化查询最常见的几种方法

    1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 5.网络速度慢 6.查询出的数据量过大 ...

  9. 【Spring】利用spring的JdbcTemplate查询返回结果映射到自定义类型

    // org.springframework.jdbc.core.JdbcTemplate 中的查询方法基本都有支持参数RowMapper<T> rowMapper的重载方法.下面只是随便 ...

随机推荐

  1. Xilinx_ISE 14.7 Win10 闪退

    打开D:\Xilinx\14.7\ISE_DS\ISE\lib\nt64 将libPortabilityNOSH.dll 重命名为libPortability.dll,替换原libPortabilit ...

  2. git介绍和常用命令总结

    git中经常用的命令就是以下六个: 以下是命令总结: 另外,自己碰到的问题及解决方法: 在分支内提交远程仓库,-am: revert后进入vim,一直按住esc ,再连续按大写的z两次就退出来了: g ...

  3. [从零开始搭网站七]CentOS上安装Mysql

    点击下面连接查看从零开始搭网站全系列 从零开始搭网站 通过前面6章,我们买好了服务器,配置了服务器连接,服务器上配置了JDK和Tomcat,准备了域名(这个我没教,自己去阿里/百度/腾讯买,买东西我相 ...

  4. React Native 炫酷的动画库 实现任何AE动画 lottie-react-native

    lottie-react-native 传送门 1.npm i --save lottie-react-native 2.react-native link lottie-ios 3.react-na ...

  5. WebSocket 教程

    转载自:http://www.ruanyifeng.com/blog/2017/05/websocket.html WebSocket 是一种网络通信协议,很多高级功能都需要它. 本文介绍 WebSo ...

  6. mysql 和 sqlserver中备份一张表的区别

    sqlserver中备份一张表 SELECT * into qa_buglist_bak FROM qa_buglist 不管表的数据有多大,速度很快: mysql中上述语句就无效了,须得新建一张表, ...

  7. oracle的批量操作sql语句

    1.批量删除/批量更新 mapper: <update id="updatePrjStateByFPrjId" parameterType="string" ...

  8. Qt532.【转】Qt在pro中设置运行时库MT、MTd、MD、MDd,只适合VS版本的Qt

    ZC:具体应该设置 什么参数,可以参看 自己转载的文章:"VC.[转]采用_beginthread__beginthreadex函数创建多线程 - CppSkill - 博客园.html&q ...

  9. How to Get the Function Code in R

    http://fhqdddddd.blog.163.com/blog/static/1869915420104111031148/ http://blog.sina.com.cn/s/blog_61f ...

  10. leecode第一百四十一题(环形链表)

    /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode ...