sumk

Easter79
• 阅读 718

更新的文档参见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。使用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

后缀(非必填)

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
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
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解2016年09月02日00:00:36 \牧野(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fme.csdn.net%2Fdcrmg) 阅读数:59593
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k