JDBC查询一条记录,为什么要将列别名和值先存到Map对象中,而不是直接给实体类对象的字段赋值呢?

初学JDBC,想把一些通用的方法封装到DAO中,从网上找的视频看了一下,发现老师的代码是这样写的:
/**
* 查询一条记录,返回对应的对象
* @param clazz:实体类对应的Class对象
* @param sql:sql语句
* @param objects:对sql语句中占位符赋值的可变参数
* @return
*/
public T get(Class clazz, String sql, Object...objects){
T entity = null;

    try {
        //1.获取结果集对象
        Connection conn = JDBCUtils.getConnection();
        PreparedStatement ps = conn.prepareStatement(sql);
        for (int i = 0; i < objects.length; i++) {
            ps.setObject(i + 1, objects[i]);
        }
        ResultSet rs = ps.executeQuery();
        if(rs.next()){
            //2.将结果集对象转换为Map对象,键:列的别名,值:列中的数据
            Map<String, Object> values = new HashMap<String, Object>();
            ResultSetMetaData rsmd = rs.getMetaData();
            //循环将列的别名和值赋给Map对象
            for (int i = 0; i < rsmd.getColumnCount(); i++) {
                String columnLabel = rsmd.getColumnLabel(i + 1);
                Object columnValue = rs.getObject(i + 1);
                values.put(columnLabel, columnValue);
            }
            //3.将Map对象中的数据赋值给实体类对象
            entity = (T) clazz.newInstance();
            //遍历Map对象,对实体类对象中的字段进行赋值
            for (String columnLable : values.keySet()) {
                BeanUtils.setProperty(entity, columnLable, values.get(columnLable));
            }
        }
        JDBCUtils.close(conn, ps, rs);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return entity;
}
想问问各位大神为什么要将列的别名和值先存到Map对象中,然后再遍历将键和值赋值给实体类的对象,我感觉有些冗余,获取到列别名和值直接赋值给实体类对象不是更好吗?是不是我代码写的少见的少不知道这样写有其他的特殊作用啊,求大神指点~

2个回答

qq_24394225
自由000 谢谢您的回答,我问的不是这个,我会将数据存储到Map中,但是不知道为什么要这么做
10 个月之前 回复
 按照上面的逻辑,将数值先存放在Map中确实是多余的,可在for循环中,直接 BeanUtils.setProperty(entity, columnLable,columnValue ));
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
怎么直接给内存地址赋值
比如说给地址为0xbc010290 的地方赋值为3rnrn凌阳源代码如下:rn (*((volatile UINT32 *)0xbc010290)) = 3;rn怎么理解?rn还有没有赋值方法?rnrn
不能直接给self.center.x赋值
-
直接给GridView赋值问题
我想直接给赋值,如:GridView1.Rows[0].Cells[0].Text="abc";rn但提示:索引超出范围。必须为非负值并小于集合大小。rn请问怎么实现这功能?
怎样直接给vector赋值?
我以前一直是用while循环读入,现在碰到要两个vector就不知道怎么办了。。。
为什么字符串常量能直接给一个字符指针变量赋值呢?
[code=c]#define M "hello!rnchar * m;rnm=M;rnputs(m);"[/code]rn简略了代码,不要注重细节。rnm不是存储的是指针吗,M不是字符串常量吗,但为什么M给m赋值,最后执行结果还是现实的是正确的“hello!”呢?
如何直接给DataGridViewCheckBoxCell赋值
这样的,我在dgv中有一列单元格为DataGridViewCheckBoxCellrn我想在更新时一次全列更新成勾选或不勾选项.rn现在知道的是,可用IF,IF值为1,则选上,否则不勾.rn各位大侠有没有什么好方法的?
如何直接给插入到DBGrid中的空记录赋值
采用insert或append向DBGrid中插入一条空记录,如何自动在空记录中对指定的两列字段进行赋值
EF查询中实体的字段如何赋值?
刚接触.net mvc ,ef这些知识,很多不明白,请大神们多多指教!rn[code=csharp]rn//用户实体rnpublic class userrnrn[Key]rnpublic int idget;set;rnpublic string nameget;set;rnrn//用户日志实体rn public class logsrnrn[Key]rnpublic int idget;set;rnpublic int useridget;set;rnpublic string ipget;set;rnpublic virtual string usernameget;set;rn//这是我当前感觉很别扭的办法:rn//public virtual string usernamern//getreturn (from u in db.user where u.Id == userid select u.name).FirstOrDefault() ;rn//rnrn[/code]rn[code=sql]rnselect l.ip,u.name from logs as l left join user as u on l.userid=u.idrn[/code]rn这个需求很简单,就是查询出用户日志和对应用户名,sql的话就像上面那样,但是这个在EF中如果不建视图模型,如何将username赋值并传递到以logs为强类型的视图中呢?
union 和 struct 中,直接给变量赋值为什么是错误的?
union abcrnrnint a = 10;//errorrn;rnrnstruct abcrnrnint a = 10;//errorrn;rnrn如果我想在struct中加一个常变量,怎么办?rnstruct abcrnrnconst int a = 10;  //errorrn
为什么查询显示的不是一条记录?
select BalanceQtyCur,BalanceDateCur from BalanceOther A,rn (select max(BalanceDateCur) as BalanceDateCurMax from BalanceOtherrn where BalanceDateCur>=@dtB and BalanceDateCur<=@dtE) B where BalanceDateCur=BalanceDateCurMaxrnrn如果把BalanceDateCurMax换成一个具体的日期值,查询显示的就是一条记录
用JDBC如何获得字段列别名?
项目中需要获得返回结果集的列别名,但是找不到方法。请大家帮忙。rnrn比如:SELECT column_1 as c1 ,column_2 as c2 from tablernrnconnection = DriverManager.getConnection(URL, userName, password);rnrn//这个方法能获得数据库是否支持别名rn DatabaseMetaData dbMeta = connection.getMetaData();rn System.out.println(dbMeta.supportsColumnAliasing());rnrn preparedstatement = connection.prepareStatement(s1);rn ResultSet resultset = preparedstatement.executeQuery();rn ResultSetMetaData resultsetmetadata = resultset.getMetaData();rnrn //[color=red]这里只能获取到字段的实际名称 column_1 和 column_2[/color] rn //[color=red]但是无法获得别名 c1 和 c2[/color]rn resultsetmetadata.getColumnName(1);rn resultsetmetadata.getColumnName(2);rnrn请问我想[color=red]要获取别名 c1 和 c2 [/color]应当怎么操作呢?JavaAPI中有对应的方法吗?
sd_webimage 可以直接给 image赋值
[view.imageView sd_setImageWithURL:[NSURL URLWithString:annotation.icon] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {         if (image == nil) {
求直接给指针赋值内存地址的方法。。。
我要做一个测试程序,把一个函数单独拿出来测试时间。现在这个函数有4个指针参数。rn比如 test(*a, *b, *c, *d);rn我想在主函数中调用这个函数。给这四个指针自己设置的内存地址。rn我是这样做的 int *a = (int *) 0x009ef788rn但是运行时有中断错误。我想是不是因为给指针了内存地址,但是内存里面没有值得原因。rn大神快来帮忙啊。。。。rn
@Value不能直接给静态变量赋值的解决办法
1.平常使用直接在变量头上加上@Value就可以把配置文件的值注入进来 @Value("${appId}") private String appId; 2.但是变量使用static修饰时,就不能注入进来了 @Value("${appId}") private static String appId 这是因为springboot不支持把值赋值给静态变量,但也给出了响应的解决...
直接给字符串赋值和从键盘输入的值有什么区别?
怎么将键盘的值变成和字符串赋值一样
直接给datagridview赋值 索引超出范围
rnfor (int i = 0; i < strcclist.Count; i++)rnrnthis.dataGridView1.Rows[i].Cells[0].Value = strcclist[i];rnrn运行到这一步就出现下面错误提示:rn“索引超出范围。必须为非负值并小于集合大小。rn参数名: index”rnrnrn请问是什么原因
JSON转对象(实体类对象)
1、创建对象 import java.io.Serializable; import com.alibaba.fastjson.annotation.JSONField; public class PushMsgContent implements Serializable{ /** * */ private static final long serialVersionUID =
不用adodc控件,直接给Datagrid的recordsource赋值为什么没反应?
如题,我用了一下示例代码:rncn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=NWIND.MDB;"rnrs.Open "select * from Products", cn, 3, 3rnSet DataGrid1.DataSource = rsrnDataGrid1.RefreshrnMsgBox rs.RecordCountrn这时候rs确实已经连上,但是Datagrid没有显示,这是为什么呢?rn
直接给vector类型的变量赋值为什么不行?
如果写上rnrnvector a;rna[0]="aksdfja";rna[1]="lskdfj";rnrn编译时没有问题,但是运行时为什么会出错?还有类似的东西,只要vector,T不是简单类型;rn请问这是为什么?多谢啦!
MyBatis-Plus_查询返回实体对象还是map?
在常见场景下:返回数据建议使用map,不建议使用实体对象 /** * 1. 名字包含雨并且年龄小于40 * sql:name like '%雨%' and age &lt; 40 * &lt;p&gt; * 应用场景: * 当表字段非常多,但是你只需要查询少数几列, * 没必要返回的泛型为实体的list,如果返回的泛型为实体,...
为什么直接给文本框赋值就能有结果
package Second;rnimport java.awt.*;rnimport java.awt.event.*;rnrnimport javax.swing.*;rnpublic class Test rnJFrame jf;rnJLabel lb1;rnJLabel lb2;rnJLabel lb3;rnJLabel lb4;rnJTextArea txt1;rnJTextArea txt2;rnJTextField txt3;rnJButton btn1;rnJButton btn2;rnpublic Test()rnjf=new JFrame("商场收银系统");rnlb1=new JLabel("单价:");rnlb2=new JLabel("数量:");rnlb3=new JLabel("总计");rnlb4=new JLabel("0.00");rntxt1=new JTextArea(4,4);rntxt2=new JTextArea(4,4);rntxt3=new JTextField(50);rnbtn1=new JButton("确定");rn btn2=new JButton("重置");rn jf.add(lb1);rn jf.add(lb2);rn jf.add(lb3);rn jf.add(lb4);rn jf.add(txt1);rn jf.add(txt2);rn jf.add(txt3);rn jf.add(btn1);rn jf.add(btn2);rn actionListener1 a=new actionListener1();rn actionListener2 b=new actionListener2();rn btn1.addActionListener(a);rn btn2.addActionListener(b);rn rn jf.setLayout(new FlowLayout(FlowLayout.LEFT,10,20));rnjf.setSize(300,300);rnjf.setVisible(true);rnjf.addWindowListener(new WindowAdapter()public void windowClosing(WindowEvent e)System.exit(0);rn ); rnrn class actionListener1 implements ActionListenerrnrn@Overridernpublic void actionPerformed(ActionEvent e) rn// TODO Auto-generated method stubrndouble TotalPrices=0;rndouble price=Double.parseDouble(txt1.getText());rndouble num=Double.parseDouble(txt2.getText());rn//String A=txt1.getText();rn//String B=txt2.getText();rn//double C=Double.parseDouble(A);rn//double D=Double.parseDouble(B);rnTotalPrices=price*num;rndouble Total=0; rnTotal=Total+TotalPrices;rn//String E=String.valueOf(Total);rntxt3.setText("单价"+txt1.getText()+"数量"+txt2.getText()+"合计:"+String.valueOf(Total));rnlb4.setText(String.valueOf(Total));rnrn rn rn class actionListener2 implements ActionListenerrnrn@Overridernpublic void actionPerformed(ActionEvent e) rn// TODO Auto-generated method stubrntxt1.setText("");rntxt2.setText("");rnrntxt3.setText("");rnrn rn rnrnrnpackage Second;rnrnpublic class Drive rnpublic static void main(String args[])rn Test t=new Test();rnrnrn为什么直接给文本框赋值就能有结果rn自己输入值就由异常啊?
直接给结构体成员数组赋值 怎么会不对为什么啊?
[code=C/C++]#include "stdafx.h"rnrnstruct nodern char name[12];rn int age;rn ;rnchar namexlz[12]="qwe";rnrnmain ()rn struct node *tem;rn tem->name[12]="abc";rn tem->age=12;rn return ;rnrnrn[/code]rn
实体对象转成Map/Map转成实体对象的工具类
package com.yanshu.test; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.*; /**  * 实体对象转成Map  * @author Administrator  *  */ public class MapTrunPojo {
为什么只可以返回CStringArray的指针而不是实体呢?
我编译调试rnCStringArray SplitString(CString sSource,char betch)rnrn CStringArray strArr;rn CString temp;rn char c;rn for(int i=0;iAdd(temp);rn temp="";rn rn elsern rn temp+=c;rn rn rn strArr->Add(temp); rn return strArr;rnrn这样就正常,这是什么原因呢???
相同实体字段的赋值
public static void Copy(KeywordHistory source, Sift dest) { Class cls = source.getClass(); Field[] fieldsS = cls.getDeclaredFields(); Class cld = dest.getClass(); Field[
Map中查询对象
我在map中key存放对象的主键值,value存放对象(不知道对象有几个属性)。我要可以实现任意一个属性或属性的任意组合在map中查询对象。可以写多个方法。
javabean实体类对象转为Map类型对象的方法
在项目中需要用到对象转Map的需求,就记录下来。防止以后需要用到的。 public static Map beanToMap(Object obj) { Map params = new HashMap(0); try { PropertyUtilsBean propertyUtilsBean = new PropertyUt
请问直接给DATE类型的数据怎么符值呢?
我定义了一个DATE类型的数值rnrn如: Aday:Tdatetime;rnrn我想把一个日期如:2004年9月4日 直接符给Aday,rn程序中是 Aday:=2004-9-4;rnrn可是我用showmessage(datetostr(Aday));查看rnrnAday 确是 1905-6-13,这是怎么回事呀?rnrn那要给Aday直接符一个日期值应该怎么写呢!
查询一条记录中的多个字段?
如记录为:rnrn姓名1 姓名2 姓名3rn李 王 张rn张 李 刘rn王 李 张rnrnrn如何查询同时有“李”和“王”的记录?
Unity 直接给物体赋角度值
(想知道方法就直接看最后一行代码吧,下面开始碎碎念) 在项目中需要实现一个第一人称的游戏,其中相机与人物的水平旋转角度要一致。 因为一开始,我做的是第三人称视角,结果要改为第一人称,在第三人称中,我的相机有自己的角度定位方法,就是根据鼠标移动的角度计算出相机位置,然后让相机对准角色,而角色的角度是由键盘控制的。这是两个不同的角度计算方法,导致两者移动的角度不一样,相机已经旋转了90度了,人物才...
利用反射将实体类对象转成Map
在我们编程的过程中往往会用到反射,利用反射有时候可以更容易的做到一些事情,下面就说一个反射的实际应用场景吧,就是将object转化成一个map,object里的属性名对应map的key,object里的属性值对应map的value public static Map&amp;lt;String, Object&amp;gt; objectToMap(Object obj) { Map&amp;lt;S...
Java Map转换实体类对象简单实现
开发的过程中往往依赖的表过多直接按Map值来传递数值,某些场景需要把Map转换为实体类,这里贴一个最简洁的方法,依赖阿里的FastJSon。 maven引入 &amp;amp;lt;dependency&amp;amp;gt; &amp;amp;lt;groupId&amp;amp;gt;com.alibaba&amp;amp;lt;/groupId&amp;amp;gt; &amp;amp;lt;artifactId&amp;amp;gt;fastjson&amp;amp;lt;/arti
关于distinct查询问题。但是我要求的查询是一条记录,而不是一个字段
假设有个表tablea ,distinct字段是tablea_name,其他字段分别是tablea_a1,tablea_a2,rn我的要求结果是rntablea_name, tablea_a1,tablea_a2rn XXXXXX XXX XXXXXxrn BBBBBB XXX XXXxXsrn其中tablea_name字段重复,我要求把不重复的tablea_name字段的记录找出来rnrn rn
表单赋值到实体类对象的通用方法的性能问题
现在参与的项目是分布式的,使用到了thrift框架在客户端和服务端之间传递并返回数据,对性能有一定要求,碰到了这样一个需求,新增订单时,要提交表单,订单表中的字段比较多,有十多个,网上找到个这样的方法:用反射来赋值,可以简化操作,代码如下:rn[code=csharp]/// rn/// 将表单赋予对对象 rn/// rn/// 实体对象 rn/// 表单集合 rnpublic static void GetValue(T t, NameValueCollection form) rn rnType type = t.GetType(); rnPropertyInfo[] pi = type.GetProperties(); rnforeach (PropertyInfo p in pi) rn rnif (form[p.Name] != null) rn rnp.SetValue(t, Convert.ChangeType(form[p.Name], p.PropertyType), null); rn rn rn rn[/code]rnrn我想问的是这个方法用到了反射,在数据量大时会不会影响到性能? 如何来测试它的性能?能否用某种软件来测试性能?求指点一二 多谢
为什么不能直接给edit添加内容
如果编辑框本身已经有文字,但是我还要在里面添加内容的话,如果光标直接定位在里面然后输入的话一点反应也没有,只能双击编辑框之后选中一部分才能修改,搞不明白怎么回事?是不是哪里没有设置好呢?
为什么查询所有记录,显示的全部是最后一条记录呢?
List tasks = new ArrayList();rn DB db = new DB();rn String sql="select * from tb_task";rn ResultSet rs=(ResultSet) db.getRs(sql);rn while(rs.next())rn TextForm task = (TextForm)form;rn task.setTextid(rs.getInt("task_id"));rn task.setGeter(rs.getString("geter"));rn task.setContent(rs.getString("task_content"));rn task.setSender(rs.getString("sender"));rn task.setSubject(rs.getString("task_subject"));rn task.setTaskclass(rs.getInt("task_class"));rn task.setMark(rs.getString("task_mark"));rn tasks.add(task);rn request.setAttribute("aa",tasks);rnrn这里是有什么逻辑错误吗?rn请大家指点!!!!!
为什么结构体数组可以直接给成员赋值,而类数组却不可以??
如图[img=https://img-bbs.csdn.net/upload/201704/10/1491757729_140279.png][/img],结构体数组的话这样赋值就没问题,如果是类数组就会报错,提示[img=https://img-bbs.csdn.net/upload/201704/10/1491757824_50910.png][/img],虽然我知道该怎样弄才不会出错,但我就是自其然不知其所以然,想请教前辈们帮我分析下问题的根本原因在哪里?谢谢!
mybatis 别名查询,map传参
dao层interface package com.bigdata.project.dao; import java.util.List; import java.util.Map; import org.apache.ibatis.annotations.Param; import com.bigdata.project.model.po.SearchResult; public in...
【jdbc】为什么使用PreparedStatement而不是Statement
用PreparedStatement的好处: 1. 代码可读性、可维护性 比如不用PreparedStatement时,sql语句是这么写的 Connection conn = getConnection(); String sql = &quot;insert into student values(&quot; +s.getCardId()+&quot;,'&quot; +s.getName()+&quot;','&quot; +s.ge...
为什么字段别名不能是汉字呢?
ctais系统是1.1版的,用SQL语句查询时,字段名的别名是字母类的就可以,汉字就会出错,这是怎么回事啊?
相关热词 c# 线程结束时执行 c# kb mb 图片 c# 替换第几位字符 c#项目决定成败 c# 与matlab c# xml缩进 c#传感器基础 c#操作wps c# md5使用方法 c# 引用父窗口的组件