2019独角兽企业重金招聘Python工程师标准>>>

sumk-db的原生入口类有DB(ORM)、SDB

目的:

  1. 减少sql编写数目,提高开发速度并减少sql出错概率
  2. 提升性能,能很容易的与redis结合起来
  3. 便于修改表字段,mybatis方式下,修改一个字段会带来灾难性后果
  4. 提供事件机制,便于监控数据库操作以及慢操作之类

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
  • 如果设置的是外键缓存,根据主键删除时,也要把外键带上,这样不影响数据库删除,而且也能正确删除缓存数据

@Table

属性

含义

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

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

@Column

属性

含义

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类调用

转载于:https://my.oschina.net/u/819657/blog/3008795

sumk-db的主要方法及注解相关推荐

  1. @transactional注解_为啥同一个类中普通方法调用Spring注解方法,注解会失效?看完你就明白,So easy!...

    Spring注解(如@Transactional.@Cacheable.@Async等),在使用不当时,很可能会失效.失效的情况有很多种,本文我们就来瞅瞅,为啥同一个类中普通方法调用Spring注解方 ...

  2. 安卓读取mysql数据库文件路径_Android开发实现读取assets目录下db文件的方法示例...

    本文实例讲述了Android开发实现读取assets目录下db文件的方法.分享给大家供大家参考,具体如下: 最近准备打算写一个关于天气预报的app,偶然的机会在一大神的博客上看到了一个获取天气的api ...

  3. php thumbs.db,window_Win8系统删除thumbs.db文件的方法,  最近有Win8系统用户反映, - phpStudy...

    Win8系统删除thumbs.db文件的方法 最近有Win8系统用户反映,系统老是会出现thumbs.db文件,不知道它是什么文件,想要删除掉它,又删除不掉,为此感到很苦恼.其实,thumbs.db文 ...

  4. 在同一个类中,一个方法调用另外一个有注解(比如@Async,@Transational)的方法,注解失效的原因和解决方法

    在同一个类中,一个方法调用另外一个有注解(比如@Async,@Transational)的方法,注解失效的原因和解决方法 参考文章: (1)在同一个类中,一个方法调用另外一个有注解(比如@Async, ...

  5. java获取类与方法的注解、注释

    第一.获取注解 @Test(description = "获取类.方法注解") public void test(){//类注解信息Annotation[] annotations ...

  6. aop切面获取方法参数,注解,及判断是否成功执行

    项目中第一次用到自定义注解,这里简单记一下,以方便以后忘了来回顾一下 自定义注解 /*** 修改方法日志注解*/ @Target(ElementType.METHOD) @Documented @Re ...

  7. web.xml过滤html,Servlet过滤器两种配置方法(注解、配置web.xml文件)

    方法一(注解) /** * 使用注解标注过滤器 * @WebFilter将一个实现了javax.servlet.Filte接口的类定义为过滤器 * 属性filterName声明过滤器的名称,可选 * ...

  8. mybatis入门学习(九) -DB环境切换、使用注解、事务提交、获取自增ID、多参数传参、鉴别器、内置参数、批量写入、Oracle字段无法插入 null 值

    一.多数据库环境切换 1.config配置: <!-- default="mydemo" 指定连接的数据库 --><environments default=&q ...

  9. 改造Dubbo,使其可以对接口方法进行注解配置

    为什么80%的码农都做不了架构师?>>>    在之前的文章中介绍过了基于Spring 4 + Dubbo 的注解配置.参见<改造Dubbo,使其能够兼容Spring 4注解配 ...

最新文章

  1. cuda 安装_win10+VS 2017 安装 CUDA(Visual Studio Integration失败)
  2. kettle对字符串去除空格_整理|ABAP基础知识二:常用字符串处理
  3. matlab怎么删除上一条命令_怎么恢复电脑上删除的图片?四大步搞定
  4. ajax 在新选卡打开,开始使用 AJAX 控制工具包 (VB) | Microsoft Docs
  5. python语言做法_在Python中使用设置文件的最佳做法是什么?
  6. 韩国冬奥:未来科技奥运我要长这样,阿里巴巴:你尽管想
  7. python-opencv使用摄像头
  8. ASP.NET【2】
  9. 数据--第35课 - 创建二叉树
  10. php异步表单,利用ajax实现表单的异步互动——2018年4月10日
  11. 冒泡排序满分代码(C语言),附源代码,可直接运行
  12. iOS模拟器录屏视频
  13. 【微信小程序】video视频(77/100)
  14. R语言 image.binarization: 包_想提高文章的引用率?写个R包吧!- 工具准备篇
  15. (重磅!价值一千元的R代码送给你)芯片探针序列的基因组注释 芯片没有注释信息 从头基因组比对gtf文件开始atcg 只有探针核苷酸序列的首先探针核苷酸序列需要比对到参考基因组然后比对后的文件
  16. 如何确保NAS的安全性(你的NAS被攻击了吗?)
  17. 王川:我与雷军和而不同
  18. g5905怎么样 相当于什么水平
  19. php性能极限,利用autobench测试web服务器极限并发数
  20. 笔记本电脑硬盘坏了怎么办

热门文章

  1. [Prism框架实用分享]如何在主程序中合理的弹出子窗体
  2. JMeter配置元件【HTTP请求默认值】
  3. 疫情之下,精准测试的智能可信模式正在成为中流砥柱
  4. Spring 访问数据库
  5. selenium 定位方式5
  6. win10怎么去掉计算机里百度云,主编教你win10系统清除百度云盘盘符的修复方法...
  7. python在csv模块添加新列_如何在CSV文件的开头添加新列?
  8. 毕业不到一年的前端开发同学的焦虑
  9. 【前端规划】来看看我整理的这一份专属技术知识图谱吧~
  10. 关于前端学习路线的一些建议(值得零基础拥有)