sql dao增删改查
sql封装
在sql dao框架的架构开发中,重点需要处理的是对增删改查sql的封装,如何简化sql拼接操作,使上层应用能够很方便的接入开发并提升开发效率,下面是需要我们考虑的2个问题。
1. 对象关系映射ORM。
2. 多条件查询条件封装。
增
新增add操作对应是是sql dml中的insert操作,用于向数据库插入一条新的记录,在实际使用中,基本没人愿意每次插入新写一条insert语句来支持,目前大部分框架支持的就是ORM来映射,通过一个entity对象对应数据库中的字段,然后通过反射来拼接需要的insert语句,但实际开发是复杂的,有可能我们这个entity对象包含了冗余字段或者有字段名称与数据库是不对应的,那这种我们如何解决呢?
- ## entity对象包含了冗余字段
在这种情况,orm反射拼接insert sql语句时是需要排除掉对应的字段的,可以给对应的字段加上注解@VirtualProperty,每次反射获取数据时根据发现存在此注解则表示排除此字段。
- ## entity字段名称不对应
这种与上面类似,可以加个注解,如@DataProperty,如果反射发现字段上有此注解,则表示使用DataProperty中的name去拼接。
还要一个问题就是新增的时候如果有唯一键冲突怎么办,还好mysql中有ON DUPLICATE KEY UPDATE这种方式,我可以利用起来,预留一个待实现的OnDuplicatedUpdate OnDuplicatedKeyUpdate(DomainObject object)给调用方法去实现,如果实现了则会拼接update相关的语句。
删和改
表名等可以从meta类上的注解获取到,直接拼接delete或update语句然后去执行就可以了。
查
sql dao查询需要解决如下2个问题
- ## ORM中meta类包含自定义字段
自定义字段,可能是String转List,这种转化规则是我们无法用通用方法去处理的,只能交给包含了自定义字段的meta对应的dao自己去解析实现,因此可以定义一个protected DomainObject getObjectFromRs(ResultSet rs) 供子类去自己实现。
- ## 查询条件如何封装,比如分页
条件封装太多容易造成使用困惑,因此将limit offset和根据字段排序封装即可。
题外话
sql框架还有一个重要的功能需要实现,那就是监控命中率,使用AtomicLong 记录即可。