123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388 |
- /*
- * *********************************************************************************************************************
- *
- * !!
- * .F88X
- * X8888Y
- * .}888888N;
- * i888888N; .:! .I$WI:
- * R888888I .'N88~ i8}+8Y&8"l8i$8>8W~'>W8}8]KW+8IIN"8&
- * .R888888I .;N8888~ .X8' "8I.!,/8" !%NY8`"8I8~~8>,88I
- * +888888N; .8888888Y "&&8Y.}8,
- * ./888888N; .R888888Y .'}~ .>}'.`+> i}! "i' +/' .'i~ !11,.:">, .~]! .i}i
- * ~888888%: .I888888l .]88~`1/iY88Ii+1'.R$8$8]"888888888> Y8$ W8E X8E W8888'188Il}Y88$*
- * 18888888 E8888881 .]W%8$`R8X'&8%++N8i,8N%N8+l8%` .}8N:.R$RE%N88N%N$K$R 188,FE$8%~Y88I
- * .E888888I .i8888888' .:$8I;88+`E8R:/8N,.>881.`$8E/1/]N8X.Y8N`"KF&&FK!'88*."88K./$88%RN888+~
- * 8888888I .,N888888~ ~88i"8W,!N8*.I88.}888%F,i$88"F88" 888:E8X.>88!i88>`888*.}Fl1]*}1YKi'
- * i888888N' I888Y ]88;/EX*IFKFK88X K8R .l8W 88Y ~88}'88E&%8W.X8N``]88!.$8K .:W8I
- * .i888888N; I8Y .&8$ .X88! i881.:%888>I88 ;88] +88+.';;;;:.Y88X 18N.,88l .+88/
- * .:R888888I
- * .&888888I Copyright (c) 2009-2020. 博锐尚格科技股份有限公司
- * ~8888'
- * .!88~ All rights reserved.
- *
- * *********************************************************************************************************************
- */
- package com.persagy.database
- import com.persagy.base.exceptions.SFieldNotFoundException
- import com.persagy.base.extensions.toJson
- import com.persagy.base.extensions.*
- import com.persagy.database.extensions.filterListByKeys
- import com.persagy.database.parser.SSyntaxParser
- import java.io.ByteArrayInputStream
- import java.lang.reflect.Field
- import java.lang.reflect.ParameterizedType
- import javax.persistence.Column
- import javax.persistence.Table
- /**
- * 数据访问对象基类
- *
- * @author 庞利祥 <sybotan@126.com>
- */
- abstract class SAbstractDao<ENTITY: Any>(entityClazz: Class<ENTITY>) {
- companion object {
- /**
- * 获得表名,取实体类@Table注解的名称,如果没有注解,则取实体类类名。
- *
- * @param clz mapper类类型
- * @param keyEsc 转义符,用于避免与数据库关键词冲突
- * @return 表名
- */
- fun tableName(clz: Class<*>, keyEsc: String = ""): String {
- val tableAnno = clz.getAnnotation(javax.persistence.Table::class.java)
- // 如果有@Table注解,则取注解的表名;否则使用类名做为表名
- val tableName = tableAnno?.name ?: clz.simpleName
- val name = tableName.replace(".", "$keyEsc.$keyEsc")
- return "$keyEsc$name$keyEsc"
- } // Fun tableName()
- /**
- * 获得实体类属性对应的数据表字段名
- *
- * @param clazz 实体类类型
- * @param name 属性名
- * @return 对应的数据表字段名
- */
- fun columnName(clazz: Class<*>, name: String, keyEsc: String = ""): String {
- try {
- val field = clazz.getAllDeclaredField(name, true, true)
- val colName = field!!.getAnnotation(Column::class.java).name
- return "$keyEsc$colName$keyEsc"
- } catch (e: Exception) {
- throw SFieldNotFoundException(name)
- }
- } // Fun columnName()
- /**
- * 获得实体类属性名
- *
- * @param clazz 实体类类型
- * @param name 名称
- * @return 实体类属性名
- */
- fun propertyName(clazz: Class<*>, name: String): String {
- try {
- val field = clazz.getAllDeclaredField(name, true, true)
- return field!!.name
- } catch (e: Exception) {
- throw SFieldNotFoundException(name)
- }
- } // Fun propertyName()
- } // companion object
- /** 实体类类型 */
- val entityClass = entityClazz
- /**
- * 在数据库中插入实体
- *
- * @param entity 插入数据库的实体
- * @return 插入是否成功
- */
- abstract fun insert(entity: ENTITY): Boolean
- /**
- * 在数据库中插入/更新实体
- *
- * @param entity 插入/更新数据库的实体
- * @return 插入是否成功
- */
- abstract fun replace(entity: ENTITY): Boolean
- /**
- * 根据条件删除
- *
- * @param args 删除条件
- * @return 删除是否成功
- */
- abstract fun delete(args: List<SFilter>): Boolean
- /**
- * 删除所有记录
- *
- * @return 删除是否成功
- */
- abstract fun deleteAll(): Boolean
- /**
- * 根据条件更新
- *
- * @param entity 更新的值
- * @param projection 将被更新的字段列表(以逗号分隔),为空表示更新所有非空字段
- * @param args 更新条件
- * @return 更新是否成功
- */
- abstract fun update(entity: ENTITY, projection: ArrayList<String>? = null, args: List<SFilter>? = null): Boolean
- /**
- * 根据条件查询记录
- *
- * @param args 查询条件
- * @return 查询构造器
- */
- abstract fun select(args: List<SFilter>): SQueryBuilder<ENTITY>
- /**
- * 根据条件查询所有记录
- *
- * @return 查找构建器
- */
- abstract fun selectAll(): SQueryBuilder<ENTITY>
- /**
- * 执行查询操作
- *
- * @param builder 查询查询构造器
- * @return 查询到的记录
- */
- abstract fun execQuery(builder: SQueryBuilder<ENTITY>): ArrayList<ENTITY>
- /**
- * 执行统计个数操作
- *
- * @param builder 查询查询构造器
- * @return 查询到的记录数
- */
- abstract fun execCount(builder: SQueryBuilder<ENTITY>): Long
- /**
- * 执行分页查询操作
- *
- * @param builder 查询查询构造器
- * @param pageNumber 第几页
- * @param pageSize 每页记录数
- * @return 查询到的记录
- */
- fun pageQuery(builder: SQueryBuilder<ENTITY>, pageNumber: Int, pageSize: Int): SPageQueryInfo<ENTITY> {
- val pageInfo = SPageQueryInfo<ENTITY>(pageNumber, pageSize)
- builder.limit((pageNumber - 1) * pageSize, pageSize)
- pageInfo.total = execCount(builder)
- pageInfo.content = execQuery(builder)
- return pageInfo
- } // Fun pageQuery()
- /**
- * 删除实体
- *
- * @param entity 被删除的实体
- * @return 删除是否成功
- */
- open fun delete(entity: ENTITY): Boolean {
- return delete(entity.filterListByKeys())
- } // Fun delete()
- /**
- * 根据条件删除
- *
- * @param args 删除条件
- * @return 删除是否成功
- */
- open fun delete(vararg args: Pair<String, Any>): Boolean {
- val filterList = ArrayList<SFilter>()
- for (arg in args) { // 同时取列表元素与下标
- filterList.add(SFilter.eq(arg.first, arg.second))
- }
- return delete(filterList)
- } // Fun delete()
- /**
- * 根据条件删除
- *
- * @param args 删除条件
- * @return 删除是否成功
- */
- open fun delete(vararg args: SFilter): Boolean {
- return delete(args.toList())
- } // Fun delete()
- /**
- * 根据条件删除
- *
- * @param query 删除条件
- * @return 删除是否成功
- */
- open fun delete(query: String): Boolean {
- val parser = SSyntaxParser(ByteArrayInputStream(query.toByteArray()))
- return delete(parser.parserFilters())
- } // Fun delete()
- /**
- * 更新实体
- *
- * @param entity 更新实体
- * @param projection 将被更新的字段列表(以逗号分隔),为空表示更新所有非空字段
- * @return 更新是否成功
- */
- open fun update(entity: ENTITY, projection: ArrayList<String>? = null): Boolean {
- return update(entity, projection, entity.filterListByKeys())
- } // Fun update()
- /**
- * 根据条件更新
- *
- * @param entity 更新实体内容
- * @param projection 将被更新的字段列表(以逗号分隔),为空表示更新所有非空字段
- * @param args 更新条件
- * @return 更新是否成功
- */
- open fun update(entity: ENTITY, projection: ArrayList<String>? = null, vararg args: Pair<String, Any>): Boolean {
- val filterList = ArrayList<SFilter>()
- for (arg in args) {
- filterList.add(SFilter.eq(arg.first, arg.second))
- }
- return update(entity, projection, filterList)
- } // Fun update()
- /**
- * 根据条件更新
- *
- * @param entity 更新实体内容
- * @param projection 将被更新的字段列表(以逗号分隔),为空表示更新所有非空字段
- * @param args 更新条件
- * @return 更新是否成功
- */
- open fun update(entity: ENTITY, projection: ArrayList<String>? = null, vararg args: SFilter): Boolean {
- return update(entity, projection, args.toList())
- } // Fun update()
- /**
- * 根据条件更新
- *
- * @param entity 更新实体内容
- * @param projection 将被更新的字段列表(以逗号分隔),为空表示更新所有非空字段
- * @param query 更新条件
- * @return 更新是否成功
- */
- open fun update(entity: ENTITY, projection: ArrayList<String>? = null, query: String): Boolean {
- val parser = SSyntaxParser(ByteArrayInputStream(query.toByteArray()))
- return update(entity, projection, parser.parserFilters())
- } // Fun update()
- /**
- * 根据条件查询一条记录
- *
- * @param args 查询条件
- * @return 查询构造器
- */
- open fun select(vararg args: Pair<String, Any>): SQueryBuilder<ENTITY> {
- val filterList = ArrayList<SFilter>()
- for (arg in args) { // 同时取列表元素与下标
- filterList.add(SFilter.eq(arg.first, arg.second))
- }
- return select(filterList)
- } // Fun select()
- /**
- * 根据条件查询记录
- *
- * @param args 查询条件
- * @return 查询构造器
- */
- open fun select(vararg args: SFilter): SQueryBuilder<ENTITY> {
- return select(args.toList())
- } // Fun select()
- /**
- * 根据条件查询记录
- *
- * @param query 查询条件
- * @return 查询构造器
- */
- open fun select(query: String?): SQueryBuilder<ENTITY> {
- // 如果查询条件为空,则执行查询所有
- if (query == null) {
- return selectAll()
- }
- val queryParser = SSyntaxParser(ByteArrayInputStream(query.toByteArray()))
- val filters = queryParser.parserFilters()
- return select(filters)
- } // Fun select()
- /**
- * 获得表名
- */
- fun tableName(): String {
- val clz = (javaClass.genericSuperclass as ParameterizedType).actualTypeArguments[0] as Class<*>
- if (clz.isAnnotationPresent(Table::class.java)) {
- val anno = clz.getAnnotation(Table::class.java)
- return anno!!.name
- }
- return clz.simpleName
- } // Fun tableName()
- /**
- * 实体的field转换为Pair结构
- *
- * @param entity 要转换的实体对象
- * @param field 实体对应的域
- */
- protected fun fieldToPair(entity: ENTITY, field: Field): Pair<String, Any?> {
- // 获得field对应的数据库表字段名
- val anno = field.getAnnotation(Column::class.java)
- return Pair<String, Any?>(anno.name, when (field.type.simpleName) {
- "byte", "Byte" -> field.getByte(entity)
- "double", "Double" -> field.getDouble(entity)
- "float", "Float" -> field.getFloat(entity)
- "int", "Integer", "Int" -> field.getInt(entity)
- "long", "Long" -> field.getLong(entity)
- "short", "Short" -> field.getShort(entity)
- "Boolean" -> field.getBoolean(entity)
- "String" -> field.get(entity)
- else ->{
- if (entity == null){
- null
- }else{
- if (field.get(entity) == null){
- null
- }else{
- field.get(entity).toJson()
- }
- }
- }
- })
- } // Fun fieldToPair()
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- // 级联操作相关
- /**
- * 查询级联关系
- *
- * @param table 表名
- * @param id1 对象表ID字段名
- * @param id2 级联对象ID字段名
- * @param self 自身级联
- * @param filter 附加过滤条件
- * @param idList 对象ID列表
- * @return 关系列表
- */
- abstract fun relationQuery(table: String, id1: String, id2: String, self: Boolean, filter: String, idList: ArrayList<Any>): ArrayList<HashMap<String, Any>>
- } // Class SAbstractDao
|