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

来源:互联网 发布:nba2k13捏脸详细数据 编辑:程序博客网 时间:2024/05/22 15:51

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修改张三峰,主键为2name修改为李四谷,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 =newHashMap();

       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列表,Mapkey为指定的字段,value为统计值。

上面的调用生成的sql为:

select sum(age) age,count(name) count_name from student group by name

如果有条件限制,并且要显示出是哪个name的统计值,调用如下:

Map colTypeMap =newHashMap();

       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 …

0 0
原创粉丝点击