您的位置:首页 > 编程语言 > Java开发

java数据引擎(四):详细使用

2015-04-23 21:04 134 查看
A.修改

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);
 

以上的更新操作必需带主键,即最后是主键为条件进行的更新,如果要进行灵活多样的条件更新,需要使用Param类。

//将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);
 

关于Param的各种条件构成,可参考前文的Param详解。

使用实体对象时,不能将字段更新为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

c.含表达式的更新

         有一种更新采用上述方式是实现不了的,例如将符合条件的员工的工资都涨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统计数

 

其中参数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的统计值,调用如下:

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);

 

上面的调用生成的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 …
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: