怎么能 一次添加多条数据

我是个新手,我是在做一个网站的购物车,数据是显示在GridView里面的,当一个用户在点击结算的时候,给数据库的一个订单表添加用户选定的商品数据。 怎么可以一次添加多条数据啊

急 急 急 求各位大神帮助一下 跪求 sql语句

suannai0314
鹳狸媛 楼主的这个问题解决了么?下边的答案能解决问题么?如果可以麻烦点击答案旁的√采纳哦~如果没有也可以将自己的答案贴上然后进行采纳的。
6 年多之前 回复

3个回答

每个SQL语句之间用分号分隔就好了,像下面这样,可以一次性执行的,可以返回总影响记录数。
insert into table1(c1,c2,c3) values('1','1','1');
insert into table2(c1,c2,c3) values('2','2','2');
insert into table3(c1,c2,c3) values('2','2','2');

INSERT INTO tableName(col1,col2,col3)
SELECT 1,2,3
UNION ALL
SELECT 4,5,6
可以用UNION ALL关键字。

u010440444
好男人不解释 好吧 我去试试 谢谢
6 年多之前 回复

insert into table(c1,c2,c3)
values('1','1','1'),
values('1','1','1'),
,
,
不过貌似这是sql server2012才有的,低版本会报错

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
一次添加多条数据到后台数据库
怎么实现像网上商城那样一次结算多件商品 用的ssm ajax 谢谢!
ssh一次性添加多条数据
![图片说明](https://img-ask.csdn.net/upload/201603/31/1459413373_881026.jpg) 如图,表的主键没写出来,就是点击"保存"能把这三条数据一并插入到表中,用ssh。oracle数据库,谢谢大侠。
修改MYSQL数据库函数里插入新数据更改插入条件
片段代码如下: IF substring(tmptext1,z,1)<>CHAR(13) AND POSITION('"' IN substring(tmptext1,z,1))<1 AND POSITION('"' IN substring(tmptext1,j,1))<1 AND POSITION(',' IN substring(tmptext1,z,1))<1 AND POSITION(',' IN substring(tmptext1,j,1))<1 AND POSITION(')' IN substring(tmptext1,z,1))<1 AND POSITION(')' IN substring(tmptext1,j,1))<1 THEN SET @createsql = CONCAT("INSERT ignore INTO " , targettable , "(firstname,secondname,id)VALUES('",substring(tmptext1,j,1),"','",substring(tmptext1,z,1),"','",tid,"')"); PREPARE stmt from @createsql; EXECUTE stmt; 现在的是默认插入一行数据,我想修改为firstname,secondname(两个字段集合唯一索引)字段相同的话,id追加到现在的id字段,两个ID之间加个逗号分隔。 ![图片说明](https://img-ask.csdn.net/upload/201910/14/1571044803_840407.png) 目前插入结果是这样的三列,可以看得出firstname和secondname字段多个都是重复的,如“动故”,“动神”,“动明”是重复出现,我想要达到的效果是: ![图片说明](https://img-ask.csdn.net/upload/201910/14/1571044871_640587.png) 也就是“动故”出现一次了,不需要再插入一条数据,只需要更改ID字段就可以,ID字段我设置了最长字符限制,也就是插入10次后就插入不进去数据了,插入语句里添加了ignore,插入不进去也不会报错是不是这样,谢谢。 ![图片说明](https://img-ask.csdn.net/upload/201910/14/1571044933_458071.png) 字段我已经设置为唯一索引,需要还需要补充什么资料,我再添加,谢谢。 问题解决方法参考内容(有内容我也没看明白,大致就是这个意思) https://www.cnblogs.com/kzfbk/p/7780950.html
关于数据库批处理的问题
一般的批处理都是这样的: //使用PreparedStatement进行批处理 PreparedStatement psStatement = connect.prepareStatement("你的SQL语句(?)"); psStatement.setString(1,"Jennie"); psStatement.addBatch(); //根据需要添加多条批处理语句 psStatement.setString(1,"Tom"); psStatement.addBatch(); //获得批处理的结果 int[] uCounts = psStatement.executeBatch(); //和上面一样可以一次性执行 connect.commit(); 现在呢 我想向多个表插入数据也用批处理 并且他们可能交叉在一起不知道能不能实现 那位高人给我一共一个例子看看。 如果我用下方这种方式可不可以提个意见 //使用PreparedStatement进行批处理 PreparedStatement psStatement1 = connect.prepareStatement("你的SQL语句(?)"); psStatement1.setString(1,"Jennie"); psStatement1.addBatch(); //根据需要添加多条批处理语句 PreparedStatement psStatement2 = connect.prepareStatement("你的SQL语句(?)"); psStatement2.setString(1,"Tom"); psStatement2.addBatch(); //获得批处理的结果 int[] uCounts1 = psStatement1.executeBatch(); int[] uCounts2 = psStatement2.executeBatch(); //和上面一样可以一次性执行 connect.commit(); [b]问题补充:[/b] 我只是想用 prepareStatement 这种方法 不知道用这种方法可不可以处理
为什么form多次提交?
我的添加功能用ajax实现的,但是每次提交都会加进去好多条数据,除了id都是相同的数据,页面调试时只进一次方法,为什么提交了多行数据?![图片](https://img-ask.csdn.net/upload/201512/13/1450001556_953512.jpg)
求一条sqlserver2000的sql语句?
要求是这样的:我的表的主键(cid)是char8 类型的 具体格式是 30200001 也就是302是固定的 后面是一个序列好 这种情况下我在程序中每插入一条数据都要 select max(cid) from 表名 ;然后再把前面的302截取掉,在把后面的序列转化成number型 再加上1然后再toString(),还有判断是否够8位,如果不够的话中间补0 ,用着特别复杂,还效率低下。 各位大哥看看有其他的办法没有? 我的想法是能不能写一个sql语句直接返回下一个要添加的cid 我在程序中就方便多了, 小弟在此谢过了…… [b]问题补充:[/b] 大哥,可不可以提供个示例呀? [b]问题补充:[/b] 数据库设计的缺陷,这个我也知道,因为这个数据库是别人设计的,我这边没法改变,pJun (中级程序员)大哥说的很有道理,可是这样也会有一种问题的产生,就是当cid(后面那部分)的值没有达到5位数时,还要判断一次,也就是还要去补零呀!这个问题怎么解决呀? 谢谢各位了……
ExtJs Window 和 CheckboxSelectionModel
[color=blue][size=small] 在下初学ExtJs,在做一个简单的ExtJs + SSH的增删改时,遇到了这样的两个问题: 首先是Window,当我在进行添加时,调用了window.show()方法,窗口就会显示,但是我提交之后就要将此窗口关闭掉,于是我用了close()方法。 但是关闭之后如果整个页面不刷新的话,在点添加窗口就出不来了,而且还有个错误。 我也尝试用了hide()方法,但是那个只是将窗口隐藏起来,窗口里表单中的内容仍是我以前输入的那些,这样就很不好。 不知道有没有什么好的解决办法? 其次就是CheckboxSelectionModel的问题,我想在页面中实现一个一次性删除多条记录的操作。但是又不知道如何才能将选中的数据ID准确的传入后台,我知道有一个方法是getSelected(),但是它一次只可以记录一条数据。当我尝试用getSelections()方法时,它虽然知道我选择了几条数据,但是它并不知道我选择的到底是哪一条,这个问题哪位大虾能解救下,在下不胜感激 在下新手,分数不多,还请各位大虾体谅 [/size][/color]
程序运行后txt文本出现乱
程序运行后文本文件出现乱码,四个warning是相同的问题, 看了很多帖子但都没有相关的详细回答 请问这种情况该如何解决 ![图片说明](https://img-ask.csdn.net/upload/201912/12/1576134842_865518.png) ![图片说明](https://img-ask.csdn.net/upload/201912/12/1576134945_774123.png) ![图片说明](https://img-ask.csdn.net/upload/201912/12/1576135365_278865.png) ``` #include<iostream> #include<string.h> #include<iomanip> #include<fstream> #include<stdio.h> #include <stdlib.h> using namespace std; int count=0; class CData //定义数据基类 { public: CData(){}; virtual int Compare(CData &)=0; virtual void Show()=0; virtual ~CData(){}; }; class CNode //定义结点基类 { private: CData *pData; //用于指向数据类的指针 CNode *pNext; //用于指向链表的后向指针 public: void InputData(CData *pdata){pData=pdata;} //输入数据 void ShowNode(){pData->Show();} //打印一个节点的数据 CData *GetData(){return pData;} friend class CList; //定义链表类为基类 }; class CList { CNode *pHead; //链表头结点指针 public: CList(){pHead=0;}; ~CList(){DeleteList();} void AddNode(CNode *pnode); //在首部添加结点 CNode *DeleteNode(CNode *); //删除一个指定的结点,返回该结点的指针 CNode *Search(CData &); //查找一个指定的数据,返回该数据所在的结点在链表的指针,未找到返回0 bool IsExist(CData &); void ShowList(); //打印整个链表 void DeleteList(); //删除整个链表 CNode *GetListHead(){return pHead;} //返回链表首结点 CNode *GetListNextNode(CNode *pnode); //返回链表指定结点的下一个结点 }; CNode *CList::GetListNextNode(CNode *pnode) //返回链表指定结点的下一个结点 { CNode *p1=pnode; return p1->pNext; }; void CList::AddNode(CNode *pnode) //在首部添加结点 { if (pHead==0) //如果是空链表,插入的结点是唯一的结点 { pHead=pnode; pnode->pNext=0; return; } else //否则,插入到链表首部 { pnode->pNext=pHead; pHead=pnode; } }; CNode *CList::DeleteNode(CNode *pnode) //删除一个指定的结点,返回该结点的指针 { CNode *p1,*p2; p1=pHead; //指向首结点 while(p1!=pnode&&p1->pNext!=0) //寻找要删除的结点 { p2=p1; p1=p1->pNext; //结点p2始终在p1的后面 } if (p1==pHead) //如果要删除的是首结点 { pHead=pHead->pNext; //将首结点后移 return pnode; } p2->pNext=p1->pNext; //p1指向被删除的结点,将p2结点与p1后面的结点连接起来 return pnode; } CNode *CList::Search(CData &data) //查找一个指定的数据,返回指针,若未找到返回0 { CNode *p1=pHead; while(p1) //从头结点开始查找 { if (p1->pData->Compare(data)==0) return p1; //找到后返回结点指针 p1=p1->pNext; } return 0; //搜索完找不到,返回空指针0 } void CList::ShowList() //打印整个链表 { CNode *p1=pHead; while(p1) { p1->pData->Show(); p1=p1->pNext; } } void CList::DeleteList() //删除整个链表结点 { CNode *p1,*p2; p1=pHead; while(p1) { delete p1->pData; p2=p1; p1=p1->pNext; delete p2; } } class Repository:public CData //库存为记录,为数据基类的公有派生类 { private : char szName[20]; //库存中数据:商品名、商品数量和入库价格 unsigned int szNumber; char szPrice[20]; char szN; CList ShList; public: Repository(); //构造函数 Repository(char *name,int number,char *price); void SetRecord(char *name, int number,char *price); //输入数据函数 int Compare(CData &); //比较函数,比较商品名 void Show(); void AddRecord(); void Display(); void LookUpRecord(); void DeleteRecord(); void ModifyRecord(); void SaveToFile(); void Operate(string &strChoice); void ReadFromFile(); void Output(); }; Repository::Repository() { strcpy(szName,"\0"); szNumber=0; strcpy(szPrice,"\0"); } Repository::Repository(char *name,int number,char *price) { strcpy(szName,name); szNumber=number; strcpy(szPrice,price); szN=name[0]; } void Repository::SetRecord(char *name, int number,char *price) //输入数据函数 { strcpy(szName,name); szNumber=number; strcpy(szPrice,price); szN=name[0]; } int Repository::Compare(CData &data) //比较商品名 { Repository &temp=(Repository &)data; return strcmp(szName,temp.szName); } void Repository::Show() //打印一个结点的数据 { cout<<setw(15)<<szName<<setw(15)<<szNumber<<setw(15)<<szPrice<<endl; } void Repository::AddRecord() //将记录添加到链表中 { CNode *pNode; Repository *pSh; char szName[20],szPrice[20]; unsigned int szNumber; cout<<"请输入新商品名(输入0退出,并进入系统菜单):"; cin>>szName; while(strcmp(szName,"0")) { cout<<"请输入新商品入库价格: "; cin>>szPrice; cout<<"请输入新商品数量: "; cin>>szNumber; pSh=new Repository; //生成新的数据累对象 pSh->SetRecord(szName,szNumber,szPrice); //数据类对象赋值 pNode=new CNode; //生成新的结点 pNode->InputData(pSh); //结点插入链表 ShList.AddNode(pNode); count++; cout<<"请输入新商品名(输入0退出,并进入系统菜单) "; cin>>szName; } cout<<endl<<endl; } void Repository::Display() //显示全部链表数据 { cout<<"当前操作共有"<<count<<"条新商品的添加纪录。\n\n"; cout<<"目前库存共有商品信息记录是:\n\n"; cout<<setiosflags(ios_base::left)<<setw(15)<<"商品名"<<setw(15)<<"商品数量"<<setw(15)<<"入库价格"<<endl<<endl; ShList.ShowList(); cout<<endl<<endl; system("pause"); system("cls"); } void Repository::LookUpRecord() // 按照商品名查找 { CNode *pLook; char szName[20]; cout<<"请输入您需要查找的商品名(输入0退出,并进入系统菜单):"; cin>>szName; while (strcmp(szName,"0")) { Repository sh(szName,0,"0"); //生成结点 pLook=ShList.Search(sh); //查找指定结点的数据 if (pLook) { cout<<"在库存商品信息记录中找到商品:"<<szName<<",内容是:"<<endl; cout<<setw(15)<<"商品名"<<setw(15)<<"商品数量"<<setw(15)<<"入库价格"<<endl; pLook->ShowNode(); } else cout<<"在库存商品信息记录中找不到商品:"<<szName<<"。"<<endl; cout<<"请输入您需要查找的商品名(输入0退出,并进入系统菜单):"; cin>>szName; } cout<<endl<<endl; } void Repository::DeleteRecord() //在链表中删除指定的结点的数据 { CNode *pLook; char szName[20]; cout<<"请输入您需要删除的商品名(输入0退出,并进入系统菜单):"; cin>>szName; while(strcmp(szName,"0")) { Repository sh(szName,0,"0"); pLook=ShList.Search(sh); if (pLook) //删除时应先查找出结点 { cout<<"在库存商品信息记录中找到商品:"<<szName<<",内容是:"<<endl; cout<<setw(15)<<"商品名"<<setw(15)<<"商品数量"<<setw(15)<<"入库价格"<<endl; pLook->ShowNode(); cout<<"请确定是否删除此商品信息记录(Y/N)【确定删除请输入Y或y,取消删除请输入N或n】:"; char ok; cin>>ok; if (ok=='Y'||ok=='y') { ShList.DeleteNode(pLook); cout<<szName<<"的信息记录删除成功!"<<endl; delete pLook; count--; } else if(ok=='N'||ok=='n') cout<<szName<<"的信息记录删除失败!"<<endl; } else cout<<"在库存商品信息记录中找不到商品:"<<szName<<"。"<<endl; cout<<"请输入您需要删除的商品名(输入0退出,并进入系统菜单):"; cin>>szName; } cout<<endl<<endl; } void Repository::ModifyRecord() //修改商品记录 { CNode *pLook; Repository *pSh; char szName[20],szPrice[20]; unsigned int szNumber; cout<<"请输入您需要修改的商品名(输入0退出,并进入系统菜单):"; cin>>szName; while(strcmp(szName,"0")) { Repository sh(szName,0,"0"); pLook=ShList.Search(sh); if (pLook) //修改时应先查找出结点 { cout<<"在库存商品信息记录中找到商品:"<<szName<<",内容是:"<<endl; cout<<setw(15)<<"商品名"<<setw(15)<<"商品数量"<<setw(15)<<"入库价格"<<endl; pLook->ShowNode(); cout<<"-----下面开始修改-----"<<endl<<"请输入修改后的商品名: "; cin>>szName; cout<<"请输入修改后的商品数量:"; cin>>szNumber; cout<<"请输入修改后的商品入库价格: "; cin>>szPrice; cout<<"请确定是否修改此记录(Yes (Y) or No(N)):"; char ok; cin>>ok; if (ok=='Y'||ok=='y') { pSh=new Repository; pSh->SetRecord(szName,szNumber,szPrice); pLook->InputData(pSh); cout<<szName<<"的信息记录修改成功!"<<endl; } else if(ok=='N'||ok=='n') cout<<szName<<"的信息记录修改失败!"<<endl; } else cout<<" 在库存商品信息记录中找不到"<<szName<<","<<endl; cout<<" 请输入您需要修改的商品名(输入0退出,并进入系统菜单):"; cin>>szName; } } void Repository::Output() { CNode *pLook; Repository *pSh; char szName[20]; unsigned int szNumber; cout<<"请输入您需要出库的商品名(输入0退出,并进入系统菜单):"; cin>>szName; while(strcmp(szName,"0")) { Repository sh(szName,0,"0"); pLook=ShList.Search(sh); if (pLook) //修改时应先查找出结点 { pSh=(Repository *)pLook->GetData(); cout<<"在库存商品信息记录中找到商品:"<<szName<<",内容是:"<<endl; cout<<setw(15)<<"商品名"<<setw(15)<<"商品数量"<<setw(15)<<"入库价格"<<endl; pLook->ShowNode(); if (0==pSh->szNumber) { cout<<"该商品缺货,请及时补充!"<<endl; } else { cout<<"请输入您要取出的商品数量:"; cin>>szNumber; cout<<"请确定是否取出该商品( Yes (Y) or No(N) ):"; char ok; cin>>ok; if(ok=='Y'||ok=='y') { if(pSh->szNumber<=szNumber) { cout<<szName<<"您要求的商品数量大于仓库中的数量,故全部输出"<<pSh->szNumber<<" 个商品"<<endl; pSh->szNumber=0; } else { pSh->szNumber-=szNumber; cout<<szName<<"您已取出 "<<szNumber<<" 个商品"<<endl; } cout<<szName<<"成功取出!"<<endl; } else if(ok=='N'||ok=='n') cout<<szName<<"您取消了该操作"<<endl; } } else cout<<" 在库存商品信息记录中找不到"<<szName<<","<<endl; cout<<" 请输入您需要出库的商品名(输入0退出,并进入系统菜单):"; cin>>szName; } } void Repository::SaveToFile() //将链表中的数据保存在文件中 { ofstream outfile("repository.txt",ios::binary); if(! outfile) { cout<<"数据文件打开错误,没有将数据存入文件!\n"; return; } CNode *pnode; Repository *pSh; string strName,strNumber; pnode=ShList.GetListHead(); //取出链表首结点指针 while(pnode) { pSh=(Repository *)pnode->GetData(); //返回结点指向的数据域指针 outfile.write((char *)pSh,sizeof(Repository)); //将数据域写入文件 pnode=ShList.GetListNextNode(pnode); // 取下一结点的指针 } outfile.close(); } void Repository::ReadFromFile() //在程序开始先查找有无数据文件,找到后读取文件数据 { ifstream infile("repository.txt",ios::binary); if(! infile) { cout<<"没有数据文件,请您先添加!\n\n"; return; } CNode *pNode; Repository *pSh; while(! infile.eof()) { pSh=new Repository; //定义数据域对象 infile.read((char *)pSh,sizeof(Repository)); pNode=new CNode; pNode->InputData(pSh); //数据域对象内容生成结点 ShList.AddNode(pNode); //将结点加入链表 } ShList.DeleteNode(pNode); //由于文件多读一次,所以将首结点删除 infile.close(); } void Repository::Operate(string &strChoice) //根据主菜单选项进行操作 { if (strChoice=="1") AddRecord(); else if (strChoice=="2") Display(); else if (strChoice=="3") LookUpRecord(); else if (strChoice=="4") DeleteRecord(); else if(strChoice=="5") ModifyRecord(); else if(strChoice=="6") Output(); else if (strChoice=="0") SaveToFile(); else cout<<"对不起,您的输入有误,请重新输入您的选择: "; } int main() { Repository repository; cout<<"*******************************************************************\n\n"; cout<<" 欢迎进入库存管理系统 \n\n"; cout<<"*******************************************************************\n\n"; repository.ReadFromFile(); //从文件中输入数据 string strChoice; //接受主菜单选项 do { cout<<"【欢迎进入系统菜单】:\n\n\n"; cout<<" <1>.添加新商品信息记录\n\n"; cout<<" <2>.显示库存中商品信息记录内容\n\n"; cout<<" <3>.根据商品名查询库存中商品信息记录\n\n"; cout<<" <4>.根据商品名删除库存中商品信息记录\n\n"; cout<<" <5>.根据商品名修改库存中商品信息记录\n\n"; cout<<" <6>.商品出库\n\n"; cout<<" <0>.退出系统\n\n\n"; cout<<"【请输入您的选择】:"; cin>>strChoice; system("cls"); repository.Operate(strChoice); }while(strChoice!="0"); cout<<"***********************************************************************\n\n"; cout<<" ------------******欢迎再次使用库存管理系统******---------- \n\n"; cout<<"***********************************************************************\n\n"; system("pause"); } ```
.net 多线程 调用接口
``` 情况是这样的,我做了一个定时器,每天某个时间调用接口,发送所有数据。 由于一次数据可能多条 所以做两个分页查询(先说明下 为了让没有数据的时候 不从复调用接口,所以每天只执行一次) 在下面必须添加Thread.Sleep();否则无法按for循环执行。 public void StartOnHour_GuoQi(object sender, System.Timers.ElapsedEventArgs e) { //整点发送 if (e.SignalTime.Hour == hour_start && e.SignalTime.Minute == minute_start && e.SignalTime.Second == 0) { //执行请求处理 try { var param = new { pageindex = 0, pagesize = 10 }; var result_page = InvokeAgentService("OverdueDataCount", param); dynamic page_Json = JKZL.Common.Core.Converts.Json2Dynamic.DynamicConvertHelper.ConvertJson(result_page); //总记录数 int total = CommFunction.IntParse(page_Json.Data.TotalCount); //总页数 int allpage = 0; /*分页*/ if ((total % pageSize) == 0) { allpage = total / pageSize; } else { allpage = (total / pageSize) + 1; } for (int pageIndex = 0; pageIndex < allpage; pageIndex++) { var thread_GuoQi = new Thread(() => { var parameters = new { pageindex = pageIndex, pagesize = pageSize }; var result = InvokeAgentService("GetOverdueData", parameters); dynamic resutlJson = JKZL.Common.Core.Converts.Json2Dynamic.DynamicConvertHelper.ConvertJson(result); if (resutlJson != null && resutlJson.Code == "10000") { foreach (var item in resutlJson.Data.Items) { //执行代码 } else { LogHelp.SysLog("请求返回结果错误结果--接口数据:" + result, "error"); } }); thread_GuoQi.Start(); Thread.Sleep(50); } } catch (Exception ex) { LogHelp.SysLog("执行过期通知处理程序错误" + ex.Message, "error"); } } } ```
PHP数组取值的奇怪问题,哪位帮忙给看看,谢谢~
在拉取微信用户信息写入数据库的过程中,遇到一个奇怪的问题,折磨了我一天了,希望哪位高人给看一下,在通过接口获取到微信用户的信息后,使用网上找的一个数据库操作类写入数据表,在数据库操作类的insert函数中有个检查传入数组元素是否为空的判断,只要去掉它,就获取不到数组数据了,加上它就有,奇怪了 wx.php ``` include "dbMysqli.class.php"; $db=ConnectMysqli::getIntance(); $url = "https://api.weixin.qq.com/sns/userinfo?access_token=".$_SESSION['token']['access_token']."&openid=".$_SESSION['token']['openid']."&lang=zh_CN"; $res = https_request($url); $resArr = json_decode($res, true); $data = array("openID"=>"{$resArr['openid']}","nickName"=>"{$resArr['nickname']}","city"=>"{$resArr['city']}","province"=>"{$resArr['province']}","country"=>"{$resArr['country']}","headImgUrl"=>"{$resArr['headimgurl']}"); $db->insert('tb_users',$data); } ``` dbMysqli.class.php ``` <?php header('content-type:text/html;charset=utf-8'); /* 掌握满足单例模式的必要条件 (1)私有的构造方法-为了防止在类外使用new关键字实例化对象 (2)私有的成员属性-为了防止在类外引入这个存放对象的属性 (3)私有的克隆方法-为了防止在类外通过clone成生另一个对象 (4)公有的静态方法-为了让用户进行实例化对象的操作 */ class ConnectMysqli{ //私有的属性 private static $dbcon=false; private $host; private $port; private $user; private $pass; private $db; private $charset; private $link; //私有的构造方法 private function __construct($config=array()){ $this->host = isset($config['host']) ? $config['host'] : 'localhost'; $this->port = isset($config['port']) ? $config['port'] : '3306'; $this->user = isset($config['user']) ? $config['user'] : 'root'; $this->pass = isset($config['pass']) ? $config['pass'] : ''; $this->db = isset($config['db']) ? $config['db'] : 'db_uplus'; $this->charset=isset($arr['charset']) ? $arr['charset'] : 'utf8'; //连接数据库 $this->db_connect(); //选择数据库 $this->db_usedb(); //设置字符集 $this->db_charset(); } //连接数据库 private function db_connect(){ $this->link=mysqli_connect($this->host.':'.$this->port,$this->user,$this->pass); if(!$this->link){ echo "数据库连接失败<br>"; echo "错误编码".mysqli_errno($this->link)."<br>"; echo "错误信息".mysqli_error($this->link)."<br>"; exit; } } //设置字符集 private function db_charset(){ mysqli_query($this->link,"set names {$this->charset}"); } //选择数据库 private function db_usedb(){ mysqli_query($this->link,"use {$this->db}"); } //私有的克隆 private function __clone(){ die('clone is not allowed'); } //公用的静态方法 public static function getIntance(){ if(self::$dbcon==false){ self::$dbcon=new self; } return self::$dbcon; } //执行sql语句的方法 public function query($sql){ $res=mysqli_query($this->link,$sql); if(!$res){ echo "sql语句执行失败<br>"; echo "错误编码是".mysqli_errno($this->link)."<br>"; echo "错误信息是".mysqli_error($this->link)."<br>"; } return $res; } //打印数据 public function p($arr){ echo "<pre>"; print_r($arr); echo "</pre>"; } public function v($arr){ echo "<pre>"; var_dump($arr); echo "</pre>"; } //获得最后一条记录id public function getInsertid(){ return mysqli_insert_id($this->link); } /** * 查询某个字段 * @param * @return string or int */ public function getOne($sql){ $query=$this->query($sql); return mysqli_free_result($query); } //获取一行记录,return array 一维数组 public function getRow($sql,$type="assoc"){ $query=$this->query($sql); if(!in_array($type,array("assoc",'array',"row"))){ die("mysqli_query error"); } $funcname="mysqli_fetch_".$type; return $funcname($query); } //获取一条记录,前置条件通过资源获取一条记录 public function getFormSource($query,$type="assoc"){ if(!in_array($type,array("assoc","array","row"))) { die("mysqli_query error"); } $funcname="mysqli_fetch_".$type; return $funcname($query); } //获取多条数据,二维数组 public function getAll($sql){ $query=$this->query($sql); $list=array(); while ($r=$this->getFormSource($query)) { $list[]=$r; } return $list; } /* * 定义添加数据的方法 * @param string $table 表名 * @param string orarray $data [数据] * @return int 最新添加的id */ public function insert($table,$data){ //遍历数组,得到每一个字段和字段的值 $key_str=''; $v_str=''; foreach($data as $key=>$v){ if(empty($v)){ die("insert data error"); } //$key的值是每一个字段s一个字段所对应的值 $key_str.=$key.','; $v_str.="'$v',"; } $key_str=trim($key_str,','); $v_str=trim($v_str,','); //判断数据是否为空 $sql="insert into $table ($key_str) values ($v_str)"; $this->query($sql); //返回上一次增加操做产生ID值 return $this->getInsertid(); } /* * 删除一条数据方法 * @param1 $table, $where=array('id'=>'1') 表名 条件 * @return 受影响的行数 */ public function deleteOne($table, $where){ if(is_array($where)){ foreach ($where as $key => $val) { $condition = $key.'='.$val; } } else { $condition = $where; } $sql = "delete from $table where $condition"; $this->query($sql); //返回受影响的行数 return mysqli_affected_rows($this->link); } /* * 删除多条数据方法 * @param1 $table, $where 表名 条件 * @return 受影响的行数 */ public function deleteAll($table, $where){ if(is_array($where)){ foreach ($where as $key => $val) { if(is_array($val)){ $condition = $key.' in ('.implode(',', $val) .')'; } else { $condition = $key. '=' .$val; } } } else { $condition = $where; } $sql = "delete from $table where $condition"; $this->query($sql); //返回受影响的行数 return mysqli_affected_rows($this->link); } /** * [修改操作description] * @param [type] $table [表名] * @param [type] $data [数据] * @param [type] $where [条件] * @return [type] */ public function update($table,$data,$where){ //遍历数组,得到每一个字段和字段的值 $str=''; foreach($data as $key=>$v){ $str.="$key='$v',"; } $str=rtrim($str,','); //修改SQL语句 $sql="update $table set $str where $where"; $this->query($sql); //返回受影响的行数 return mysqli_affected_rows($this->link); } } ?> ```
求助 小白debug不到是哪空指针了。
public class MainActivity extends Activity { private GraphicalView chart; private Timer timer = new Timer(); private TimerTask task; private Float addY; private String addX; Tool_Sqls mysql = new Tool_Sqls(); String[] xkedu = new String[20] ;//x轴数据缓冲 Float[] ycache = new Float[20]; //private final static int SERISE_NR = 1; //曲线数量 private XYSeries series;//用来清空第一个再加下一个 private XYMultipleSeriesDataset dataset1;//xy轴数据源 private XYMultipleSeriesRenderer render; SimpleDateFormat shijian = new SimpleDateFormat("hh:mm:ss"); Handler handler2; TextView guangzhi2; protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.guangzhao); //guangzhi2=(TextView)findViewById(R.id.guangzhi2); //制作曲线图 LinearLayout linearLayout = (LinearLayout)findViewById(R.id.guangzhexian); chart = ChartFactory.getLineChartView(this, getdemodataset(), getdemorenderer()); linearLayout.removeAllViews();//先remove再add可以实现统计图更新 linearLayout.addView(chart, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); handler2 = new Handler(){ public void handleMessage(Message msg) { updatechart(); //guangzhi2.setText(String.valueOf(addY)); } }; task = new TimerTask(){ public void run() { Message msg=new Message(); msg.what=200; handler2.sendMessage(msg); } }; timer.schedule(task, 0, 2000); }//oncreate结束 //更新折线图 private void updatechart() { //判断当前点集中到底有多少点,因为屏幕总共只能容纳20个,所以当点数超过20时,长度永远是20 int length=series.getItemCount(); int a=length; if(length>20){ length=20; } // try { // if(guangzhi2.getText().toString()!=null){ // addY = Float.valueOf(guangzhi2.getText().toString());//要不要判断再说 // } // } catch (NumberFormatException e) { // e.printStackTrace(); // } addX=shijian.format(new java.util.Date()); try { mysql.getROID_4("hoestry2","id"); while (mysql.rs.next()) { addY = Float.valueOf(mysql.rs.getFloat("outlet_temperature"));//(float)(Math.random()*10); } mysql.rs.close(); mysql.stmt.close(); mysql.con.close(); } catch (SQLException e) { e.printStackTrace(); } //移除数据集中旧的点集 dataset1.removeSeries(series); if(a<20)//当数据集中不够20个点的时候直接添加就好,因为初始化的时候只有一个点,所以前几次更新的时候直接添加 { series.add(a+1, addY);//第一个参数代表第几个点,要与下面语句中的第一个参数对应 render.addXTextLabel(a+1, addX); xkedu[a]=addX; } else //超过了20个点要去除xcache【0】换成【1】的..... { //将旧的点集中x和y的数值取出来放入backup中,造成曲线向左平移的效果 for(int i =0 ;i<length-1;i++){ ycache[i]=(float) series.getY(i+1); xkedu[i]=xkedu[i+1]; } //点集先清空,为了做成新的点集而准备 series.clear(); //将新产生的点首先加入到点集中,然后在循环体中将坐标变换后的一系列点都重新加入到点集中 for(int k =0 ;k<length-1;k++){ series.add(k+1, ycache[k]); render.addXTextLabel(k+1, xkedu[k]); } xkedu[4]=addX; series.add(20, addY); render.addXTextLabel(20, addX); } //在数据集中添加新的点集 dataset1.addSeries(series); //视图更新,没有这一步,曲线不会呈现动态 chart.invalidate(); } private XYMultipleSeriesRenderer getdemorenderer() { // TODO Auto-generated method stub render = new XYMultipleSeriesRenderer(); render.setChartTitle("三新锅炉温度曲线图"); render.setChartTitleTextSize(20);//设置整个图表标题文字的大小 render.setAxisTitleTextSize(16);//设置轴标题文字的大小 render.setAxesColor(Color.BLACK); render.setXTitle("时间/hh:mm:ss"); render.setYTitle("温度/℃"); render.setLabelsTextSize(16);//设置轴刻度文字的大小 render.setLabelsColor(Color.BLACK); render.setXLabelsColor(Color.BLACK); render.setYLabelsColor(0, Color.BLACK); render.setLegendTextSize(15);//设置图例文字大小 //render.setShowLegend(false);//显示不显示在这里设置,非常完美 XYSeriesRenderer r = new XYSeriesRenderer();//设置颜色和点类型 r.setColor(Color.RED); r.setPointStyle(PointStyle.CIRCLE); r.setFillPoints(true); r.setChartValuesSpacing(3); render.addSeriesRenderer(r); render.setYLabelsAlign(Align.RIGHT);//刻度值相对于刻度的位置 render.setShowGrid(true);//显示网格 render.setYAxisMax(60);//设置y轴的范围 render.setYAxisMin(-10); render.setYLabels(20);//设置Y轴标签数 render.setDisplayChartValues(true);//设置Y轴曲线上的点的数值是否显示,实测当点数密集的时候不会全部显示,会隔一段时间显示 render.setInScroll(true); render.setLabelsTextSize(14); render.setLabelsColor(Color.BLACK); //render.getSeriesRendererAt(0).setDisplayChartValues(true); //显示折线上点的数值 render.setPanEnabled(false,false);//禁止报表的拖动 render.setPointSize(5f);//设置点的大小(图上显示的点的大小和图例中点的大小都会被设置) render.setMargins(new int[]{40,40,40,40}); //设置图形四周的留白 render.setMarginsColor(Color.WHITE); render.setXLabels(0);// 取消X坐标的数字zjk,只有自己定义横坐标是才设为此值 return render; } private XYMultipleSeriesDataset getdemodataset() { // TODO Auto-generated method stub dataset1=new XYMultipleSeriesDataset();//xy轴数据源 series = new XYSeries("矿大温度 ");//这个事是显示多条用的,显不显示在上面render设置 //这里相当于初始化,初始化中无需添加数据,因为如果这里添加第一个数据的话, //很容易使第一个数据和定时器中更新的第二个数据的时间间隔不为两秒,所以下面语句屏蔽 //这里可以一次更新五个数据,这样的话相当于开始的时候就把五个数据全部加进去了,但是数据的时间是不准确或者间隔不为二的 //for(int i=0;i<5;i++) //series.add(1, Math.random()*10);//横坐标date数据类型,纵坐标随即数等待更新 dataset1.addSeries(series); return dataset1; } public void onDestroy() { //当结束程序时关掉Timer timer.cancel(); super.onDestroy(); } } ``` ```
如何写sql语句,给个思路也行,记录表有几千万条记录,产品表有几百万条,人员表有几百条
记录表: ``` CREATE TABLE [dbo].[wsd_count]( [id] [int] IDENTITY(1,1) NOT NULL, [uid] [varchar](64) NULL, [line] [varchar](64) NULL, [num] [varchar](64) NULL, [result] [varchar](64) NULL, [data] [datetime] NULL, [count_reserve1] [nvarchar](255) NULL, [count_reserve2] [nvarchar](255) NULL, [count_reserve3] [nvarchar](255) NULL, [count_reserve4] [nvarchar](255) NULL, [count_reserve5] [datetime] NULL, CONSTRAINT [PK_wsd_count] PRIMARY KEY CLUSTERED ( [id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'ID' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'wsd_count', @level2type=N'COLUMN',@level2name=N'id' GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'用户ID' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'wsd_count', @level2type=N'COLUMN',@level2name=N'uid' GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'生产线' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'wsd_count', @level2type=N'COLUMN',@level2name=N'line' GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'产品' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'wsd_count', @level2type=N'COLUMN',@level2name=N'num' GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'结果' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'wsd_count', @level2type=N'COLUMN',@level2name=N'result' GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'日期' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'wsd_count', @level2type=N'COLUMN',@level2name=N'data' GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'预留字段1' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'wsd_count', @level2type=N'COLUMN',@level2name=N'count_reserve1' GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'预留字段2' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'wsd_count', @level2type=N'COLUMN',@level2name=N'count_reserve2' GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'预留字段3' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'wsd_count', @level2type=N'COLUMN',@level2name=N'count_reserve3' GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'预留字段4' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'wsd_count', @level2type=N'COLUMN',@level2name=N'count_reserve4' GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'预留字段5' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'wsd_count', @level2type=N'COLUMN',@level2name=N'count_reserve5' GO ``` 产品表: ``` CREATE TABLE [dbo].[wsd_product]( [id] [int] IDENTITY(1,1) NOT NULL, [num] [varchar](64) NULL, [pmname] [varchar](64) NULL, [prname] [varchar](64) NULL, [scdata] [datetime] NULL, [zsdata] [datetime] NULL, [type] [varchar](64) NULL, [color] [varchar](64) NULL, [ptlot] [varchar](64) NULL, [car] [varchar](64) NULL, [remake] [varchar](64) NULL, [product_reserve1] [nvarchar](255) NULL, [product_reserve2] [nvarchar](255) NULL, [product_reserve3] [nvarchar](255) NULL, [product_reserve4] [nvarchar](255) NULL, [product_reserve5] [nvarchar](255) NULL, [product_reserve6] [nvarchar](255) NULL, [product_reserve7] [nvarchar](255) NULL, [product_reserve8] [datetime] NULL, [product_reserve9] [datetime] NULL, [product_reserve0] [datetime] NULL, CONSTRAINT [PK_wsd_product] PRIMARY KEY CLUSTERED ( [id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'ID' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'wsd_product', @level2type=N'COLUMN',@level2name=N'id' GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'件号' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'wsd_product', @level2type=N'COLUMN',@level2name=N'num' GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'项目名称' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'wsd_product', @level2type=N'COLUMN',@level2name=N'pmname' GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'产品名称' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'wsd_product', @level2type=N'COLUMN',@level2name=N'prname' GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'生产日期' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'wsd_product', @level2type=N'COLUMN',@level2name=N'scdata' GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'注塑日期' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'wsd_product', @level2type=N'COLUMN',@level2name=N'zsdata' GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'产品分类' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'wsd_product', @level2type=N'COLUMN',@level2name=N'type' GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'颜色' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'wsd_product', @level2type=N'COLUMN',@level2name=N'color' GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'喷涂批次' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'wsd_product', @level2type=N'COLUMN',@level2name=N'ptlot' GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'车号' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'wsd_product', @level2type=N'COLUMN',@level2name=N'car' GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'备注' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'wsd_product', @level2type=N'COLUMN',@level2name=N'remake' GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'预留字段1' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'wsd_product', @level2type=N'COLUMN',@level2name=N'product_reserve1' GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'预留字段2' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'wsd_product', @level2type=N'COLUMN',@level2name=N'product_reserve2' GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'预留字段3' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'wsd_product', @level2type=N'COLUMN',@level2name=N'product_reserve3' GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'预留字段4' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'wsd_product', @level2type=N'COLUMN',@level2name=N'product_reserve4' GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'预留字段5' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'wsd_product', @level2type=N'COLUMN',@level2name=N'product_reserve5' GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'预留字段6' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'wsd_product', @level2type=N'COLUMN',@level2name=N'product_reserve6' GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'预留字段7' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'wsd_product', @level2type=N'COLUMN',@level2name=N'product_reserve7' GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'预留字段8' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'wsd_product', @level2type=N'COLUMN',@level2name=N'product_reserve8' GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'预留字段9' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'wsd_product', @level2type=N'COLUMN',@level2name=N'product_reserve9' GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'预留字段0' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'wsd_product', @level2type=N'COLUMN',@level2name=N'product_reserve0' GO ``` 人员表: ``` CREATE TABLE [dbo].[sys_user]( [id] [varchar](64) NOT NULL, [company_id] [varchar](64) NOT NULL, [office_id] [varchar](64) NOT NULL, [login_name] [varchar](100) NOT NULL, [password] [varchar](100) NOT NULL, [no] [varchar](100) NULL, [name] [varchar](100) NOT NULL, [email] [varchar](200) NULL, [phone] [varchar](200) NULL, [mobile] [varchar](200) NULL, [user_type] [char](1) NULL, [photo] [varchar](1000) NULL, [login_ip] [varchar](100) NULL, [login_date] [datetime] NULL, [login_flag] [varchar](64) NULL, [create_by] [varchar](64) NOT NULL, [create_date] [datetime] NOT NULL, [update_by] [varchar](64) NOT NULL, [update_date] [datetime] NOT NULL, [remarks] [varchar](255) NULL, [del_flag] [char](1) NOT NULL, PRIMARY KEY CLUSTERED ( [id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO ALTER TABLE [dbo].[sys_user] ADD DEFAULT ('0') FOR [del_flag] GO ``` 背景:某零件加工厂有几条产线检测产品是否合格,每检测一件产品在记录表中添加一条记录,检测结果放到result字段中,检测结果有四个大类,三十多小类,详情如下: <th>合格</th><th>抛光</th><th>打磨</th><th>报废</th> <th>打磨流挂</th> <th>打磨颗粒</th>。。。 要求: 统计某个员工某个时间段做的某个产品的统计信息,包括员工个人信息,一次合格率(合格/总数),二次合格率((合格+抛光*0.85)/所有),各个检测结果的数量。 查询条件为空时列出所有员工,所做的所有产品的统计记录,每个产品单独占一行。 使用sqlsever2008,查询百万数据速度在三秒内可增加悬赏。
jquery 单击事件 局部变量 越界 问题
问题描述 从数据库中读取出N条记录 每条记录都对应一个按钮 使用Jquery为每个按钮增加一个单击事件 单击按钮 所在行要进行更新的单元格数据 变成输入框可以更新所在行的数据 JavaScript文件代码 [code="js"] $(document).ready(function() { // 为修改按钮注册单击事件 var modifies = $(".modify"); for (var i =0; i < modifies.length; i++) { $(modifies[i]).click(function() { // 定位该修改按钮所在表单中typeName所在Td位置 // 注:查找的是Id alert(i); var typeName = "#" + (i+1) + "_typeNameCn"; var typeNameTd = $(typeName); // 保存单元格中的数据 var text = typeNameTd.text(); // 清空td里面的内容 typeNameTd.empty(); alert(text); // 建立一个文本框,即一个input的元素节点 // 注:name属性的命名要和action中的命名一致 var input = $("<input type=\"text\" name=\"mt.typeNameCn\" />"); // 设置文本框的值是保存起来的文本内容 input.attr("value", text); // 将文本框中的内容加入到td中 typeNameTd.append( input ); // 隐藏"修改"按钮 $(modifies[i]).css("display","none"); // 找到提交按钮,让提交按钮显示出来 var submit = "#" + i +"_submit"; $(submit).css("display","block"); }); } }); [/code] jsp文件代码 [code="java"] <table> <tr> <td> 杂志类型编号 </td> <td> 杂志类型名称 </td> <td> 操作 </td> </tr> <s:iterator value="mts"> <s:form name="editMagazineTypeForm" method="post" theme="simple"> <tr> <td> <s:property value="typeId" /> &nbsp; </td> <% //指定对应的id值,便于定位单元格 %> <td id="${typeId}_typeNameCn"> <s:property value="typeNameCn" /> </td> <td> <s:hidden name="mt.typeId" value="%{typeId}"></s:hidden> <s:submit value="修改fdfdf" onclick="this.disabled='true'" cssStyle="display:none;"></s:submit> <button class="modify" onclick="%{typeId}"> 修改 </button> </td> </tr> </s:form> </s:iterator> </table> [/code] 问题:当我单击按钮之后,经过断点测试发现 for循环中的i变量不是0而是2 也就是说局部变量在完成循环之后 并没有从内存中清除 而是保留了下来 继续递增 不知道这样的描述是否正确 请帮忙告知如何解决 谢谢 [b]问题补充:[/b] 是的每次都是打印的2 就是i最后一次参与循环的值 [b]问题补充:[/b] ********************************************************* 我是新来的 感觉自己提出的问题自己不能回答 就做问题补充了 高手别见怪啊 ********************************************************* each方法比较好 进行遍历效果不错 但是我想实现的是 "为查找到的所有按钮添加单击事件" 如何做呢? 我使用上面我写的方法为每个按钮添加了单击事件 但是 i的值不变了 执行上面的JS代码 如果i的值不变的话 相当于为多个按钮 注册了相同的单击事件 我的目的是 通过单击按钮直接更新 "相应" 的数据记录
jQuery上传插件Uploadify 3.2在.NET下的详细例子
项目中要使用Uploadify 3.2来实现图片上传并生成缩略通的功能,特此记下来,以供各位参考! Uploadify下载地址:http://www.uploadify.com/download/ 下载下来解压后估计里面很多文件,其实有用的也就jquery.uploadify.min.js、uploadify.css、uploadify.swf和uploadify-cancel.png这四个文件。你还得下载jQuery库,我这里用的是jquery-1.7.2.min.js,另外和大多数JQ插件一样,同时也需要swfobject.js这个插件,我的是2.2的版本,东西都准备好了,那下面就开始。 前端界面: [html] view plain copy <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="jqUploadify._Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>无标题页</title> <link href="scripts/uploadify.css" rel="stylesheet" type="text/css" /> <link href="scripts/default.css" rel="stylesheet" type="text/css" /> <script src="scripts/jquery-1.7.2.min.js" type="text/javascript"></script> <script src="scripts/swfobject.js" type="text/javascript"></script> <script src="scripts/jquery.uploadify.min.js" type="text/javascript"></script> <script type="text/javascript"> $(function(){ $("#file_upload").uploadify({ //开启调试 'debug' : false, //是否自动上传 'auto':false, 'buttonText':'选择照片', //flash 'swf': "scripts/uploadify.swf", //文件选择后的容器ID 'queueID':'uploadfileQueue', 'uploader':'scripts/upload.ashx', 'width':'75', 'height':'24', 'multi':false, 'fileTypeDesc':'支持的格式:', 'fileTypeExts':'*.jpg;*.jpge;*.gif;*.png', 'fileSizeLimit':'1MB', 'removeTimeout':1, //返回一个错误,选择文件的时候触发 'onSelectError':function(file, errorCode, errorMsg){ switch(errorCode) { case -100: alert("上传的文件数量已经超出系统限制的"+$('#file_upload').uploadify('settings','queueSizeLimit')+"个文件!"); break; case -110: alert("文件 ["+file.name+"] 大小超出系统限制的"+$('#file_upload').uploadify('settings','fileSizeLimit')+"大小!"); break; case -120: alert("文件 ["+file.name+"] 大小异常!"); break; case -130: alert("文件 ["+file.name+"] 类型不正确!"); break; } }, //检测FLASH失败调用 'onFallback':function(){ alert("您未安装FLASH控件,无法上传图片!请安装FLASH控件后再试。"); }, //上传到服务器,服务器返回相应信息到data里 'onUploadSuccess':function(file, data, response){ //alert(data); } }); }); function doUplaod(){ $('#file_upload').uploadify('upload','*'); } function closeLoad(){ $('#file_upload').uploadify('cancel','*'); } </script> </head> <body> <table width="704" border="0" align="center" cellpadding="0" cellspacing="0" id="__01"> <tr> <td align="center" valign="middle"> <div id="uploadfileQueue" style="padding: 3px;"> </div> <div id="file_upload"> </div> </td> </tr> <tr> <td height="50" align="center" valign="middle"> <img alt="" src="images/BeginUpload.gif" width="77" height="23" onclick="doUplaod()" style="cursor: hand" /> <img alt="" src="images/CancelUpload.gif" width="77" height="23" onclick="closeLoad()" style="cursor: hand" /> </td> </tr> </table> </body> </html> 后端的Handler: [csharp] view plain copy using System; using System.Collections; using System.Data; using System.Linq; using System.Web; using System.Web.Services; using System.Web.Services.Protocols; using System.Xml.Linq; using System.Web.SessionState; using System.IO; namespace jqUploadify.scripts { /// <summary> /// $codebehindclassname$ 的摘要说明 /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] public class upload : IHttpHandler, IRequiresSessionState { public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/plain"; context.Response.Charset = "utf-8"; HttpPostedFile file = context.Request.Files["Filedata"]; string uploadPath = context.Server.MapPath("..\\uploads\\"); if (file != null) { if (!Directory.Exists(uploadPath)) { Directory.CreateDirectory(uploadPath); } file.SaveAs(uploadPath + file.FileName); //生成缩略图 MakeThumbnail(uploadPath + file.FileName, uploadPath + "\\s\\" + file.FileName, 80, 80); } } private void MakeThumbnail(string sourcePath, string newPath, int width, int height) { System.Drawing.Image ig = System.Drawing.Image.FromFile(sourcePath); int towidth = width; int toheight = height; int x = 0; int y = 0; int ow = ig.Width; int oh = ig.Height; if ((double)ig.Width / (double)ig.Height > (double)towidth / (double)toheight) { oh = ig.Height; ow = ig.Height * towidth / toheight; y = 0; x = (ig.Width - ow) / 2; } else { ow = ig.Width; oh = ig.Width * height / towidth; x = 0; y = (ig.Height - oh) / 2; } System.Drawing.Image bitmap = new System.Drawing.Bitmap(towidth, toheight); System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap); g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; g.Clear(System.Drawing.Color.Transparent); g.DrawImage(ig, new System.Drawing.Rectangle(0, 0, towidth, toheight), new System.Drawing.Rectangle(x, y, ow, oh), System.Drawing.GraphicsUnit.Pixel); try { bitmap.Save(newPath, System.Drawing.Imaging.ImageFormat.Jpeg); } catch (Exception ex) { throw ex; } finally { ig.Dispose(); bitmap.Dispose(); g.Dispose(); } } public bool IsReusable { get { return false; } } } } 这样我们就是实现图片上传至uploads,生成的缩略图(这里设为80*80)存放在uploads下面的s文件夹中,是不是很简单呢!当然实际使用过程你还可能碰到一下的问题: 1、在火狐下session出现丢失的情况,可以参考这里:http://www.cnblogs.com/akingyao/archive/2012/09/04/2670794.html 2、IE9出现了按钮不能点击的问题,可以参考这里:http://www.uploadify.com/forum/#/discussion/9155/uploadify-version-3-2-does-not-work-in-ie9/p1 最后贴一个Uploadify参数说明: Uploadify Version 3.2 Options选项设置 auto 选择文件后自动上传 buttonClass 给“浏览按钮”加css的class样式 buttonCursor 鼠标移上去形状:arrow箭头、hand手型(默认) buttonImage 鼠标移上去变换图片 buttonText 按钮文字 checkExisting 在目录中检查文件是否已上传成功(1 ture,0 false) debug 是否显示调试框(默认不显示false) fileObjName 设置一个名字,在服务器处理程序中根据该名字来取上传文件的数据。默认为Filedata,$tempFile = $_FILES['Filedata']['tmp_name'] fileSizeLimit 设置允许上传文件最大值B, KB, MB, GB 比如:'fileSizeLimit' : '20MB' fileTypeDesc 选择的文件的描述。这个字符串出现在浏览文件对话框中文件类型下拉框处。默认:All Files fileTypeExts 允许上传的文件类型。格式:'fileTypeExts' : '*.gif; *.jpg; *.png' formData 附带值,需要通过get or post传递的额外数据,需要结合onUploadStart事件一起使用 height “浏览按钮”高度px itemTemplate <itemTemplate>节点表示显示的内容。这些内容中也可以包含绑定到控件DataSource属性中元素集合的数据。 method 上传方式。默认:post multi 选择文件时是否可以【选择多个】。默认:可以true overrideEvents 不执行默认的onSelect事件 preventCaching 随机缓存值 默认true ,可选true和false.如果选true,那么在上传时会加入一个随机数来使每次的URL都不同,以防止缓存.但是可能与正常URL产生冲突 progressData 进度条上显示的进度:有百分比percentage和速度speed。默认百分比 queueID 给“进度条”加背景css的ID样式。文件选择后的容器ID queueSizeLimit 允许多文件上传的数量。默认:999 removeCompleted 上传完成后队列是否自动消失。默认:true removeTimeout 上传完成后队列多长时间后消失。默认 3秒 需要:'removeCompleted' : true,时使用 requeueErrors 队列上传出错,是否继续回滚队列,即反复尝试上传。默认:false successTimeout 上传超时时间。文件上传完成后,等待服务器返回信息的时间(秒).超过时间没有返回的话,插件认为返回了成功。 默认:30秒 swf swf文件的路径,本文件是插件自带的,不可用其它的代替.本参数不可省略 uploader 上传处理程序URL,本参数不可省略 uploadLimit 限制总上传文件数,默认是999。指同一时间,如果关闭浏览器后重新打开又可上传。 width “浏览按钮”宽度px Events 事件 onCancel 当取消一个上传队列中的文件时触发,删除时触发 onClearQueue 清除队列。当'cancel'方法带着*参数时,也就是说一次全部取消的时候触发.queueItemCount是被取消的文件个数(另外的按钮) onDestroy 取消所有的上传队列(另外的按钮) onDialogClose 当选择文件对话框关闭时触发,不论是点的'确定'还是'取消'都会触发.如果本事件被添加进了'overrideEvents'参数中,那么如果在选择文件时产生了错误,不会有错误提示框弹出 onDialogOpen 当选择文件框被打开时触发,没有传过来的参数 onDisable 关闭上传 onEnable 开启上传 onFallback 检测FLASH失败调用 onInit 每次初始化一个队列时触发 onQueueComplete 当队列中的所有文件上传完成时触发 onSelect 当文件从浏览框被添加到队列中时触发 onSelectError 选择文件出错时触发 onSWFReady flash准备好时触发 onUploadComplete当一个文件上传完成时触发 onUploadError 当文件上传完成但是返回错误时触发 onUploadProgress上传汇总 onUploadStart 一个文件上传之间触发 onUploadSuccess 每个上传完成并成功的文件都会触发本事件 Methods 方法 cancel 取消一个上传队列 destroy 取消所有上传队列 disable 禁止点击“浏览按钮” settings 返回或修改一个 uploadify实例的settings值 stop 停止当前的上传并重新添加到队列中去 upload 上传指定的文件或者所有队列中的文件 最后是DEMO的下载地址:http://download.csdn.net/detail/wangqiuyun/566551
Mybatis小练习 报错 求大神指导,信息详尽
# UserMapper ``` public interface UserMapper { //根据id查询用户信息 public User findUserById(int id) throws Exception; //根据用户名列查询用户列表 public List<User> findUserByName(String name)throws Exception; //插入用户 public void insertUser(User user)throws Exception; } ``` # UserMapper.xml ``` <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离 注意:使用mapper代理方法开发,namespace有特殊重要的作用,namespace等于mapper接口地址 --> <mapper namespace="com.neuedu.mapper.UserMapper"> <!-- 在 映射文件中配置很多sql语句 --> <!-- 需求:通过id查询用户表的记录 --> <!-- 通过 select执行数据库查询 id:标识 映射文件中的 sql 将sql语句封装到mappedStatement对象中,所以将id称为statement的id parameterType:指定输入 参数的类型,这里指定int型 #{}表示一个占位符号 #{id}:其中的id表示接收输入 的参数,参数名称就是id,如果输入 参数是简单类型,#{}中的参数名可以任意,可以value或其它名称 resultType:指定sql输出结果 的所映射的java对象类型,select指定resultType表示将单条记录映射成的java对象。 --> <select id="findUserById" parameterType="int" resultType="user"> SELECT * FROM user WHERE id=#{value} </select> <!-- 根据用户名称模糊查询用户信息,可能返回多条 resultType:指定就是单条记录所映射的java对象 类型 ${}:表示拼接sql串,将接收到参数的内容不加任何修饰拼接在sql中。 使用${}拼接sql,引起 sql注入 ${value}:接收输入 参数的内容,如果传入类型是简单类型,${}中只能使用value --> <select id="findUserByName" parameterType="java.lang.String" resultType="com.neuedu.pojo.User"> SELECT * FROM user WHERE username LIKE '%${value}%' </select> <!-- 添加用户 parameterType:指定输入 参数类型是pojo(包括 用户信息) #{}中指定pojo的属性名,接收到pojo对象的属性值,mybatis通过OGNL获取对象的属性值 --> <insert id="insertUser" parameterType="com.neuedu.pojo.User"> <!-- 将插入数据的主键返回,返回到user对象中 SELECT LAST_INSERT_ID():得到刚insert进去记录的主键值,只适用与自增主键 keyProperty:将查询到主键值设置到parameterType指定的对象的哪个属性 order:SELECT LAST_INSERT_ID()执行顺序,相对于insert语句来说它的执行顺序 resultType:指定SELECT LAST_INSERT_ID()的结果类型 --> insert into user(id,username,birthday,sex,address) values (seq_user.nextval,#{username},#{birthday},#{sex},#{address}) <!-- 插入数据后,返回自动增长列的ID值,将sql语句的返回值赋给parameterType绑定对象的ID属性 MySQL中使用: select LAST_INSERT_ID() --> <selectKey keyProperty="id" order="AFTER" resultType="int"> SELECT LAST_INSERT_ID() <!--select seq_user.currval from dual--> </selectKey> <!-- 使用mysql的uuid()生成主键 执行过程: 首先通过uuid()得到主键,将主键设置到user对象的id属性中 其次在insert执行时,从user对象中取出id属性值 --> <!-- <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String"> SELECT uuid() </selectKey> insert into user(id,username,birthday,sex,address) value(#{id},#{username},#{birthday},#{sex},#{address}) --> </insert> <!-- 删除 用户 根据id删除用户,需要输入 id值 --> <delete id="deleteUser" parameterType="java.lang.Integer"> delete from user where id=#{id} </delete> <!-- 根据id更新用户 分析: 需要传入用户的id 需要传入用户的更新信息 parameterType指定user对象,包括 id和更新信息,注意:id必须存在 #{id}:从输入 user对象中获取id属性值 --> <update id="updateUser" parameterType="com.neuedu.pojo.User"> update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id} </update> </mapper> ``` # Tset ``` public class UserMapperTest { private SqlSessionFactory sqlSessionFactory; // 此方法是在执行testFindUserById之前执行 @Before public void setUp() throws Exception { // 创建sqlSessionFactory // mybatis配置文件 String resource = "config/SqlMapConfig.xml"; // 得到配置文件流 InputStream inputStream = Resources.getResourceAsStream(resource); // 创建会话工厂,传入mybatis的配置文件信息 sqlSessionFactory = new SqlSessionFactoryBuilder() .build(inputStream); } @Test public void testFindUserById() throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); //创建UserMapper对象,mybatis自动生成mapper代理对象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //调用userMapper的方法 User user = userMapper.findUserById(1); System.out.println(user); } @Test public void testFindUserByName() throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); //创建UserMapper对象,mybatis自动生成mapper代理对象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //调用userMapper的方法 List<User> list = userMapper.findUserByName("袁超"); sqlSession.close(); System.out.println(list); } } ``` # 报错信息 ``` DEBUG [main] - Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter. DEBUG [main] - Class not found: org.jboss.vfs.VFS DEBUG [main] - JBoss 6 VFS API is not available in this environment. DEBUG [main] - Class not found: org.jboss.vfs.VirtualFile DEBUG [main] - VFS implementation org.apache.ibatis.io.JBoss6VFS is not valid in this environment. DEBUG [main] - Using VFS adapter org.apache.ibatis.io.DefaultVFS DEBUG [main] - Find JAR URL: file:/C:/Users/95638/Desktop/mybatis/ch02-mybatis01/ch02-mybatis01/target/classes/com/neuedu/pojo DEBUG [main] - Not a JAR: file:/C:/Users/95638/Desktop/mybatis/ch02-mybatis01/ch02-mybatis01/target/classes/com/neuedu/pojo DEBUG [main] - Reader entry: User.class DEBUG [main] - Listing file:/C:/Users/95638/Desktop/mybatis/ch02-mybatis01/ch02-mybatis01/target/classes/com/neuedu/pojo DEBUG [main] - Find JAR URL: file:/C:/Users/95638/Desktop/mybatis/ch02-mybatis01/ch02-mybatis01/target/classes/com/neuedu/pojo/User.class DEBUG [main] - Not a JAR: file:/C:/Users/95638/Desktop/mybatis/ch02-mybatis01/ch02-mybatis01/target/classes/com/neuedu/pojo/User.class DEBUG [main] - Reader entry: ���� 1 N DEBUG [main] - Checking to see if class com.neuedu.pojo.User matches criteria [is assignable to Object] DEBUG [main] - PooledDataSource forcefully closed/removed all connections. DEBUG [main] - PooledDataSource forcefully closed/removed all connections. DEBUG [main] - PooledDataSource forcefully closed/removed all connections. DEBUG [main] - PooledDataSource forcefully closed/removed all connections. DEBUG [main] - Find JAR URL: file:/C:/Users/95638/Desktop/mybatis/ch02-mybatis01/ch02-mybatis01/target/test-classes/com/neuedu/mapper DEBUG [main] - Not a JAR: file:/C:/Users/95638/Desktop/mybatis/ch02-mybatis01/ch02-mybatis01/target/test-classes/com/neuedu/mapper DEBUG [main] - Reader entry: UserMapperTest.class DEBUG [main] - Listing file:/C:/Users/95638/Desktop/mybatis/ch02-mybatis01/ch02-mybatis01/target/test-classes/com/neuedu/mapper DEBUG [main] - Find JAR URL: file:/C:/Users/95638/Desktop/mybatis/ch02-mybatis01/ch02-mybatis01/target/test-classes/com/neuedu/mapper/UserMapperTest.class DEBUG [main] - Not a JAR: file:/C:/Users/95638/Desktop/mybatis/ch02-mybatis01/ch02-mybatis01/target/test-classes/com/neuedu/mapper/UserMapperTest.class DEBUG [main] - Reader entry: ���� 1 a DEBUG [main] - Find JAR URL: file:/C:/Users/95638/Desktop/mybatis/ch02-mybatis01/ch02-mybatis01/target/classes/com/neuedu/mapper DEBUG [main] - Not a JAR: file:/C:/Users/95638/Desktop/mybatis/ch02-mybatis01/ch02-mybatis01/target/classes/com/neuedu/mapper DEBUG [main] - Reader entry: UserMapper.class DEBUG [main] - Reader entry: UserMapper.xml DEBUG [main] - Listing file:/C:/Users/95638/Desktop/mybatis/ch02-mybatis01/ch02-mybatis01/target/classes/com/neuedu/mapper DEBUG [main] - Find JAR URL: file:/C:/Users/95638/Desktop/mybatis/ch02-mybatis01/ch02-mybatis01/target/classes/com/neuedu/mapper/UserMapper.class DEBUG [main] - Not a JAR: file:/C:/Users/95638/Desktop/mybatis/ch02-mybatis01/ch02-mybatis01/target/classes/com/neuedu/mapper/UserMapper.class DEBUG [main] - Reader entry: ���� 1    findUserById (I)Lcom/neuedu/pojo/User; DEBUG [main] - Find JAR URL: file:/C:/Users/95638/Desktop/mybatis/ch02-mybatis01/ch02-mybatis01/target/classes/com/neuedu/mapper/UserMapper.xml DEBUG [main] - Not a JAR: file:/C:/Users/95638/Desktop/mybatis/ch02-mybatis01/ch02-mybatis01/target/classes/com/neuedu/mapper/UserMapper.xml DEBUG [main] - Reader entry: <?xml version="1.0" encoding="UTF-8" ?> DEBUG [main] - Checking to see if class com.neuedu.mapper.UserMapperTest matches criteria [is assignable to Object] DEBUG [main] - Checking to see if class com.neuedu.mapper.UserMapper matches criteria [is assignable to Object] DEBUG [main] - Opening JDBC Connection DEBUG [main] - Created connection 209833425. DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@c81cdd1] DEBUG [main] - ==> Preparing: SELECT * FROM T_USER WHERE username LIKE '%袁超%' DEBUG [main] - ==> Parameters: org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'mybatis.t_user' doesn't exist ### The error may exist in com/neuedu/mapper/UserMapper.xml ### The error may involve com.neuedu.mapper.UserMapper.findUserByName-Inline ### The error occurred while setting parameters ### SQL: SELECT * FROM T_USER WHERE username LIKE '%袁超%' ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'mybatis.t_user' doesn't exist at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:150) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141) at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:137) at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:75) at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59) at com.sun.proxy.$Proxy3.findUserByName(Unknown Source) at com.neuedu.mapper.UserMapperTest.testFindUserByName(UserMapperTest.java:68) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) at org.junit.runners.ParentRunner.run(ParentRunner.java:309) at org.junit.runner.JUnitCore.run(JUnitCore.java:160) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68) at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47) at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242) at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70) Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'mybatis.t_user' doesn't exist at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at com.mysql.jdbc.Util.handleNewInstance(Util.java:400) at com.mysql.jdbc.Util.getInstance(Util.java:383) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:980) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3847) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3783) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2447) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2594) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2545) at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1901) at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1193) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:59) at com.sun.proxy.$Proxy5.execute(Unknown Source) at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:63) at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:79) at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:63) at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:324) at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156) at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109) at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:83) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148) ... 29 more ``` # SqlMapConfig.xml ``` <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!-- 加载属性文件 --> <properties resource="db.properties"> <!--properties中还可以配置一些属性名和属性值 --> <!-- <property name="jdbc.driver" value=""/> --> </properties> <!-- 全局配置参数,需要时再设置 --> <!-- <settings> </settings> --> <!-- 别名定义 --> <typeAliases> <!-- 针对单个别名定义 type:类型的路径 alias:别名 --> <!-- <typeAlias type="com.neuedu.mybatis.po.User" alias="user"/> --> <!-- 批量别名定义 指定包名,mybatis自动扫描包中的po类,自动定义别名,别名就是类名(首字母大写或小写都可以) --> <package name="com.neuedu.pojo"/> </typeAliases> <!-- 和spring整合后 environments配置将废除--> <environments default="development"> <environment id="development"> <!-- 使用jdbc事务管理,事务控制由mybatis--> <transactionManager type="JDBC" /> <!-- 数据库连接池,由mybatis管理--> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </dataSource> </environment> </environments> <!-- 加载 映射文件 --> <mappers> <mapper resource="sqlmap/User.xml"/> <!--通过resource方法一次加载一个映射文件 --> <!-- <mapper resource="sqlmap/User.xml"/> --> <!-- 通过mapper接口加载单个 映射文件 遵循一些规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录 中 上边规范的前提是:使用的是mapper代理方法 --> <!-- <mapper class="com.neuedu.mapper.UserMapper"/> --> <!-- 批量加载mapper 指定mapper接口的包名,mybatis自动扫描包下边所有mapper接口进行加载 遵循一些规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录 中 上边规范的前提是:使用的是mapper代理方法 --> <package name="com.neuedu.mapper"/> </mappers> </configuration> ``` # User ``` public class User { //属性名和数据库表的字段对应 private int id; private String username;// 用户姓名 private String sex;// 性别 private Date birthday;// 生日 private String address;// 地址 public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "User [id=" + id + ", username=" + username + ", sex=" + sex + ", birthday=" + birthday + ", address=" + address + "]"; } } ``` 也不知道为什么,明明已经在UserMapper.xml里面把表名改了,但是报错信息里查找的还是T-user表 求大神指导!感恩! # 问题已解决 在maven文件里加上下面的代码 ``` <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*Mapper.xml</include> </includes> </resource> </resources> ```
使用codebook建立背景模型,内存很快就耗尽的问题,
我是在MFC中新建进程获取摄像头的图像,并保存在pImage中,每一毫秒更新pImage中的图片(使用waitkey(1)),点击按钮一就进行了背景建模,即程序中的OnBnClickedButton1(),并进行前景检测,程序运行正常,实现了想要的效果,只是几分钟后就耗尽内存了,请教高手如何改进程序。 ``` #define CHANNELS 1 typedef struct cd { uchar learnHigh[CHANNELS]; uchar learnLow[CHANNELS]; uchar max[CHANNELS]; uchar min[CHANNELS]; int t_last_update; int stale; }code_element; typedef struct code_book { code_element **cb; int numEntries; int t; }codeBook; ////////////////////////////////////////////////////////////////////////// //捕捉背景中相关变化的图像 //p 指向YUV像素的指针 //c 该像素的codebook //cbBounds codebook的训练边界 //numChannels 训练的通道数 int update_codebook(uchar *p, codeBook& c, unsigned *cbBounds, int numChannels) { if(c.numEntries == 0) c.t = 0; // 码本中码元为零时初始化时间为0 c.t += 1; // Record learning event // 每调用一次加一,即每一帧图像加一 unsigned int high[CHANNELS], low[CHANNELS]; // int n; //设置码元的边界 for (int n=0; n<numChannels; n++) { high[n] = *(p + n) + *(cbBounds + n); if (high[n] > 255) { high[n] = 255; } low[n] = *(p + n) - *(cbBounds+n); if (low[n] < 0) { low[n] = 0; } } int matchChannel; int i; //查看所有的码元,像素是否在现存的码元中 for (i= 0; i<c.numEntries; i++) { matchChannel = 0; //判断像素是否在方块中,每有一条通道的像素符合,则matchChannel加1 for (int n=0; n<numChannels; n++) { if ((c.cb[i]->learnLow[n] <= *(p+n)) && (*(p+n) <= c.cb[i]->learnHigh[n])) { matchChannel++; } } //如果像素所有通道都在学习边界内,则调整阈值最大和最小值以使该元素被包括在codebook 码元中 if (matchChannel == numChannels) { c.cb[i] -> t_last_update = c.t; for (int n= 0; n<numChannels; n++) { if (c.cb[i]->max[n] < *(p+n)) { c.cb[i]->max[n] = *(p+n); } else if (c.cb[i]->min[n] > *(p+n)) { c.cb[i]->min[n] = *(p+n); } } //若像素在一个方块里,则不用再计算其他方块 break; } } //统计每个码本条目多长时间被访问一次 for (int s=0; s<c.numEntries; s++) { int negRun = c.t - c.cb[s]->t_last_update; if (c.cb[s]->stale < negRun ) { c.cb[s]->stale = negRun; } } //添加一个新的codebook if (i==c.numEntries) { code_element **foo = new code_element *[c.numEntries+1]; for (int ii=0; ii<c.numEntries; ii++) { foo[ii] = c.cb[ii]; } foo[c.numEntries] = new code_element; if(c.numEntries ) delete [] c.cb; c.cb = foo; for (int n= 0; n<numChannels; n++) { c.cb[c.numEntries]->learnHigh[n] = high[n]; c.cb[c.numEntries]->learnLow[n] = low[n]; c.cb[c.numEntries]->max[n] = *(p+n); c.cb[c.numEntries]->min[n] = *(p+n); } c.cb[c.numEntries]->t_last_update = c.t; c.cb[c.numEntries]->stale = 0; c.numEntries +=1; } //如果像素在码元阈值之外,但仍然在其高低范围内,训练边界加1, for (int n=0; n<numChannels; n++) { if(c.cb[i]->learnHigh[n] < high[n]) { c.cb[i]->learnHigh[n] += 1; } if (c.cb[i]->learnLow[n] > low[n]) { c.cb[i]->learnLow[n] -= 1; } } return (i); } ////////////////////////////////////////////////////////////////////////// //避免训练噪声的codebook,需要删除训练过程中很少访问的codebook条目 int clear_stale_entries(codeBook &c) { //staleThresh为运行总时间的一般, int staleThresh = c.t>>1; int *keep = new int [c.numEntries]; int keepCnt = 0; //如果codebook的一个box在总时间的一半没有被访问过,则删除该box。 for (int i=0; i<c.numEntries ; i++) { if (c.cb[i]->stale > staleThresh) { keep [i] = 0; } else { keep[i] = 1; keepCnt += 1; } } c.t = 0; code_element **foo = new code_element *[keepCnt]; int k = 0; //将剩余的box复制到foo中, for ( int ii=0; ii<c.numEntries ; ii++) { if (keep[ii]) { foo[k] = c.cb[ii]; foo[k]->t_last_update = 0; k++; } } delete [ ]keep; delete [] c.cb; c.cb = foo; int numCleared = c.numEntries - keepCnt; c.numEntries = keepCnt; return (numCleared); } ////////////////////////////////////////////////////////////////////////// //从背景中将前景目标的像素分割出来 uchar background_diff(uchar *p, codeBook &c, int numChannels, int *minMod, int *maxMod) { int matchChannel; int i; //像素是否在codebook的box中 for (i=0; i<c.numEntries ; i++) { matchChannel = 0; for (int n=0; n<numChannels; n++) { if ((c.cb[i]->min[n] - minMod[n] <= *(p+n)) && (*(p+n) <= c.cb[i]->max[n] + maxMod[n])) { matchChannel++; } else { break; } } if (matchChannel == numChannels) { break; } } /* _CrtDumpMemoryLeaks(); */ //前景返回255 if (i >= c.numEntries ) { return (255); } //背景返回0 return (0); } void Cbackground1Dlg::OnBnClickedButton1() { /////////////////////////////////////// // 需要使用的变量 CvCapture* capture; IplImage* rawImage; IplImage* yuvImage; IplImage* ImaskCodeBook; codeBook* cB; unsigned cbBounds[CHANNELS]; uchar* pColor; //YUV pointer int imageLen; int nChannels = CHANNELS; int minMod[CHANNELS]; int maxMod[CHANNELS]; ////////////////////////////////////////////////////////////////////////// // 初始化各变量 cvNamedWindow("Raw"); cvNamedWindow("CodeBook"); // capture = cvCreateFileCapture("tree.avi"); // if (!capture) // { // printf("Couldn't open the capture!"); // return ; // } // // rawImage = cvQueryFrame(capture); rawImage = cvCreateImage(cvSize(640,512),8,1); yuvImage = cvCreateImage(cvGetSize(rawImage), 8, 1); // 给yuvImage 分配一个和rawImage 尺寸相同,8位1通道图像 ImaskCodeBook = cvCreateImage(cvGetSize(rawImage), IPL_DEPTH_8U, 1); // 为ImaskCodeBook 分配一个和rawImage 尺寸相同,8位单通道图像 cvSet(ImaskCodeBook, cvScalar(255)); // 设置单通道数组所有元素为255,即初始化为白色图像 imageLen = rawImage->width * rawImage->height; cB = new codeBook[imageLen]; // 得到与图像像素数目长度一样的一组码本,以便对每个像素进行处理 for (int i=0; i<imageLen; i++) // 初始化每个码元数目为0 cB[i].numEntries = 0; for (int i=0; i<nChannels; i++) { cbBounds[i] = 10; // 用于确定码元各通道的阀值 minMod[i] = 20; // 用于背景差分函数中 maxMod[i] = 20; // 调整其值以达到最好的分割 } ////////////////////////////////////////////////////////////////////////// // 开始处理视频每一帧图像 for (double i=0;;i++) { /*cvCvtColor(rawImage, yuvImage, CV_BGR2YCrCb);*/ // 色彩空间转换,将rawImage 转换到YUV色彩空间,输出到yuvImage // 即使不转换效果依然很好 cvResize(pImage, rawImage, CV_INTER_AREA); yuvImage = cvCloneImage(rawImage); if (i <= 500) // 30帧内进行背景学习 { pColor = (uchar *)(yuvImage->imageData); // 指向yuvImage 图像的通道数据 for (int c=0; c<imageLen; c++) { update_codebook(pColor, cB[c], cbBounds, nChannels); // 对每个像素,调用此函数,捕捉背景中相关变化图像 pColor += 1; // 1 通道图像, 指向下一个像素通道数据 } if (i == 30) // 到30 帧时调用下面函数,删除码本中陈旧的码元 { for (int c=0; c<imageLen; c++) clear_stale_entries(cB[c]); } } else { uchar maskPixelCodeBook; pColor = (uchar *)((yuvImage)->imageData); //3 channel yuv image uchar *pMask = (uchar *)((ImaskCodeBook)->imageData); //1 channel image // 指向ImaskCodeBook 通道数据序列的首元素 for(int c=0; c<imageLen; c++) { maskPixelCodeBook = background_diff(pColor, cB[c], nChannels, minMod, maxMod); // 我看到这儿时豁然开朗,开始理解了codeBook 呵呵 *pMask++ = maskPixelCodeBook; pColor += 1; // pColor 指向的是3通道图像 } } // if (!(rawImage = cvQueryFrame(capture))) // break; cvShowImage("Raw", rawImage); cvShowImage("CodeBook", ImaskCodeBook); if (cvWaitKey(1) == 27) break; if (i == 500) { CString csMessage ; csMessage.Format(_T("训练完毕!")); AfxMessageBox(csMessage); } } /* cvReleaseCapture(&capture);*/ if (yuvImage) cvReleaseImage(&yuvImage); if(ImaskCodeBook) cvReleaseImage(&ImaskCodeBook); cvDestroyAllWindows(); delete [] cB; return ; } ``` 程序运行时的图片 摄像头获取的图片pImage ![](https://img-ask.csdn.net/upload/201509/22/1442907207_225076.png) 建立的背景模型 ![](https://img-ask.csdn.net/upload/201509/22/1442907250_119821.png) 当一只手出现在摄像头前面 ![](https://img-ask.csdn.net/upload/201509/22/1442907289_517152.png)
学校题库一个排序题一直WA
学校一个学生信息排序的题目,然后分成了添加,删除,查找,更改。然后最后一个排序题把前面的都综合起来再加一个排序功能。我前面都是对的,到了排序那题就一直WA。但是测试了好多次都没问题。希望有大神能帮忙看看,谢谢【猴子傻笑】 题目如下 请设计一个简单的学生成绩管理系统,要求系统实现以下功能: 插入一个学生的信息: Insert id name sex year month day x y z, 其中的参数分别为 学号、姓名、性别、出生日期(年、月、日)、三门课的成绩,成绩为浮点数。 List 输出所有学生信息。 查找学生信息: Find id 查找学号为id的学生信息。 Change id newname,newsex,newyear,newmonth,newday,newx,newy,newz 把学号为id的学生信息修改为 newname,newsex,newyear,newmonth,newday,newx,newy,newz(学号保持不变) 删除学生信息 Delete id 删除学号为id的学生信息 按学号从小到大排序  Sort byid 按出生日期从小到大排序 Sort bybirthday 按总成绩从小到大排序  Sort bysum 退出程序: Quit或者Exit 请注意:姓名的长度不超过20。 输入: 输入有多行,每行一条指令,指令格式如下: Insert id name sex year month day x y z 其中的参数分别为学号、姓名、性别、 出生日期(年、月、日)三门课的成绩,成绩为浮点数。 List 输出所有学生信息。 Find id 查找学号为 id 的学生信息。 Change id newname,newsex,newyear,newmonth,newday,newx,newy,newz 把学号为id的学生信息修改为 newname,newsex,newyear,newmonth,newday,newx,newy,newz(学号保持不变) Delete id 删除学号为id的学生信息 Sort byid 按学号从小到大排序并输出 Sort bybirthday 按出生日期从小到大排序 Sort bysum 按总成绩从小到大排序并输出 Quit或者Exit 输出"Good bye!"后结束程序。 输出: 输出有多行,对应命令的输出如下: Insert id name sex year month day x y z 插入后在单独的一行中输出"Insert:", 如果链表中不存在相同学号的学生信息,在第二行中显示学生信息, 格式: id name sex year month day x y z ave sum,分别为学号、姓名、性别、 出生日期(年、月、日)和三门课(语文、数学、英语)的成绩,平均成绩和总成绩, 数据之间用一个空格分开,成绩保留1位小数。 否则,输出"Failed" List 输出"List:"后,按最近一次排序的顺序输出所有学生的信息,格式与插入学生信息后输出的格式相同。 Find id 第一行显示”Find:",第二行显示格式如下: 如果找到学号为id的学生, 则在单独一行中显示学生信息,格式如List。否则在单独一行显示"Failed"。 Change id newname,newsex,newyear,newmonth,newday,newx,newy,newz 第一行显示"Change:"。如果链表中不存在学号为id的学生,显示"Failed"。 否则修改该学生信息并在单独一行中显示该生信息,显示格式如List命令。 Delete id 第一行显示"Delete:"。如果链表中不存在学号为id的学生,显示"Failed"。 否则删除该学生信息并在单独一行中显示"Deleted" Sort byid 按学号从小到大排序并输出 输出格式与List相同 Sort bybirthday 按出生日期从小到大排序 输出格式与List相同 Sort bysum  按总成绩从小到大排序并输出  输出格式与List相同。 Quit或者Exit 在单独一行中输出"Good bye!"后结束程序。 输入样例: Insert 0911001 zhangsan F 1992 3 24 87 78 65 Insert 0911003 Lisi F 1992 5 3 77 72 55 Find 0911002 Find 0911003 Insert 0911001 zhangou M 1992 3 24 98 78 65 Insert 0911002 zhaoliu F 1993 8 8 97 90 55 Change 0911002 zhaoliu M 1990 9 9 90 91 92 Change 0911005 zhaoliu M 1990 9 9 90 91 92 Delete 0911001 Delete 0911006 Insert 0911005 Wangrong F 1990 12 12 68 56 100 Find 0911002 Sort byid Sort bybirthday Sort bysum Quit 输出样例: Insert: 0911001 zhangsan F 1992 3 24 87.0 78.0 65.0 76.7 230.0 Insert: 0911003 Lisi F 1992 5 3 77.0 72.0 55.0 68.0 204.0 Find: Failed Find: 0911003 Lisi F 1992 5 3 77.0 72.0 55.0 68.0 204.0 Insert: Failed Insert: 0911002 zhaoliu F 1993 8 8 97.0 90.0 55.0 80.7 242.0 Change: 0911002 zhaoliu M 1990 9 9 90.0 91.0 92.0 91.0 273.0 Change: Failed Delete: Deleted Delete: Failed Insert: 0911005 Wangrong F 1990 12 12 68.0 56.0 100.0 74.7 224.0 Find: 0911002 zhaoliu M 1990 9 9 90.0 91.0 92.0 91.0 273.0 Sort: 0911002 zhaoliu M 1990 9 9 90.0 91.0 92.0 91.0 273.0 0911003 Lisi F 1992 5 3 77.0 72.0 55.0 68.0 204.0 0911005 Wangrong F 1990 12 12 68.0 56.0 100.0 74.7 224.0 Sort: 0911002 zhaoliu M 1990 9 9 90.0 91.0 92.0 91.0 273.0 0911005 Wangrong F 1990 12 12 68.0 56.0 100.0 74.7 224.0 0911003 Lisi F 1992 5 3 77.0 72.0 55.0 68.0 204.0 Sort: 0911003 Lisi F 1992 5 3 77.0 72.0 55.0 68.0 204.0 0911005 Wangrong F 1990 12 12 68.0 56.0 100.0 74.7 224.0 0911002 zhaoliu M 1990 9 9 90.0 91.0 92.0 91.0 273.0 Good bye! 然后接下来是我写的代码 ``` #include<stdio.h> #include<string.h> struct student{ char id[10]; char name[20]; char sex; int year; int month; int day; double x; double y; double z; double sum_s; double average_s; }; void Solve(); int info_add(struct student *info,int num); int info_find(struct student *info,int num); int info_delete(struct student *info,int num); void info_list(struct student *info,int num); int info_change(struct student *info,int num); void info_sortid(struct student *info,int num); void info_sortbirth(struct student *info,int num); void info_sortsum(struct student *info,int num); int main() { Solve(); return 0; } void Solve() { char head[6]; struct student info[100]; int num=0; while(scanf("%s",&head)&&strcmp(head,"Exit")!=0&&strcmp(head,"Quit")!=0) { getchar(); if(strcmp(head,"Insert")==0) { if(info_add(info,num)==1) { num++; } } else if(strcmp(head,"Find")==0) { info_find(info,num); } else if(strcmp(head,"Delete")==0) { if(info_delete(info,num)==1) { num=num-1; } } else if(strcmp(head,"List")==0) { info_list(info,num); } else if(strcmp(head,"Sort")==0) { char sortch[10]; scanf("%s",&sortch); if(strcmp(sortch,"byid")==0) { info_sortid(info,num); } else if(strcmp(sortch,"bybirthday")==0) { info_sortbirth(info,num); } else if(strcmp(sortch,"bysum")==0) { info_sortsum(info,num); } } else if(strcmp(head,"Change")==0) { info_change(info,num); } } printf("Good bye!\n"); } int info_add(struct student *info,int num) { struct student temp; scanf("%s %s %c %d %d %d %lf %lf %lf",&temp.id,&temp.name,&temp.sex,&temp.year,&temp.month,&temp.day,&temp.x,&temp.y,&temp.z); temp.sum_s=temp.x+temp.y+temp.z; temp.average_s=temp.sum_s/3; for(int i=0;i<num;i++) { if(strcmp(temp.id,info[i].id)==0) { printf("Insert:\nFailed\n"); return 0; } } info[num]=temp; printf("Insert:\n%s %s %c %d %d %d ",temp.id,temp.name,temp.sex,temp.year,temp.month,temp.day); printf("%.1lf %.1lf %.1lf %.1lf %.1lf\n",temp.x,temp.y,temp.z,temp.average_s,temp.sum_s); return 1; } int info_find(struct student *info,int num) { char id[10]; scanf("%s",&id); for(int i=0;i<num;i++) { if(strcmp(id,info[i].id)==0) { printf("Find:\n"); printf("%s %s %c %d %d %d ",info[i].id,info[i].name,info[i].sex,info[i].year,info[i].month,info[i].day); printf("%.1lf %.1lf %.1lf %.1lf %.1lf\n",info[i].x,info[i].y,info[i].z,info[i].average_s,info[i].sum_s); return -1; } } printf("Find:\nFailed\n"); } int info_delete(struct student *info,int num) { char id[10]; scanf("%s",&id); for(int i=0;i<num;i++) { if(strcmp(id,info[i].id)==0) { for(int t=i;t<num;t++) { info[t]=info[t+1]; } printf("Delete:\nDeleted\n"); return 1; } } printf("Delete:\nFailed\n"); return 0; } void info_list(struct student *info,int num) { printf("List:\n"); for(int i=0;i<num;i++) { printf("%s %s %c %d %d %d ",info[i].id,info[i].name,info[i].sex,info[i].year,info[i].month,info[i].day); printf("%.1lf %.1lf %.1lf %.1lf %.1lf\n",info[i].x,info[i].y,info[i].z,info[i].average_s,info[i].sum_s); } } int info_change(struct student *info,int num) { struct student temp; scanf("%s %s %c %d %d %d %lf %lf %lf",&temp.id,&temp.name,&temp.sex,&temp.year,&temp.month,&temp.day,&temp.x,&temp.y,&temp.z); temp.sum_s=temp.x+temp.y+temp.z; temp.average_s=temp.sum_s/3; for(int i=0;i<num;i++) { if(strcmp(temp.id,info[i].id)==0) { info[i]=temp; printf("Change:\n%s %s %c %d %d %d ",temp.id,temp.name,temp.sex,temp.year,temp.month,temp.day); printf("%.1lf %.1lf %.1lf %.1lf %.1lf\n",temp.x,temp.y,temp.z,temp.average_s,temp.sum_s); return -1; } } printf("Change:\nFailed\n"); } void info_sortsum(struct student *info,int num) { struct student temp; for(int i=0;i<num-1;i++) { for(int t=0;t<num-1-i;t++) { if(info[t].sum_s>info[t+1].sum_s) { temp=info[t]; info[t]=info[t+1]; info[t+1]=temp; } } } printf("Sort:\n"); for(int i=0;i<num;i++) { printf("%s %s %c %d %d %d ",info[i].id,info[i].name,info[i].sex,info[i].year,info[i].month,info[i].day); printf("%.1lf %.1lf %.1lf %.1lf %.1lf\n",info[i].x,info[i].y,info[i].z,info[i].average_s,info[i].sum_s); } } void info_sortbirth(struct student *info,int num) { struct student temp; for(int i=0;i<num-1;i++) { for(int t=0;t<num-i-1;t++) { if(info[t].year>info[t+1].year) { temp=info[t]; info[t]=info[t+1]; info[t+1]=temp; } else if(info[t].year==info[t+1].year) { if(info[t].month>info[t+1].month) { temp=info[t]; info[t]=info[t+1]; info[t+1]=temp; } else if(info[t].month==info[t+1].month) { if(info[t].day>info[t+1].day) { temp=info[t]; info[t]=info[t+1]; info[t+1]=temp; } } } } } printf("Sort:\n"); for(int i=0;i<num;i++) { printf("%s %s %c %d %d %d ",info[i].id,info[i].name,info[i].sex,info[i].year,info[i].month,info[i].day); printf("%.1lf %.1lf %.1lf %.1lf %.1lf\n",info[i].x,info[i].y,info[i].z,info[i].average_s,info[i].sum_s); } } void info_sortid(struct student *info,int num) { struct student temp; for(int i=0;i<num-1;i++) { for(int t=0;t<num-1-i;t++) { if(strcmp(info[t].id,info[t+1].id)>0) { temp=info[t]; info[t]=info[t+1]; info[t+1]=temp; } } } printf("Sort:\n"); for(int i=0;i<num;i++) { printf("%s %s %c %d %d %d ",info[i].id,info[i].name,info[i].sex,info[i].year,info[i].month,info[i].day); printf("%.1lf %.1lf %.1lf %.1lf %.1lf\n",info[i].x,info[i].y,info[i].z,info[i].average_s,info[i].sum_s); } } ``` 麻烦各位大神帮忙看看排序的地方有什么错误吗??
ext.Window 第一次打开对话框没问题,第二次,次三.....就不行了
<p><span style="font-weight: bold;">一、表述:</span><br />    使用Ext.grid.GridPanel创建gird对象。grid的最后一列定义为{header: '授权',dataIndex: 'operate1',sortable: true,renderer:authorization},即点击最后一列中的元素将对话框。<br /><span style="font-weight: bold;">二、错误描述</span>:<br />    第一次弹出的对话框没有问题,第一此没有问题,第二,第三。。。。次就有问题了,每多点击一次对话框就会多嵌套一层对话框,对话框不断的嵌套,不知道是怎么回事,  多谢各位高手能指点一二、谢谢了!</p> <pre name="code" class="java">manageMySellerGrid = function(title, id){ //新窗体 showMemerAddWindow = function(){ memberAddWindow = new Ext.Window({ el: 'window_win', layout: 'fit', width: 300, height: 200, closable: true, closeAction: 'hide', plain: true, items: [memberForm] }); //memberAddWindow.show(Ext.get('newWindowButton')); memberAddWindow.show(); } authorization = function(value, cellmeta, record){ if(record.data['userTYpe']==1){ return '<a href="#">授权</a><a>'; }else{ return ''; } } <span style="font-weight: bold;"> authorizationOperate1=function(){ var win = authorizationOperate(); win.show(); } authorizationOperate = function(){ var win = new Ext.Window({ applyTo:'hello-win', layout:'fit', width:500, height:350, closeAction:'hide', closable:true, plain:false, modal:true, title:'测试' // items:new Ext.TabPanel({ // activeTab:0, // border:false, // items:[{title:"tab1",html:"tab1在windows窗口中"},{title:"tab2",html:"tab2在windows窗口中"}] // }) }); return win; }</span> /** * 以下是表单 */ //账号 var idField = new Ext.form.TextField({ fieldLabel: '账号', name: 'memberName', allowBlank: false, anchor: '90%', blankText: '账号不能为空' }); //密码 var passwordField = new Ext.form.TextField({ inputType: 'password', fieldLabel: '密码', name: 'password', allowBlank: false, anchor: '90%', blankText: '密码不能为空' }); //密码确认 var repasswordField = new Ext.form.TextField({ inputType: 'password', fieldLabel: '密码确认', name: 'repassword', allowBlank: false, anchor: '90%', blankText: '确认密码不能为空' }); //电子邮件 var emailField = new Ext.form.TextField({ fieldLabel: '电子邮件', name: 'email', allowBlank: false, anchor: '90%', vtype: 'email', blankText: '电子邮件不能为空' }); //真实姓名 var trueNameField = new Ext.form.TextField({ fieldLabel: '真实姓名', name: 'trueName', allowBlank: false, anchor: '90%', blankText: '真实姓名不能为空' }); var memberForm = new Ext.FormPanel({ monitorValid: true, labelAlign: 'top', frame: true, title: '添加新商户信息', width: 300, url: './userManage.jsp?command=insert&amp;groupid=' + sGroupid, items: [{ layout: 'column',// 该FormPanel的layout布局模式为列模式(column),包含2列 items: [{//第一列 columnWidth: 0.5, layout: 'form', items: [idField, passwordField] }, {//第二列 columnWidth: 0.5, layout: 'form', items: [repasswordField, emailField] }, { columnWidth: 0.5, layout: 'form', items: [trueNameField] }] }], buttons: [{ text: '提交', formBind: true, handler: function(){ if (memberForm.getForm().isValid()) { memberForm.getForm().submit({ method: 'POST', waitMsg: '保存中,请稍后...', success: function(){ memberForm.getForm().reset(); memberAddWindow.hide(); ds.reload(); }, failure: function(){ Ext.Msg.alert('错误', '服务器出现错误请稍后再试!'); } }); } } }, { text: '取消', handler: function(){ memberForm.getForm().reset(); memberAddWindow.hide(); } }] }); //添加标注 addTabOfMerLabel = function(url, title,id){ var mytab = myTabPanel.getItem(id); if(null==mytab){ myTabPanel.add(myGrid(url, title,id)).show(); }else{ myTabPanel.setActiveTab(mytab); } } //查看每个商户的标注 examineLabel = function(value, cellmeta, record, rowIndex, columnIndex, store){ var userId = record.data['id']; var url = '/mapscene/member/merGrid.jsp?userId=' + userId; var title = userId + '的标注'; var str = "<font color="blue"></font></a><font color="blue"><font color="blue"><a style="cursor: pointer;">查看标注</a><font>"; //var str = "<font color="blue"><a style="cursor: pointer;">查看标注</a><font>"; return str; } reader = new Ext.data.JsonReader({ totalProperty: 'totalProperty', root: 'root' }, [ {name: 'id'}, {name: 'email'}, {name: 'trueName'}, {name: 'sex'}, {name: 'password'}, {name: 'telephone'}, {name: 'fax'}, {name: 'company'}, {name: 'mobile'}, {name: 'address'}, {name: 'qq'}, {name: 'msn'}, {name: 'description'}, {name: 'userTYpe'}, {name: 'createDatetime'}, {name: 'operate'}, <span style="font-weight: bold;"> {name: 'operate1'}</span> ] ); var ds = new Ext.data.Store({ proxy: new Ext.data.HttpProxy({ url: '/mapscene/member/seller.jsp' }), reader: reader, baseParams:{userType:null,idOfSearch:null,command:'query'} }); //列模型 var sm = new Ext.grid.CheckboxSelectionModel(); var cm = null; if(i_userType==3){ cm=new Ext.grid.ColumnModel([ new Ext.grid.RowNumberer(), sm, {header: '账号',dataIndex: 'id',sortable: true}, {header: '电子邮件',dataIndex: 'email',sortable: true}, {header: '真实姓名',dataIndex: 'trueName',sortable: true}, {header: '性别',dataIndex: 'sex',sortable: true}, {header: '密码',dataIndex: 'password'}, {header: '电话号码',dataIndex: 'telephone',sortable: true}, {header: '传真',dataIndex: 'fax',sortable: true}, {header: '公司名称',dataIndex: 'company',sortable: true}, {header: '手机号码',dataIndex: 'mobile',sortable: true}, {header: '详细地址',dataIndex: 'address',sortable: true}, {header: 'qq号码',dataIndex: 'qq',sortable: true}, {header: 'msn',dataIndex: 'msn',sortable: true}, {header: '描述',dataIndex: 'description'}, {header: '创建时间',dataIndex: 'createDatetime',sortable: true}, {header: '操作',dataIndex: 'operate',renderer: examineLabel}, <span style="font-weight: bold;"> {header: '授权',dataIndex: 'operate1',sortable: true,renderer:authorization}</span> ]); }else{ cm=new Ext.grid.ColumnModel([ new Ext.grid.RowNumberer(), sm, {header: '账号',dataIndex: 'id',sortable: true}, {header: '电子邮件',dataIndex: 'email',sortable: true}, {header: '真实姓名',dataIndex: 'trueName',sortable: true}, {header: '性别',dataIndex: 'sex',sortable: true}, {header: '密码',dataIndex: 'password'}, {header: '电话号码',dataIndex: 'telephone',sortable: true}, {header: '传真',dataIndex: 'fax',sortable: true}, {header: '公司名称',dataIndex: 'company',sortable: true}, {header: '手机号码',dataIndex: 'mobile',sortable: true}, {header: '详细地址',dataIndex: 'address',sortable: true}, {header: 'qq号码',dataIndex: 'qq',sortable: true}, {header: 'msn',dataIndex: 'msn',sortable: true}, {header: '描述',dataIndex: 'description'}, {header: '创建时间',dataIndex: 'createDatetime',sortable: true}, {header: '操作',dataIndex: 'operate',renderer: examineLabel} ]); } var grid = new Ext.grid.GridPanel({ id: id, closable: true, ds: ds, cm: cm, sm:sm, viewConfig: {forceFit: true}, width: 1000, height: 2000, loadMask: {msg: '正在加载数据,请稍侯……'}, title: title, frame: true, renderTo: 'mylabel', tbar: [{ text: '删除', tooltip: '删除选中的项目', // iconCls:'remove', handler: function(){ var selectedRows = grid.getSelectionModel().getSelections(); var ids = []; for(var i=0;i&lt;selectedrows.length;i++){ var="" item="selectedRows[i].data;" ids.push(item.id);="" }="" if(ids.join('')="=''){Ext.MessageBox.alert('警告'," '必须选择一条记i录,进行删除!');return;}="" ext.messagebox.confirm('提示框',="" '你确定要进行该操作吗?!',="" function(btn){="" if="" (btn="=" 'yes')="" {="" ext.lib.ajax.request(="" 'post',="" 'usermanage.jsp',="" {="" success:="" function(e,="" b){="" var="" message="e.responseText;" ext.msg.alert('信息',="" message);="" ds.load({="" params:="" {="" start:="" 0,="" limit:="" 10="" }="" });="" },="" failure:="" function(){="" ext.msg.alert('错误',="" '删除时出现未知的错误');="" }="" },="" 'command="delete&amp;amp;ids='" +="" ids="" );="" }="" });="" }="" },="" '-',="" {="" id:="" 'newwindowbutton',="" text:="" '新面板中添加',="" iconcls:'user_add',="" handler:="" function(){="" showmemeraddwindow();="" 显示表单所在窗体="" }="" },'-',new="" ext.form.combobox({="" listclass:'x-combo-list-small',="" width:120,="" value:'请选择一种用户类型',="" id:'search-type',="" store:susername="='admin'?" new="" ext.data.simplestore({="" fields:="" ['text'],="" expanddata:="" true,="" data="" :="" ['请选择一种用户类型','普通用户',="" '代理商用户',="" '商户用户']="" }):new="" ext.data.simplestore({="" fields:="" ['text'],="" expanddata:="" true,="" data="" :="" ['请选择一种用户类型',="" '商户用户']="" }),="" displayfield:="" 'text',="" mode:="" 'local',="" forceselection:="" true,="" triggeraction:="" 'all',="" selectonfocus:true="" }),'-',new="" ext.form.textfield({="" fieldlabel:="" '',="" name:="" 'idofsearch',="" anchor:="" '90%'="" }),{="" text:="" '查询',="" tooltip:="" '删除选中的项目',="" handler:="" function(){="" var="" searchtype="Ext.get(&amp;quot;search-type&amp;quot;).getValue();" if(searchtype="='请选择一种用户类型'){" searchtype="null;" }else="" if(searchtype="='普通用户'){" searchtype="0;" }else="" if(searchtype="='代理商用户'){" searchtype="1;" }else="" if(searchtype="='商户用户'){" searchtype="2;" }="" var="" idofsearch="Ext.get(&amp;quot;idOfSearch&amp;quot;).getValue();" ds.baseparams.usertype="searchType;" ds.baseparams.idofsearch="idOfSearch;" if="" (searchtype="" !="null)" {="" ds.baseparams.command="search" ;="" }else{="" ds.baseparams.command="query" ;="" }="" ds.load({="" params:="" {="" start:="" 0,="" limit:="" 10="" }="" });="" }="" },'-'="" ],="" bbar:="" new="" ext.pagingtoolbar({="" pagesize:="" 10,="" store:="" ds,="" displayinfo:="" true,="" displaymsg:="" '显示第="" {0}="" 条到="" {1}="" 条记录,一共="" {2}="" 条',="" emptymsg:="" "没有记录"="" })="" });="" grid.render();="" ds.load({="" params:="" {="" start:="" 0,="" limit:="" 10="" }="" });="" return="" grid;="" }&lt;="" pre=""&gt; <p> </p></font></font></font></font></font></pre>
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
JSON解析——net.sf.json.JSONObject
简介 在程序开发过程中,在参数传递,函数返回值等方面,越来越多的使用JSON。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,同时也易于机器解析和生成、易于理解、阅读和撰写,而且Json采用完全独立于语言的文本格式,这使得Json成为理想的数据交换语言。 JSON建构于两种结构: “名称/值”对的集合(A Collection of name/va...
卸载 x 雷某度!GitHub 标星 1.5w+,从此我只用这款全能高速下载工具!
作者 | Rocky0429 来源 | Python空间 大家好,我是 Rocky0429,一个喜欢在网上收集各种资源的蒟蒻… 网上资源眼花缭乱,下载的方式也同样千奇百怪,比如 BT 下载,磁力链接,网盘资源等等等等,下个资源可真不容易,不一样的方式要用不同的下载软件,因此某比较有名的 x 雷和某度网盘成了我经常使用的工具。 作为一个没有钱的穷鬼,某度网盘几十 kb 的下载速度让我...
2019年还剩1天,我从外包公司离职了
这日子过的可真快啊,2019年还剩1天,外包公司干了不到3个月,我离职了
我一个37岁的程序员朋友
周末了,人一旦没有点事情干,心里就瞎想,而且跟几个老男人坐在一起,更容易瞎想,我自己现在也是 30 岁了,也是无时无刻在担心自己的职业生涯,担心丢掉工作没有收入,担心身体机能下降,担心突...
计算机网络的核心概念
这是《计算机网络》系列文章的第二篇文章 我们第一篇文章讲述了计算机网络的基本概念,互联网的基本名词,什么是协议以及几种接入网以及网络传输的物理媒体,那么本篇文章我们来探讨一下网络核心、交换网络、时延、丢包、吞吐量以及计算机网络的协议层次和网络攻击。 网络核心 网络的核心是由因特网端系统和链路构成的网状网络,下面这幅图正确的表达了这一点 那么在不同的 ISP 和本地以及家庭网络是如何交换信息的呢?...
python自动下载图片
近日闲来无事,总有一种无形的力量萦绕在朕身边,让朕精神涣散,昏昏欲睡。 可是,像朕这么有职业操守的社畜怎么能在上班期间睡瞌睡呢,我不禁陷入了沉思。。。。 突然旁边的IOS同事问:‘嘿,兄弟,我发现一个网站的图片很有意思啊,能不能帮我保存下来提升我的开发灵感?’ 作为一个坚强的社畜怎么能说自己不行呢,当时朕就不假思索的答应:‘oh, It’s simple. Wait for me for a ...
一名大专同学的四个问题
【前言】   收到一封来信,赶上各种事情拖了几日,利用今天要放下工作的时机,做个回复。   2020年到了,就以这一封信,作为开年标志吧。 【正文】   您好,我是一名现在有很多困惑的大二学生。有一些问题想要向您请教。   先说一下我的基本情况,高考失利,不想复读,来到广州一所大专读计算机应用技术专业。学校是偏艺术类的,计算机专业没有实验室更不用说工作室了。而且学校的学风也不好。但我很想在计算机领...
复习一周,京东+百度一面,不小心都拿了Offer
京东和百度一面都问了啥,面试官百般刁难,可惜我全会。
Java 14 都快来了,为什么还有这么多人固守Java 8?
从Java 9开始,Java版本的发布就让人眼花缭乱了。每隔6个月,都会冒出一个新版本出来,Java 10 , Java 11, Java 12, Java 13, 到2020年3月份,...
达摩院十大科技趋势发布:2020 非同小可!
【CSDN编者按】1月2日,阿里巴巴发布《达摩院2020十大科技趋势》,十大科技趋势分别是:人工智能从感知智能向认知智能演进;计算存储一体化突破AI算力瓶颈;工业互联网的超融合;机器间大规模协作成为可能;模块化降低芯片设计门槛;规模化生产级区块链应用将走入大众;量子计算进入攻坚期;新材料推动半导体器件革新;保护数据隐私的AI技术将加速落地;云成为IT技术创新的中心 。 新的画卷,正在徐徐展开。...
轻松搭建基于 SpringBoot + Vue 的 Web 商城应用
首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。Fun: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算、API ...
讲真,这两个IDE插件,可以让你写出质量杠杠的代码
周末躺在床上看《拯救大兵瑞恩》 周末在闲逛的时候,发现了两个优秀的 IDE 插件,据说可以提高代码的质量,我就安装了一下,试了试以后发现,确实很不错,就推荐给大家。 01、Alibaba Java 代码规范插件 《阿里巴巴 Java 开发手册》,相信大家都不会感到陌生,其 IDEA 插件的下载次数据说达到了 80 万次,我今天又贡献了一次。嘿嘿。 该项目的插件地址: https://github....
Python+OpenCV实时图像处理
目录 1、导入库文件 2、设计GUI 3、调用摄像头 4、实时图像处理 4.1、阈值二值化 4.2、边缘检测 4.3、轮廓检测 4.4、高斯滤波 4.5、色彩转换 4.6、调节对比度 5、退出系统 初学OpenCV图像处理的小伙伴肯定对什么高斯函数、滤波处理、阈值二值化等特性非常头疼,这里给各位分享一个小项目,可通过摄像头实时动态查看各类图像处理的特点,也可对各位调参、测试...
2020年一线城市程序员工资大调查
人才需求 一线城市共发布岗位38115个,招聘120827人。 其中 beijing 22805 guangzhou 25081 shanghai 39614 shenzhen 33327 工资分布 2020年中国一线城市程序员的平均工资为16285元,工资中位数为14583元,其中95%的人的工资位于5000到20000元之间。 和往年数据比较: yea...
为什么猝死的都是程序员,基本上不见产品经理猝死呢?
相信大家时不时听到程序员猝死的消息,但是基本上听不到产品经理猝死的消息,这是为什么呢? 我们先百度搜一下:程序员猝死,出现将近700多万条搜索结果: 搜索一下:产品经理猝死,只有400万条的搜索结果,从搜索结果数量上来看,程序员猝死的搜索结果就比产品经理猝死的搜索结果高了一倍,而且从下图可以看到,首页里面的五条搜索结果,其实只有两条才是符合条件。 所以程序员猝死的概率真的比产品经理大,并不是错...
害怕面试被问HashMap?这一篇就搞定了!
声明:本文以jdk1.8为主! 搞定HashMap 作为一个Java从业者,面试的时候肯定会被问到过HashMap,因为对于HashMap来说,可以说是Java集合中的精髓了,如果你觉得自己对它掌握的还不够好,我想今天这篇文章会非常适合你,至少,看了今天这篇文章,以后不怕面试被问HashMap了 其实在我学习HashMap的过程中,我个人觉得HashMap还是挺复杂的,如果真的想把它搞得明明白...
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
程序员如何通过造轮子走向人生巅峰?
前言:你所做的事情,也许暂时看不到成果。但不要灰心,你不是没有成长,而是在扎根。 程序员圈经常流行的一句话:“不要重复造轮子”。在计算机领域,我们将封装好的组件、库,叫做轮子。因为它可以拿来直接用,直接塞进我们的项目中,就能实现对应的功能。 有些同学会问,人家都已经做好了,你再来重新弄一遍,有什么意义?这不是在浪费时间吗。 殊不知,造轮子是一种学习方式,能快速进步,造得好,是自己超强能力的表...
推荐10个堪称神器的学习网站
每天都会收到很多读者的私信,问我:“二哥,有什么推荐的学习网站吗?最近很浮躁,手头的一些网站都看烦了,想看看二哥这里有什么新鲜货。” 今天一早做了个恶梦,梦到被老板辞退了。虽然说在我们公司,只有我辞退老板的份,没有老板辞退我这一说,但是还是被吓得 4 点多都起来了。(主要是因为我掌握着公司所有的核心源码,哈哈哈) 既然 4 点多起来,就得好好利用起来。于是我就挑选了 10 个堪称神器的学习网站,推...
这些软件太强了,Windows必装!尤其程序员!
Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享给大家,如果有一个你没有用过甚至没有听过,那你就赚了????,这可都是提升你幸福感的高效率生产力工具哦! 走起!???? NO、1 ScreenToGif 屏幕,摄像头和白板...
阿里面试一个ArrayList我都能跟面试官扯半小时
我是真的没想到,面试官会这样问我ArrayList。
曾经优秀的人,怎么就突然不优秀了。
职场上有很多辛酸事,很多合伙人出局的故事,很多技术骨干被裁员的故事。说来模板都类似,曾经是名校毕业,曾经是优秀员工,曾经被领导表扬,曾经业绩突出,然而突然有一天,因为种种原因,被裁员了,...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
良心推荐,我珍藏的一些Chrome插件
上次搬家的时候,发了一个朋友圈,附带的照片中不小心暴露了自己的 Chrome 浏览器插件之多,于是就有小伙伴评论说分享一下我觉得还不错的浏览器插件。 我下面就把我日常工作和学习中经常用到的一些 Chrome 浏览器插件分享给大家,随便一个都能提高你的“生活品质”和工作效率。 Markdown Here Markdown Here 可以让你更愉快的写邮件,由于支持 Markdown 直接转电子邮...
看完这篇HTTP,跟面试官扯皮就没问题了
我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。 最初在有网络之前,我们的电脑都是单机的,单机系统是孤立的,我还记得 05 年前那会儿家里有个电脑,想打电脑游戏还得两个人在一个电脑上玩儿,及其不方便。我就想为什么家里人不让上网,我的同学 xxx 家里有网,每...
史上最全的IDEA快捷键总结
现在Idea成了主流开发工具,这篇博客对其使用的快捷键做了总结,希望对大家的开发工作有所帮助。
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
谁是华为扫地僧?
是的,华为也有扫地僧!2020年2月11-12日,“养在深闺人不知”的华为2012实验室扫地僧们,将在华为开发者大会2020(Cloud)上,和大家见面。到时,你可以和扫地僧们,吃一个洋...
Idea 中最常用的10款插件(提高开发效率),一定要学会使用!
学习使用一些插件,可以提高开发效率。对于我们开发人员很有帮助。这篇博客介绍了开发中使用的插件。
AI 没让人类失业,搞 AI 的人先失业了
最近和几个 AI 领域的大佬闲聊 根据他们讲的消息和段子 改编出下面这个故事 如有雷同 都是巧合 1. 老王创业失败,被限制高消费 “这里写我跑路的消息实在太夸张了。” 王葱葱哼笑一下,把消息分享给群里。 阿杰也看了消息,笑了笑。在座几位也都笑了。 王葱葱是个有名的人物,21岁那年以全额奖学金进入 KMU 攻读人工智能博士,累计发表论文 40 余篇,个人技术博客更是成为深度学习领域内风向标。 ...
立即提问