123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217 |
- /*
- * *********************************************************************************************************************
- *
- * !!
- * .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) 2016-2020. 博锐尚格科技股份有限公司
- * ~8888'
- * .!88~ All rights reserved.
- *
- * *********************************************************************************************************************
- */
- package com.persagy.mybatis
- import com.persagy.base.extensions.toJson
- import com.persagy.database.*
- import com.persagy.database.extensions.keyColumnList
- import com.persagy.database.extensions.keyFieldList
- import com.persagy.mybatis.extensions.toInsertRow
- import com.persagy.mybatis.extensions.toUpdateRow
- import org.slf4j.LoggerFactory
- /**
- * Mybatis基础Dao操作
- *
- * @author 庞利祥 <sybotan@126.com>
- */
- abstract class SAbstractMybatisDao<ENTITY: Any>(entityClazz: Class<ENTITY>) : SAbstractDao<ENTITY>(entityClazz) {
- /** 静态对象 */
- companion object {
- /** 日志记录器 */
- private val logger = LoggerFactory.getLogger(SAbstractMybatisDao::class.java)
- } // companion object
- /** sql映射对象*/
- abstract val mapper: IBaseMapper<ENTITY>
- /** 读取记录行解析器 */
- private val rowParser = SRowParser(entityClazz)
- /**
- * 在数据库中插入实体
- *
- * @param entity 插入数据库的实体
- * @return 手入是否成功
- */
- override fun insert(entity: ENTITY): Boolean {
- val entityMap = entity.toInsertRow()
- val result = mapper.insert(entityClass, entityMap)
- try {
- if (entityMap.containsKey("_id")) {
- val id = entityMap["_id"]
- val keyField = entity::class.java.keyFieldList()[0]
- val accessible = keyField.isAccessible //canAccess(entity)
- keyField.isAccessible = true
- keyField.set(entity, id)
- keyField.isAccessible = accessible
- }
- } catch (e: Exception) {
- // DO NOTHING
- }
- return result
- } // Fun insert()
- /**
- * 在数据库中插入实体
- *
- * @param entity 插入数据库的实体
- * @return 手入是否成功
- */
- override fun replace(entity: ENTITY): Boolean {
- return try {
- mapper.replace(entityClass, entity.toInsertRow(), entity.javaClass.keyColumnList())
- } catch (e: Exception) {
- e.printStackTrace()
- false
- }
- } // Fun replace()
- /**
- * 根据条件删除
- *
- * @param args 删除条件
- * @return 删除是否成功
- */
- override fun delete(args: List<SFilter>): Boolean {
- return try {
- mapper.delete(entityClass, args, HashMap())
- } catch (e: Exception) {
- e.printStackTrace()
- false
- }
- } // Fun delete()
- /**
- * 删除所有记录
- *
- * @return 删除是否成功
- */
- override fun deleteAll(): Boolean {
- return try {
- mapper.deleteAll(entityClass)
- } catch (e: Exception) {
- e.printStackTrace()
- false
- }
- } // Fun deleteAll()
- /**
- * 根据条件更新
- *
- * @param projection 将被更新的字段列表(以逗号分隔),为空表示更新所有非空字段
- * @param args 删除条件
- * @return 更新是否成功
- */
- override fun update(entity: ENTITY, projection: ArrayList<String>?, args: List<SFilter>?): Boolean {
- return try {
- mapper.update(entityClass, entity.toUpdateRow(), projection, args, HashMap())
- } catch (e: Exception) {
- e.printStackTrace()
- false
- }
- } // Fun update()
- /**
- * 根据条件查询记录
- *
- * @param args 查询条件
- * @return 查询构造器
- */
- override fun select(args: List<SFilter>): SQueryBuilder<ENTITY> {
- // 以下循环解决 “SingletonList cannot be cast to java.util.ArrayList” 错误。
- val filterList = ArrayList<SFilter>()
- args.forEach {
- filterList.add(it)
- }
- return SQueryBuilder(this, filterList)
- } // Fun select()
- /**
- * 根据条件查询所有记录
- *
- * @return 查找的记录
- */
- override fun selectAll(): SQueryBuilder<ENTITY> {
- val sQueryBuilder = SQueryBuilder(this, ArrayList())
- // sQueryBuilder.count = 999999999
- sQueryBuilder.limit(999999999)
- logger.debug("查询记录:${sQueryBuilder.toJson()}")
- return sQueryBuilder
- } // Fun selectAll()
- /**
- * 执行查询操作
- *
- * @param builder 查询查询构造器
- * @return 查询到的记录
- */
- override fun execQuery(builder: SQueryBuilder<ENTITY>): ArrayList<ENTITY> {
- val result = ArrayList<ENTITY>()
- for (row in mapper.execQuery(entityClass, builder, HashMap())) {
- try {
- result.add(rowParser.parseRow(row))
- } catch (e: Exception) {
- // DO NOTHING
- }
- }
- return result
- } // Fun exec()
- /**
- * 执行统计个数操作
- *
- * @param builder 查询查询构造器
- * @return 查询到的记录
- */
- override fun execCount(builder: SQueryBuilder<ENTITY>): Long {
- val list = mapper.execCount(entityClass, builder, HashMap())
- if (list.size == 1) {
- return list[0]
- }
- return list.size.toLong()
- } // Fun execCount()
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- // 级联操作相关
- /**
- * 查询级联关系
- *
- * @param table 表名
- * @param id1 对象表ID字段名
- * @param id2 级联对象ID字段名
- * @param self 自身级联
- * @param filter 附加过滤条件
- * @param idList 对象ID列表
- * @return 关系列表
- */
- override fun relationQuery(table: String, id1: String, id2: String, self: Boolean, filter: String, idList: ArrayList<Any>): ArrayList<HashMap<String, Any>> {
- return mapper.relationQuery(table, id1, id2, self, filter, idList, HashMap());
- } // Fun cascadeIdList()
- } // Class SAbstractMybatisDao
|