sumk-db的原生入口类有DB(ORM)、SDB
目的:
- 减少sql编写数目,提高开发速度并减少sql出错概率
- 提升性能,能很容易的与redis结合起来
- 便于修改表字段,mybatis方式下,修改一个字段会带来灾难性后果
- 提供事件机制,便于监控数据库操作以及慢操作之类
ORM的公共特性
- 大小写:作为参数时大小写不明感。在某些查询返回值为map的api中,才大小写敏感。
- failIfPropertyNotMapped方法:这个其实是代码检查,为了防止开发人员写错map中的key。默认情况下,当使用map的时候,如果map的某个key不是pojo中的字段名,就会抛出异常。设为false会禁用这个异常。本设置只对当前select有效
- tableClass方法:如果还没有用过数据表对应的pojo对象做参数,就得调用本法。它的参数是使用了@Table做注解的pojo对象。确保起见,在用map作参数的时候,都调用一次本方法。tableClass可以是pojo所属的类,也可以是所属类的子类
- execute方法:所有的修改操作,都要调用execute()才最终执行。比如DB.insert(pojo),它只是DB.insert().insert(pojo)的简写,也需要调用execute()才能执行
- partition方法:针对数据库分表的情况,比如按地区划分的销售表。
Select对象
DB采用的是懒执行模式,select只有在queryList、queryOne、count时才执行。count和query可以一起使用,比如:
Select select=DB.Select()…
int c=select.count();
List list=select.queryList();
addEqual(相等条件):
- 多次调用之间是( )or( )关系
- AddEqual的参数是Map或pojo对象,各字段之间是And关系
比较:
- 所有的比较是And关系
- 同一种比较类型,一个key只会出现一次
- 比较跟所有的Equal是And关系
- 比较用的是java的字段名,大小写敏感
-
bigThan大于的意思,有2种重载方式,一种参数是bigThan(String p,Object v),它表示组装sql的时候,会有类似p>v的条件出现。另一种是bigThan(map),它表示组装sql的时候,会有类似(key1>v1 AND key2>v2)的条件出现。bigThan(String p,Object v)可以多次调用,多次调用的效果,类似于调用一次bigThan(map)。bigThan(map)不可多次调用,多次调用的话,后调用的会覆盖前面的;而且它也会覆盖之前调用的bigThan(String p,Object v)
-
bigOrEqual是大于等于,使用方式与bigThan相同
-
lessThan 是小于的意思,使用方式与bigThan相同
-
lessOrEqual是小于等于的意思,使用方式与bigThan相同
排序:
- orderByAsc根据参数字段升序排序
- orderByDesc降序排序
- 参数是java的field,大小写敏感
- 升序降序可以多次调用,越早调用的,优先级越高(这是sql决定的)
allowEmptyWhere :默认情况下,select必须要有where条件。设为false就可以查询整张表。如果使用软删除,查询的是所有有效记录,被删除的记录不会查询出来。如果要查询已经被删除的记录,要使用RawDB或NamedDB
resultHandler返回值的处理方式,默认是List<pojo>。使用MapResultHandler.handler作为参数,就可以返回List<Map<String,Object>>
offset limit起始位置的偏移量,以及返回的记录数。可以使用Paged对象将“第几页”这种页面表示转化成offset表示
selectColumns指定返回的列,一般无需调用。目前版本中,它并不节省数据库开销,未来有可能
fromCache如果为false,将强制进行数据库查询
parseNULL如果为true,在判断是否相等时,会将null值解析成is null。否则将忽略null值(默认)
byPrimaryId根据数据库主键列表查询,只能在单主键的表中使用
byRedisId根据redis主键列表查询,只能应用于redis单主键的情况
tableClass如果参数是map,要在设置map参数前调用本方法,只需要调用一次就行了
Insert
插入数据库,同时修改redis缓存。如果是数字类型的单主键,不需要显示设置主键,系统会自动生成主键。如果设置了,就用你设置的那个主键。
insert本方法的参数是要插入的记录,可以是pojo对象,也可以是map
- DB.insert(**)等价于Select select=DB.insert(); select.insert(**)
- 本方法可以被多次调用,相当于批处理
- 如果使用map做参数,要确保有使用过pojo做参数,如果没有,请先调用tableClass方法
Update
updateDBID默认情况下,数据库的主键收到保护,不会被更新。将它设为false,就可以更新主键。
addWhere添加查询条件,如果没有显式调用本方法,就会使用updateTo参数中的主键(数据库主键或redis主键)作为where条件
- 调用本方法后,byDBID和byCacheID方法将被忽略
- 本方法可以被多次调用,多次调用之间是OR关系。
- 如果本表使用了缓存,本参数必须包含所有redis主键
- bean类型或Map<String, Object>.如果是pojo对象,其中的null字段会被忽略掉
- byDBID调用本方法,addWhere为空时,根据数据库主键更新。本方法是系统默认,一般不需要调用。
- byCacheID调用本方法后,addWhere为空时,根据redis主键更新。如果addWhere不为空,调用本方法无实际作用。
- updateTo更新后的状态,要注意全部更新和部分更新的差别。DB.update(**)等价于DB.update().updateTo(**)。如果使用DB.update()方法初始化的,本方法必须被调用。
- execute最终执行,如果不调用本方法,上面的操作都没有实际作用。
- fullUpdate默认是部分更新,如果设置为true,就会全局更新。它对updateTo()中的参数起作用。
- incrNum增加某个字段的值,如果要减少,用负数就行了。name参数指的是java的字段名,大小写敏感。设置了该属性,updateTo参数中相同字段的值将被忽略。该方法可以被多次调用。
Delete
- 多次调用delete是or关系
- 分物理删除和逻辑删除2种。无论哪一种,对业务系统来说,都是删除。但是逻辑删除的记录,在数据库中还是存在的。参见@SoftDelete
- 如果设置的是外键缓存,根据主键删除时,也要把外键带上,这样不影响数据库删除,而且也能正确删除缓存数据
属性 | 含义 |
value | 表名。为空时,就是小写的类名 |
duration | 在缓存中保留的时间,单位秒。0表示使用全局设置,小于0表示不过期 |
preInCache | 为空使用类名,一般使用默认就好 |
maxBeats | 访问多少次之后刷新缓存,0表示使用全局默认,小于0表示不刷新 |
cacheType | SINGLE:每个redis键对应一条记录 LIST:每个redis键对应一个List NOCACHE:本表不缓存 |
@SoftDelete
属性 | 含义 |
value | 字段名 |
columnType | 字段属性,默认是String,还支持Int、Byte、Short、Long |
validValue | 什么值表示有效。如果是数字类型,会被转化成数字类型 |
inValidValue | 删除的时候,会被置为该值 |
属性 | 含义 |
value | 数据库字段的名字,不填的话,就是属性名(小写) |
columnType | 见下表 |
columnOrder | 越小的,在越前面。值相等的时候,根据数据库字段名排序.使用默认的就好 |
columnType的说明
NORMAL | 默认的,表示普通字段 |
ID_DB | 数据库主键。不允许为null。在更新的时候,如果没有显式设置where条件,主键字段将不会被更新 |
ID_CACHE | redis 主键,不允许为null |
ID_BOTH | 既是数据库主键,也是redis主键。不允许为null |
app.properties中关于db的一些配置
属性名 | 含义 | 默认值 |
sumk.sql.fromCache | 1表示会select操作会读取redis | 1 |
sumk.sql.toCache | 1表示会select操作会更新redis | 1 |
sumk.orm.update.byType | ID_DB表示根据数据库主键更新,其它标示根据redis主键更新 | ID_DB |
sumk.sql.failIfPropertyNotMapped | 1 表示会检查字段名跟pojo中定义的是否一致 | 1 |
http.session.single | 1 表示启用单处登陆 | 0 |
http.jetty.resource | 静态文件的目录 | 空 |
sumk.db.generator | 如果为1,就会打印建表sql | 0 |
sumk.db.generator.db | 设置了数据库别名,将会自动生成数据库表。但要满足2个条件: 1、sumk.db.generator=1 2、该表还未创建,如果表已存在,将不做任何事情 |
SDB:
- xml文件放置在classes底下的sql目录里面
- 通过SDB类调用