数据引擎的数据操作大体可分为两大类,一个是直接面对表的操作,一个是面对配置SQL的操作,两者可共存,根据方便程度及业务复杂度,可灵活选择。
当需要访问的对象只涉及一张表时,就属于单表操作。数据引擎使用两种对象进行表的自动映射,即Map对象和实体对象。当使用Map时,是将库表的字段及值映射为map的key-value;当使用实体对象时,将关系表映射为实体,这与hibernate一致,表字段名如果含下划线分隔符,实体属性将转为驼峰形式。两者性能上基本接近。使用Map时,代码量更少,Map的key完全与库表字段同名,统一使用小写形式,value类型为Object,在get时,根据数据类型转型为具体类型。
a.插入单条记录
上面快速入门中,增加记录时,没有涉及大对象字段。对于二进制字段可以采用以下方式,对于Clob字段,只要将获取的数据转为字符串即可。
//以map对象方式插入带图片的记录 File file = new File(“E:\\照片\\手机拍\\IMG135.jpg”); InputStream is = new FileInputStream(file); byte[] data=newbyte[(int)file.length()]; is.read(data); Map record=new HashMap(); record.put(“name”, “王五”); record.put(“photo”, data); DataCenter.exeInsert(“student”, record);//执行插入 //获取新生成的主键值,注意record在put时并没有涉及主键sid, //这是引擎自动完成的 Integersid=(Integer)record.get(“sid”);
//以实体对象方式插入 Student st=new Student(); st.setName(“赵六”); st.setPhoto(data); DataCenter.exeInsert(“student”, st); Integer sid = st.getSid();//获取新生成的主键值 |
b.插入主从关联记录
有时候,在保存一条主记录时,需要连带保存从记录,引擎只需将从记录的实体对象放到主实体即可。假设一种场景,有order表、order_detail表、order_goods表,主表order的每条记录都对应一条详细记录,同时,一个order可能买了多个商品,对应order_goods多条记录(当然,实际更可能只有一个从表,这里是为了说明的方便)。
实体Order的属性如下:
privateLong oid;//主键属性
privateString name;
privateOrderDetail orderDetail;// 关联属性
privateList<OrderGoods> orderGoodsList;//关联属性
Order order=new Order();//主记录 order.setOid(100L); order.setName(“订单名”);
OrderDetail orderDetail=new OrderDetail(); orderDetail.setOid(100L);//订单详细也有一个oid,通过它与主表关联,因此值与上相同 orderDetail.setXXX(..);//设置其它属性值 order.setOrderDetail(orderDetail);//关联上
OrderGoods gd1=new OrderGoods(); gd1.setOid(100L);//oid关联键,order_goods字段名称不一定要是oid,只要关联上就行 gd1.setXXX(..);//其它属性 OrderGoods gd2=new OrderGoods(); gd2.setOid(100L); gd2.setXXX(..);//其它属性
OrderGoods gd3=new OrderGoods(); gd3.setOid(100L); gd3.setXXX(..);//其它属性
List list=new ArryList(); list.add(gd1); list.add(gd2); list.add(gd3);
order.setOrderGoodsList(list);//这个订单有三个商品 int c=DataCenter.exeInsert(“order”, order);//保存,返回值c==5 |
c.批量插入记录
List list=new ArrayList(); for(int i=1;i<10;i++){ Student s=new Student(); s.setSid(Long.valueOf(i)); s.setName(“name_”+i); list.add(s); } int c=DataCenter.exeInsertBatch(“student”, list);//执行插入 //在上面,list的元素是实体对象,也可以用Map对象,调用操作完全一样,这里就不重复了。 |
d.插入带序列的记录
对于oracle,当建有序列时,怎么获取呢?这需要用到特殊的参数类DataMap,它就是一个Map类,可完全代替普通map对象,它可设置序列。如果插入一个实体对象,则无法取得序列了。
假如student的主键sid配置了序列seq_sid。
DataMap map = new DataMap(); map.putSequence("sid", "seq_sid.nextval");//关键这步 map.put("name", "zhangsan"); int c = DataCenter.exeInsert("student", map);//执行插入 int sid=(Integer) map.get("sid");//获取序列值 |