Java 内用 Unicode 编码存储字符,字符流处理类负责将外部的其他编码的字符流和 java 内 Unicode 字符流之间的转换。而类 InputStreamReader 和 OutputStreamWriter 处理字符流和字节流的转换。字符流(一次可以处理一个缓冲区)一次 *** 作比字节流(一次一个字节)效率高。
创建实体
ResultBean
private RsultSet resultSet;
private List<Bean> resultList;
包含方法:
方法1:public List<Bean> getResultList();每次将resultList清空后使用resultSetnext读取Bean再添加,判断是否遍历完毕,遍历完毕调用closeResultSet方法并返回null
方法2:public void closeResultSet();关闭ResultSet
2建立一个单例工具类ResultUtil,包含以下私有成员
private Map<用户 *** 作标识,ResultBean> resultMap;
用户 *** 作标识每次进入页面时随机生成一个且不可重复,后续点击加载都是使用页面初始化时使用的用户 *** 作标识
方法1:public void pushResultBean(String 用户 *** 作标识,ResultBean resultBean) ;添加ResultBean到resultMap中,key为用户 *** 作标识;
方法2: public ResultBean getResultBean(String 用户 *** 作标识) 根据用户 *** 作标识取得ResultBean;
方法 3:public void removeResultBean(String 用户 *** 作标识);通过用户 *** 作标识remove
3接口层
通过用户标识调用单例工具类的ResultUtilgetResultBean方法,通过得到的ResultBean再调用getResultList方法,当getResultList方法返回结果为空将调用ResultUtilremoveResultBean方法
4前端
每次通过用户 *** 作标识请求接口,得到响应结果追加即可
机优化方案:还需要ResultUtil中的resultMap回收,可以考虑使用websoket,或者心跳机制,想简单的话先用心跳机制解决,单独开一个接口,前端定时调用,如果超过三十秒该用户 *** 作标识没有心跳检测调用ResultUtilremoveResultBean方法,若是用户体量大的话考虑使用netty
基本上就两种方式:1、自己new一个Bean,循环后自己逐个对应set进去
2、使用反射机制
对查询出来的字段动态添加前缀set,并将首字段改为大写,这样就可以调用到指定Bean指定字段的set方法
印象中没有更方便的方法了
/从ResultSet绑定到JavaBean@paramResultSet@paramDTO(JavaBean)@returnDTO/publicstaticDTObindDataToDTO(ResultSetrs,DTOdto)throwsException{//取得Method方法Method[]methods=dtogetClass()getMethods();//取得ResultSet的列名ResultSetMetaDatarsmd=rsgetMetaData();intcolumnsCount=rsmdgetColumnCount();String[]columnNames=newString[columnsCount];for(inti=0;i<columnsCount;i++){columnNames[i]=rsmdgetColumnLabel(i+1);}//遍历ResultSetwhile(rsnext()){//反射,从ResultSet绑定到JavaBeanfor(inti=0;i<columnNameslength;i++){//取得Set方法StringsetMethodName="set"+columnNames[i];//遍历Methodfor(intj=0;j<methodslength;j++){if(methods[j]getName()equalsIgnoreCase(setMethodName)){setMethodName=methods[j]getName();Objectvalue=rsgetObject(columnNames[i]);//实行Set方法try{//JavaBean内部属性和ResultSet中一致时候MethodsetMethod=dtogetClass()getMethod(setMethodName,valuegetClass());setMethodinvoke(dto,value);}catch(Exceptione){//JavaBean内部属性和ResultSet中不一致时候,使用String来输入值。MethodsetMethod=dtogetClass()getMethod(setMethodName,Stringclass);setMethodinvoke(dto,valuetoString());}}}}}returndto;}ResultSet结果集的getXXX()方法可以直接用getXXX(index)获取里面的数据,不过要按照顺序和类型分开,例如如果数据库表属性是int行那么用getInt(index)直接获取,如果是varchar或char或varchar2(oracle中)可以用getString(index)来获取对应列的值。
还有一种方式是getXXX(属性名),例如你的name属性可以直接用getString("name")来获取值;
在提示一下,在ResultSet结果集使用的时候,应该先调用一下first();或next()方法。来确保指针指向第一行。
不知道对你有帮助没有,至于getMetaDate();我没用过,请楼下解释。只有一个参数的话,百if(rsnext())先判断一下,然后就看你存放的是什么类型的数据了,那个src是String类型的还是URL类型的?rsgetString(1)或者rsgetURL(1)来得到该数据的引用。在ResultSet中取数据之前都要使用rsnext()方法,一个数据的话就是if(rsnext());多个数据的话就是while(rsnext())。每次读出数据后结果集的游标自动下移。鉴于你所说只有一个参数,那么列的度索引就应该是一。ResultSet中的诸多get方法都有重载,比如getString()这个方法,里面可以填入int类型的下表,也可以填入字段名称,比如getString(0)或者getString(“user_name”),前者为user_name字段的下表,后者为字段名称,如果查询语句使用了别名,则字段名称要改为别名楼主你好。方才看了一下你的代码,我想你下面的意思是不是这样的:如果该数据在数据库存在,就更新该数据,不存在就新插入一条数据,是这样的吗?
你的代码:
————————————————————————————————
if(qyxxRs!=null&&qyxxRsnext()){//判断是否存在值
String updateSql = "update B_QYXX t set tqymc='"+qymc+"',tzzjgdm='"+qyjbxxzzjgdm+"',tyyzzh='"+yyzzzch+"'";
psexecuteUpdate(updateSql);
}else{
String insertSql = "";
}
————————————————————————————————
那么看看我给你的建议代码:
boolean exists = false; //判断是否数据库是否存在数据
exists = qyxxRsnext();
do{
if(exists){
String updateSql = "update B_QYXX t set tqymc='"+
qymc+"',tzzjgdm='"+qyjbxxzzjgdm+"',tyyzzh='"+yyzzzch+"'"; /要提示一下,这条sql写的很是汗颜,为什么这条sql一旦执行,将是更新所有的数据,这怎么不让人汗颜呢!所以要在sql后面加限定条件where子句/
psexecuteUpdate(updateSql);
}else{
String insertSql = "";
}
exists = false; //执行一次循环过后,初始化数据
}while(exists = qyxxRsnext());
————————————————————————————————
好了,就是这些,希望能帮助你。用下面的语句就可以了吧
ResultSet resultSet = statementexecuteQuery("select from userinfo;");
while (resultSetnext())
{
String str_1 = resultSetgetString(1);
String str_2 = resultSetgetString(2);
String str_3 = resultSetgetString(3);
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)