java数据引擎(四):详细使用
2015-04-23 21:04
134 查看
A.修改
a.传递单条记录进行更新
以上的更新操作必需带主键,即最后是主键为条件进行的更新,如果要进行灵活多样的条件更新,需要使用Param类。
关于Param的各种条件构成,可参考前文的Param详解。
使用实体对象时,不能将字段更新为null,使用map对象则可以。
b.传递多条记录进行更新
也叫批量更新,参数为list,其每个元素是同质的,并且含主键属性,元素可以是map对象,也可以是实体对象。注意:当实体对象操作时,如果实体属性是java的基本数据类型,会影响到更新结果,例如,int的属性,即使不给赋值,也会取默认值0,所有建议使用Integer,这个特性在其它orm框架中也是存在的。
c.含表达式的更新
有一种更新采用上述方式是实现不了的,例如将符合条件的员工的工资都涨10%,因为每个人的涨幅不一样,这时需要使用前面提到的DataMap对象。
其它表达式示例:
//将工资改为原来的10%,不是涨,是降了90%,以下两句等效:
map.setExp("salary","salary*0.1");
map.setExp("salary","salary","*",0.1);
//将note的值加上后缀_sufix,针对oracle, ||是连字符操作
map.setExp("note","note","||","_sufix");
//将字段field1的值更新为field2+field3,字段类型都是字符型
map.setExp("field1","field2||field3");
//将字段field1的值更新为field2和field3相加再除以10,字段类型都是数字型
map.setExp("field1","field2+field3",”/”,10);
//将age减去10后,再乘以2,这是个无意义的操作啊。
map.setExp("age","(age-10)*2");
有时一个对象不确定是需要插入、还是修改,可以调用以下方法,让引擎自动操作:
exeInsertOrUpdate(“表名”,object);
B. 删除
可以传递单个对象进行删除,也可以传递多个对象批量删除,还可以直接传递主键进行删除,当然,更灵活的是使用Param类构建删除条件进行操作。
C. 聚集运算
这是进行sum、count等操作,例如,如果按name分组,对student表的age求总和,对name统计总数,可以这样调用:
其中参数colTypeMap,指定运算字段,是运算列与运算类型的键值对,运算类型的取值有sum,avg,count,max,min等,可以一次查询多个类型,如果类型仅仅是count,用getRecordCount方法更方便。参数groupby是用于分组的列,多列以英文逗号分隔,计算max,min时,本参数为空。返回值是包含结果的Map列表,Map的key为指定的字段,value为统计值。
上面的调用生成的sql为:
select sum(age) age,count(name) count_name from
student group by name
如果有条件限制,并且要显示出是哪个name的统计值,调用如下:
上面的调用生成的sql为:
select name, sum(age) age, count(name) count_name from
student where (age >=100) group byname
对于求max和min值,有更简便的方法:
int max=DataCenter.calculateMax("student","age", pm);//统计字段age的最大值
int min=DataCenter.calculateMin("student","age", pm);// 统计字段age的最小值
pm是Param对象,构建方式参考上文。
生成的sql类似:select max(age) age from student where …
a.传递单条记录进行更新
//将sid为1的记录的name值修改为‘张三峰’ //以map对象方式操作 Map record=new HashMap(); record.put(“name”, “张三峰”); record.put(“sid”, 1); int c=DataCenter.exeUpdate(“student”, record);//执行修改 //以实体对象方式操作 Student st=new Student(); st.setName(“张三峰”); st.setSid(1); int c=DataCenter.exeUpdate(“student”, st); |
//将sid为1的记录的name值修改为‘张三峰’,所在班级修改为6班 //以map对象方式操作 Map record=new HashMap(); record.put(“name”, “张三峰”); record.put(“class_id”, 6); int c=DataCenter.exeUpdate(“student”, record,new Param(“sid”,1));//执行修改 //以实体对象方式操作 Student st=new Student(); st.setName(“张三峰”); st.setClassId(6); int c=DataCenter.exeUpdate(“student”,st,new Param(“sid”,1)); 返回值c表示影响的记录数,如果Param不是以主键作条件,返回值就可能大于1. //将age大于等于20并且是5班的所有学员划为8班 Student st=new Student(); st.setClassId(8); Param pm= new Param(); pm.add(“class_id”,5).add(“age”,”>=”,20); int c=DataCenter.exeUpdate(“student”,st,pm); |
使用实体对象时,不能将字段更新为null,使用map对象则可以。
b.传递多条记录进行更新
也叫批量更新,参数为list,其每个元素是同质的,并且含主键属性,元素可以是map对象,也可以是实体对象。注意:当实体对象操作时,如果实体属性是java的基本数据类型,会影响到更新结果,例如,int的属性,即使不给赋值,也会取默认值0,所有建议使用Integer,这个特性在其它orm框架中也是存在的。
List lis=new ArrayList(); Map record=new HashMap(); record.put(“name”, “张三峰”); record.put(“sid”, 1); list.add(record); record=new HashMap(); record.put(“name”, “李四谷”); record.put(“sid”, 2); list.add(record); int c=DataCenter.exeUpdateBatch(“student”,list); //执行后,将主键为1的记录name修改张三峰,主键为2的name修改为李四谷,c===2 |
有一种更新采用上述方式是实现不了的,例如将符合条件的员工的工资都涨10%,因为每个人的涨幅不一样,这时需要使用前面提到的DataMap对象。
//将工资都涨10% DataMap map=new DataMap(); map.setExp("salary", "salary+salary*0.1"); int c=DataCenter.exeUpdate("employee",map,new Param()); //将工龄大于10年的员工工资涨10% int c=DataCenter.exeUpdate("employee",map,new Param(“year”,”>”,10)); |
//将工资改为原来的10%,不是涨,是降了90%,以下两句等效:
map.setExp("salary","salary*0.1");
map.setExp("salary","salary","*",0.1);
//将note的值加上后缀_sufix,针对oracle, ||是连字符操作
map.setExp("note","note","||","_sufix");
//将字段field1的值更新为field2+field3,字段类型都是字符型
map.setExp("field1","field2||field3");
//将字段field1的值更新为field2和field3相加再除以10,字段类型都是数字型
map.setExp("field1","field2+field3",”/”,10);
//将age减去10后,再乘以2,这是个无意义的操作啊。
map.setExp("age","(age-10)*2");
有时一个对象不确定是需要插入、还是修改,可以调用以下方法,让引擎自动操作:
exeInsertOrUpdate(“表名”,object);
B. 删除
可以传递单个对象进行删除,也可以传递多个对象批量删除,还可以直接传递主键进行删除,当然,更灵活的是使用Param类构建删除条件进行操作。
//删除student的全部记录,true表示能回滚,false不能回滚,但速度快 boolean flag=DataCenter.exeDelete(“student”,true); //以map对象或实体对象作条件删除记录,条件对象必需含主键 Map obj=new HashMap(); obj.put(“sid”,20); //Student obj=new Student(); //obj.setSid(20); int c= DataCenter.exeDelete(“student”,obj);//删除sid为20的记录 //删除符合条件的所有记录 int c= DataCenter.exeDelete(“student”,pm);//pm为Param对象,构建方式参见前文 //直接传递主键值进行删除,单主键表 int c= DataCenter .exeDeleteByKey(“student”,20); //根据多个对象删除记录,对象可以是map或实体对象,放在list中,如果包含主键属性,则按主键删除,否则按其它属性组成的条件删除 List list=new ArrayList(); Student obj=new Student(); obj.setSid(20); list.add(obj); … int c= DataCenter .exeDeleteBatch(“student”,list); |
C. 聚集运算
这是进行sum、count等操作,例如,如果按name分组,对student表的age求总和,对name统计总数,可以这样调用:
Map colTypeMap = new HashMap(); colTypeMap.put("name", "count"); colTypeMap.put("age", "sum"); String[] groupby = new String[] { "name" }; List<Map<String, Object>> res = DataCenter.calculate("student", colTypeMap, groupby); Integer age_t=res.get(0).get(“age”);//获取结果中的age统计数 Integer name_t=res.get(0).get(“count_name”);//获取结果中的name统计数 |
上面的调用生成的sql为:
select sum(age) age,count(name) count_name from
student group by name
如果有条件限制,并且要显示出是哪个name的统计值,调用如下:
Map colTypeMap = new HashMap(); colTypeMap.put("name", "count"); colTypeMap.put("age", "sum"); String[] groupby = new String[] { "name" }; Param pm = new Param(); pm.addField("name"); pm.add("age", ">=", 20); List<Map<String, Object>> res = DataCenter.calculate("student", colTypeMap, groupby,pm); |
select name, sum(age) age, count(name) count_name from
student where (age >=100) group byname
对于求max和min值,有更简便的方法:
int max=DataCenter.calculateMax("student","age", pm);//统计字段age的最大值
int min=DataCenter.calculateMin("student","age", pm);// 统计字段age的最小值
pm是Param对象,构建方式参考上文。
生成的sql类似:select max(age) age from student where …
相关文章推荐
- java数据引擎(二):详细使用
- java数据引擎(三):详细使用
- [Sqlite]-->Java使用jdbc连接Sqlite数据库进行各种数据操作的详细过程
- CSDN Androidclient开展(两):基于如何详细解释Java使用Jsoup爬行动物HTML数据
- Sqoop-1.4.6 mysql数据导出到HDFS提示;注: java使用或覆盖了已过时的 API。关详细信息, 请使用 -Xlint:deprecation 重新编译。
- java使用dbcp连接池实现jdbc动态新增,修改,删除,切换数据库源
- iOS开发中使用FMDB解决数据存储问题---(写的比较详细,仔细看,有很大的参考价值)
- 使用java抓取网页的数据
- 使用jmap和MAT观察Java程序内存数据
- java31.JSON操作------使用Java读取、创建JSON数据
- java对象和json数据转换实现方式3-使用jackson实现
- JavaEE Tutorials (13) - 使用锁定控制对实体数据的并发访问
- 大数据IMF传奇 第19课 spark 二次排序 使用JAVA自定义key 进行二次排序
- JAVA JXL API的详细使用
- java网络编程(一)使用TCP协议完成客户端与服务端的数据传递
- Java中使用Oracle的客户端 load data和sqlldr命令执行数据导入到数据库中
- 使用scala,java实现使用phenix读取hbase中数据
- java、js之间使用AES加密通信数据
- Java程序员使用的20几个大数据工具
- java32.HTTP通信------使用Http的Get方式读取网络数据