sumk

更新的文档参见github中的《 sumk-data介绍.docx

sumk-data的原生入口类有DB(ORM)、SDB(类似于Mybatis)

ORM的公共特性

大小写:大小写不敏感。

字段名:ORM用的是java字段。RawDB、NamedDB用的是原生数据库字段

条件参数如果是pojo,里面的null会被省略。如果是map,里面的null也会作为条件

failIfPropertyNotMapped这个其实是代码检查,为了防止开发人员写错map中的key。默认情况下,当使用map的时候,如果map的某个key不是pojo中的字段名,就会抛出异常。设为false会禁用这个异常。本设置只对当前select有效

tableClass如果还没有用过pojo做参数,就用Map<String,Object>做参数,就得调用本法。它的参数是使用了@Table做注解的pojo对象。确保起见,在用map作参数的时候,都调用一次本方法。tableClass可以是pojo所属的类,也可以是所属类的子类

execute所有的修改操作,都要调用execute()才最终执行。比如DB.insert(pojo),它只是DB.insert().insert(pojo)的简写,也需要调用execute()才能执行

partition 用于分表。比如@Table(value="school_?",preInCache="{School_?}"),这时候调用partition(“fuzhou”),那么实际操作的数据库表以及缓存对象都是school_fuzhou

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的字段名,大小写敏感

allowEmptyWhere  默认情况下,select必须要有where条件。设为false就可以查询整张表。如果使用软删除,查询的是所有有效记录,被删除的记录不会查询出来。如果要查询已经被删除的记录,要使用RawDB或NamedDB

resultHandler返回值的处理方式,默认是List<pojo>。使用MapResultHandler.handler作为参数,就可以返回List<Map<String,Object>>

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根据参数字段升序排序,参数是java的field,大小写敏感

orderByDesc降序排序

  升序降序可以多次调用,越早调用的,优先级越高(这是sql决定的)

offset  limit起始位置的偏移量,以及返回的记录数。可以使用Paged对象将“第几页”这种页面表示转化成offset表示

selectColumns指定返回的列,一般无需调用。目前版本中,它并不节省数据库开销,未来有可能

fromCache如果为false,将强制进行数据库查询

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条件

  • 本方法可以被多次调用,多次调用之间是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
  • 如果设置的是外键缓存,根据主键删除时,也要把外键带上,这样不影响数据库删除,而且也能正确删除缓存数据

@Table

属性

含义

value

表名。为空时,就是小写的类名

duration

在缓存中保留的时间,单位秒。0表示使用全局设置,小于0表示不过期

preInCache

为空使用类名,一般使用默认就好

maxHit

访问多少次之后刷新缓存,0表示使用全局默认,小于0表示不刷新

cacheType

SINGLE:每个redis键对应一条记录

LIST:每个redis键对应一个List

NOCACHE:本表不缓存

@SoftDelete

属性

含义

value

字段名

columnType

字段属性,默认是String,还支持Integer、Byte、Short、Long

validValue

什么值表示有效。如果是数字类型,会被转化成数字类型

inValidValue

删除的时候,会被置为该值

whatIsValid

默认情况下状态字段的值跟validValue相同表示有效,如果设置成NOT_INVALID,只要该字段的值不等于inValidValue都表示有效

@Column

属性

含义

value

数据库字段的名字,不填的话,就是属性名(小写)

columnType

 

columnOrder

越小的,在越前面。值相等的时候,根据数据库字段名排序.使用默认的就好

NORMAL

默认的,表示普通字段

ID_DB

数据库主键。不允许为null。在更新的时候,如果没有显式设置where条件,主键字段将不会被更新

ID_CACHE

redis 主键,不允许为null

ID_BOTH

既是数据库主键,也是redis主键。不允许为null

app.properties中的一些配置

属性名

含义

默认值

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

sumk.log.level

这个是全局的日志设置。日志名称sumk.sql可以设置db的sql是否打印

SDB:

  • 文件放置在classes底下的sql目录里面,支持一级子文件夹。也可以放到操作系统的某个文件夹下,通过sumk.db.sql.path来配置
  • namespace是可选的,sql名称只与namespace和当前sql的id有关,与文件名无关
  • 通过SDB直接操作,或者使用SDB.builder()来操作。builder是为了能够返回具体的对象,而不是Map
  • xml中变量有两种模式:#是安全变量,转义成sql的?,$会做字符串替换,有注入风险

xml中的标签

标签

属性

用法

if(ifnot是if的反向用法)

test

参数中有对应的值表示true。多个值可以用,或|隔开。逗号表示and关系,|表示or关系

falseby

默认null,当key对应的值为null时表示false。

nokey当参数中没有对应的key时表示false

empty 当参数对应的值为null或空字符都是false

items

separator

分隔符

open

前缀(非必填)

close

后缀(非必填)

foreach

collection

参数中对应值的字段名称,该值的value必须是集合类型

item

遍历集合时中间变量的名称

separator

分隔符

open

前缀(非必填)

close

后缀(非必填)

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )