sqltoy-orm 增删改和load操作介绍

上一篇sqltoy-orm 最佳查询介绍:http://zhongxuchen.iteye.com/blog/2375088

 

一直想介绍一下sqltoy-orm的常规的增删改和对象加载操作,却每次因为太忙或总感觉增删改太过于常规没有了动力。但正因为此导致很多人常常会问:sqltoy-orm 是不是只是查询比较不错?哪怕我每次都强调我玩了很久的hibernate。潜台词就是早已经吸收了hibernate的长处也知道其不足!但主要是优势没有查询那么凸显就没有必要过多强调。

        在介绍对象操作之前,首先要强调一下sqltoy-orm是包含一个quickvo这样的工具的,可以帮助你从数据库通过表产生POJO对象(级联关系也是有的,主键策略也是多样的)。对象跟数据库的关系是通过annotation注解自动标注的(开源项目文档和showcase中有范例),quickvo相对于hibernate-tools 最大的优点是每次数据库变更重新生成VO不会覆盖掉你之前对VO的修改,同时VO的生成策略完全可以通过quickvo.xml中进行声明,不同于hibernate有时候还需要修改POJO的注解(重新生成又要改一次)。

       言归正传,开始介绍Sqltoy-ORM 对象操作(参见org.sagacity.sqltoy.support.SqlToyDaoSupport):

  • 对象加载:
  1. load单个对象加载包含:load(final Serializable entity);load(final Serializable entity, final LockMode lockMode)、load(entity,lockMode,dataSource)三个方法。
  2. loadCascade级联加载:loadCascade(Serializable entity, LockMode lockMode)和loadCascade(Serializable entity, Class[] cascadeTypes, LockMode lockMode)两种查询,考虑性能和灵活性sqltoy将级联加载跟对象自身加载分离开来,同时可以指定级联加载的子对象进行精确加载,避免没有必要的性能消耗。
  3. loadAll批量集合加载:loadAll(final List<?> entities, final LockMode lockMode) 进行对象批量加载。loadAll的效率其实要比hibernate的要高,sqltoy是通过批量查询来实现的。
  4. loadAllCascade批量级联加载:loadAllCascade(final List<?> entities, final Class[] cascadeTypes, final LockMode lockMode);批量级联加载sqltoy全部采用了批量查询方式,不同于hibernate循环集合通过单个对象进行级联加载,效率得到了很大提升。
  • 对象增加save操作:save对象会连同子表对象进行级联保存。
  1. 单个对象保存并返回主键值:Object save(final Serializable entity) 或save(final Serializable entity, final DataSource dataSource):指定数据源保存对象。
  2. 批量保存:saveAll(final List<?> entities)或:saveAll(entities,reflectPropertyHandler,dataSource)。
  3. 批量保存忽视已经存在的:saveAllNotExist(final List<?> entities)。
  • 对象修改update操作:sqltoy的update操作是非常有特色的,完全屏蔽了hibernate的缺陷考虑到了实际业务场景的需要。
  1. update(Serializable entity):自动只修改entity对象不为null的属性(场景:工单处理,各个环节只修改部分字段),从而避免对数据库中其他字段的修改。(相对于hibernate则必须先load然后再update才能实现此逻辑,减少了一次查询从而提升了性能)
  2. updateDeeply(final Serializable entity):深度修改,entity对象属性无论是null还是非null一律修改到数据库表对应字段中。
  3. update(final Serializable entity, final String[] forceUpdateProps):修改对象,并指定哪些属性为强制修改字段。相对于1和2,做到了一些平衡和补充。结合使用非常贴切项目的各种场景。
  4. updateAll(final List<?> entities) ,批量修改:以第一条记录的非null的值为依据进行批量修改。
  5. updateAll(final List<?> entities, final String[] forceUpdateProps),指定字段进行批量强制修改。
  6. updateAllDeeply(final List<?> entities, final ReflectPropertyHandler reflectPropertyHandler),批量深度修改。
  7. updateCascade(final Serializable entity, final String[] forceUpdateProps,final Class[] forceCascadeClasses, final HashMap<Class, String[]> subTableForceUpdateProps),级联修改,可以指定需要级联修改的子表和子表需要强制修改的属性。
  • 保存或修改saveOrUpdate操作:底层基于不同数据库方言如:merge into 或insert ON DUPLICATE KEY UPDATE  机制,极大的提升了性能。
  1. saveOrUpdate(final Serializable entity):对象保存或修改(已经存在则修改)
  2. saveOrUpdate(final Serializable entity, final String[] forceUpdateProps):保存或修改(针对修改指定哪些字段为强制修改),相对hibernate或mybatis则更加灵活,给开发者带来了更多的选择。
  3. saveOrUpdateAll(final List<?> entities)、saveOrUpdateAll(final List<?> entities, final String[] forceUpdateProps) :批量保存或修改。
  • 对象删除操作:delete或deleteAll。
  1. delete(final Serializable entity):删掉单挑记录,同时会自动根据外键删除级联的子表相关数据。
  2. deleteAll(final List<?> entities):批量删除记录,这个删除相较于hibernate性能更高,底层采用批量删除,尤其子表数据删除也是批量操作,不同于hibernate的循环删除子表。
  • 唯一性验证:isUnique,传递对象判断对象是否已经存在。经常在数据保存前需要判断数据库中是否已经存在,从而提前进行提醒,让交互更加友好(尤其页面维护数据,当维护一个数值后通过ajax判断是否已经存在,避免提交后通过异常来方式提醒用户)。
  1. isUnique(final Serializable entity):根据主键判断是已经重复。
  2. isUnique(final Serializable entity, final String[] paramsName):指定需要判断重复的属性字段进行验证唯一性。
  • 查询并锁定再进行修改并返回结果(一次性交互中完成)
  1. List updateFetch(final QueryExecutor queryExecutor, final UpdateRowHandler updateRowHandler):锁定记录并进行修改,并返回结果,在并发抢占模式下非常有用,如餐厅点桌子,任务竞争性领取等,谁先执行先锁定则先修改先获取(修改后状态发生变化别人就会抢占失败)。 

 

 

 

猜你喜欢

转载自zhongxuchen.iteye.com/blog/2390345