工作笔记系列-学习的零零碎碎的技术
1.使用sqlQuery的时候:
sqlQuery.addEntity(实体类.class).list(); //在使用sqlQuery.list()之前使用addEntity可以将查询出来的数据自动转化给我们添加的实体类对象
List<实体类> dbLiist=sqlQuery.addEntity(实体类).list(); //这样dbList 就成为了实体类对象的集合
这是高效遍历map集合的:
Map<String,GpsVehicle> plates=new HashMap<String,GpsVehicle>();
Set<Entry<String, GpsVehicle>> set=plates.entrySet();
Iterator<Entry<String, GpsVehicle>> i= set.iterator();
while(i.hasNext()){
Entry<String, GpsVehicle> entity=i.next(); //获取map当前条数
entity.getKey(); //获取当前条的key
entity.getValue(); //获取当前条的value
}
对于sql的in 和 exists
我们先讨论IN和EXISTS。
select * from t1 where x in ( select y from t2 )
事实上可以理解为:
select *
from t1, ( select distinct y from t2 ) t2
where t1.x = t2.y;
——如果你有一定的SQL优化经验,从这句很自然的可以想到t2绝对不能是个大表,因为需要对t2进行全表的“唯一排序”,如果t2很大这个排序的性能是不可忍受的。但是t1可以很大, 为什么呢?最通俗的理解就是因为t1.x=t2.y可以走索引。但这并不是一个很好的解释。试想,如果t1.x和t2.y都有索引,我们知道索引是种有序的结构,
因此t1和t2之间最佳的方案是走 merge join。另外,如果t2.y上有索引,对t2的排序性能也有很大提高。
select * from t1 where exists ( select null from t2 where y = x )
可以理解为:
for x in ( select * from t1 )
loop
if ( exists ( select null from t2 where y = x.x )
then
OUTPUT THE RECORD!
end if
end loop
——这个更容易理解,t1永远是个表扫描!因此t1绝对不能是个大表,而t2可以很大,因为y=x.x可以走t2.y的索引。
综合以上对IN/EXISTS的讨论,我们可以得出一个基本通用的结论:IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。
而not in 在任何情况下 都比不上 not exists
在开发webService时:
前台页面使用flex进行参数传递,传递过来的参数的属性一定设置为private 否则报错
前台Flex设置图片的时候,再次请求地址会无法更换图片,因为Flex会根据URL读取图片缓存:
为了方便使用,当时设置写入图片的时候名字统一为 Logo.jpg 所以URL是没有变化的 。
现在更改为 图片就使用原名称 这样更改图片后url会改变. 达到了不读取缓存的效果
在oracle中使用connect by prior start with进行递归查询
语法:select * from sys_company connect by prior company_id=parent_company start with company_id='1'
分析:查询sys_company 从company_id='1' 开始查询 于是获得到company_id='1' 的这条数据的company_id 其实这里是把查询条件和递归条件用在了一起
也可以这样
select * from sys_company connect by prior company_id=parent_company start with company_name='运输企业'
分析:查询sys_company 从company_Name='运输企业' 开始查询 于是获得到了company_name='运输企业' 这条数据
① 紧接着拿取这条数据的company_id
② 紧接着:查询出所有parent_company等于刚才查询出的company_id的数据.
③ 这些数据可能会有很多条 ,那么一条一条的解析:
④ 从第一条开始:这里返回①
一直跑到没有company_id=parent_company就到了尽头
使用criteria查询的时候 使用到in
c.add(restrictions.in("aaa",new List()))
在这里如果list为空或者size为零的话 那么会报一个确实表达式的错误
转换就成了 sql select * from gps_vehicle where vehicle.vehicle_id in () 所以报缺失表达式的错误
在使用对象的时候 尽量在使用的时候再进行new操作 不要一声明下来就new
在使用arrayList的时候 最好是能够指定长度为最好 比如分页读取数据库的时候 长度肯定就是size那么长 直接指定长度就好了
使用双重循环的时候:使用下列方法可以一次终止两个循环
label1: //没错 你没有看错 就是冒号结尾
for (int i = 0; i < 100; i++) {
System.out.println("i是:"+i);
for (int j = 0; j < 5; j++) {
System.out.println("j是:"+j);
if(i==22){
break label1;
}
}
}
在使用thrift的时候 ,直接使用impl进行了数据库的操作,那么这个时候,我们需要给这个impl加上@Transactional(readOnly=true) 者 @Transactional(readOnly=false)。不然hibernate会报 不在安全的会话中操作数据库
在工作中遇到一个问题 给设置时间的时候:
user.setLoginTime(new Date());
或者
user.setLoginTime(Calendar.getInstance().getTime());
报错:
最后原因:使用的mySql5.6 而开发的时候使用并不是5.6
而mySql5.6的升级是对date类型进行了调整,所以保存的时候报错
解决方案:
降低mySql版本到开发版本,或者更换支持mySql5.6的jar包
在我们页面和dao层交互的时候
页面对象(Action对象) 和 dao层的持久化对象(entity)
比如修改一个对象或者创建一个对象,那么我们需要大量的从页面赋值给entity对象
我们可以使用spring的
BeanUtils.copyProperties(Action对象,entity);
使用myEclipse的时候,有时我们会手动修改文件。比如使用editPlus进行修改,这时候再使用myEclipse的时候,我们要先将项目进行refresh(F5)再使用。不然可能会引起一些不好麻烦。