SAbstractMybatisDao.kt 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. /*
  2. * ********************************************************************************************************************
  3. *
  4. * iFHS7.
  5. * ;BBMBMBMc rZMBMBR BMB
  6. * MBEr:;PBM, 7MBMMEOBB: BBB RBW
  7. * XK: BO SB. :SZ MBM. c;; ir BBM :FFr :SSF: ;xBMB:r iuGXv. i:. iF2;
  8. * DBBM0r. :D S7 ;XMBMB GMBMu. MBM: BMB MBMBBBMBMS WMBMBMBBK MBMBMBM BMBRBMBW .MBMBMBMBB
  9. * :JMRMMD .. , 1MMRM1; ;MBMBBR: MBM ;MB: BMB: MBM. RMBr sBMH BM0 UMB, BMB. KMBv
  10. * ;. XOW B1; :uM: 1RE, i .2BMBs rMB. MBO MBO JMB; MBB MBM BBS 7MBMBOBM: MBW :BMc
  11. * OBRJ.SEE MRDOWOR, 3DE:7OBM . ;BMB RMR7BM BMB MBB. BMB ,BMR .BBZ MMB rMB, BMM rMB7
  12. * :FBRO0D0 RKXSXPR. JOKOOMPi BMBSSWBMB; BMBB: MBMB0ZMBMS .BMBOXRBMB MBMDE RBM2;SMBM; MBB xBM2
  13. * iZGE O0SHSPO. uGZ7. sBMBMBDL :BMO OZu:BMBK, rRBMB0; ,EBMB xBMBr:ER. RDU :OO;
  14. * ,BZ, 1D0 RPSFHXR. xWZ .SMr . .BBB
  15. * :0BMRDG RESSSKR. 2WOMBW; BMBMR
  16. * i0BM: SWKHKGO MBDv
  17. * .UB OOGDM. MK, Copyright (c) 2015-2019. 斯伯坦机器人
  18. * , XMW ..
  19. * r All rights reserved.
  20. *
  21. * ********************************************************************************************************************
  22. */
  23. package com.persagy.mybatis
  24. import com.persagy.base.extensions.toJson
  25. import com.persagy.database.*
  26. import com.persagy.database.extensions.keyColumnList
  27. import com.persagy.database.extensions.keyFieldList
  28. import com.persagy.mybatis.extensions.toInsertRow
  29. import com.persagy.mybatis.extensions.toUpdateRow
  30. import org.slf4j.LoggerFactory
  31. /**
  32. * Mybatis基础Dao操作
  33. *
  34. * @author 庞利祥 <sybotan@126.com>
  35. */
  36. abstract class SAbstractMybatisDao<ENTITY: Any>(entityClazz: Class<ENTITY>) : SAbstractDao<ENTITY>(entityClazz) {
  37. /** 静态对象 */
  38. companion object {
  39. /** 日志记录器 */
  40. private val logger = LoggerFactory.getLogger(SAbstractMybatisDao::class.java)
  41. } // companion object
  42. /** sql映射对象*/
  43. abstract val mapper: IBaseMapper<ENTITY>
  44. /** 读取记录行解析器 */
  45. private val rowParser = SRowParser(entityClazz)
  46. /**
  47. * 在数据库中插入实体
  48. *
  49. * @param entity 插入数据库的实体
  50. * @return 手入是否成功
  51. */
  52. override fun insert(entity: ENTITY): Boolean {
  53. val entityMap = entity.toInsertRow()
  54. val result = mapper.insert(entityClass, entityMap)
  55. try {
  56. if (entityMap.containsKey("_id")) {
  57. val id = entityMap["_id"]
  58. val keyField = entity::class.java.keyFieldList()[0]
  59. val accessible = keyField.isAccessible //canAccess(entity)
  60. keyField.isAccessible = true
  61. keyField.set(entity, id)
  62. keyField.isAccessible = accessible
  63. }
  64. } catch (e: Exception) {
  65. // DO NOTHING
  66. }
  67. return result
  68. } // Fun insert()
  69. /**
  70. * 在数据库中插入实体
  71. *
  72. * @param entity 插入数据库的实体
  73. * @return 手入是否成功
  74. */
  75. override fun replace(entity: ENTITY): Boolean {
  76. return try {
  77. mapper.replace(entityClass, entity.toInsertRow(), entity.javaClass.keyColumnList())
  78. } catch (e: Exception) {
  79. e.printStackTrace()
  80. false
  81. }
  82. } // Fun replace()
  83. /**
  84. * 根据条件删除
  85. *
  86. * @param args 删除条件
  87. * @return 删除是否成功
  88. */
  89. override fun delete(args: List<SFilter>): Boolean {
  90. return try {
  91. mapper.delete(entityClass, args, HashMap())
  92. } catch (e: Exception) {
  93. e.printStackTrace()
  94. false
  95. }
  96. } // Fun delete()
  97. /**
  98. * 删除所有记录
  99. *
  100. * @return 删除是否成功
  101. */
  102. override fun deleteAll(): Boolean {
  103. return try {
  104. mapper.deleteAll(entityClass)
  105. } catch (e: Exception) {
  106. e.printStackTrace()
  107. false
  108. }
  109. } // Fun deleteAll()
  110. /**
  111. * 根据条件更新
  112. *
  113. * @param projection 将被更新的字段列表(以逗号分隔),为空表示更新所有非空字段
  114. * @param args 删除条件
  115. * @return 更新是否成功
  116. */
  117. override fun update(entity: ENTITY, projection: ArrayList<String>?, args: List<SFilter>?): Boolean {
  118. return try {
  119. mapper.update(entityClass, entity.toUpdateRow(), projection, args, HashMap())
  120. } catch (e: Exception) {
  121. e.printStackTrace()
  122. false
  123. }
  124. } // Fun update()
  125. /**
  126. * 根据条件查询记录
  127. *
  128. * @param args 查询条件
  129. * @return 查询构造器
  130. */
  131. override fun select(args: List<SFilter>): SQueryBuilder<ENTITY> {
  132. // 以下循环解决 “SingletonList cannot be cast to java.util.ArrayList” 错误。
  133. val filterList = ArrayList<SFilter>()
  134. args.forEach {
  135. filterList.add(it)
  136. }
  137. return SQueryBuilder(this, filterList)
  138. } // Fun select()
  139. /**
  140. * 根据条件查询所有记录
  141. *
  142. * @return 查找的记录
  143. */
  144. override fun selectAll(): SQueryBuilder<ENTITY> {
  145. val sQueryBuilder = SQueryBuilder(this, ArrayList())
  146. // sQueryBuilder.count = 999999999
  147. sQueryBuilder.limit(999999999)
  148. logger.debug("查询记录:${sQueryBuilder.toJson()}")
  149. return sQueryBuilder
  150. } // Fun selectAll()
  151. /**
  152. * 执行查询操作
  153. *
  154. * @param builder 查询查询构造器
  155. * @return 查询到的记录
  156. */
  157. override fun execQuery(builder: SQueryBuilder<ENTITY>): ArrayList<ENTITY> {
  158. val result = ArrayList<ENTITY>()
  159. for (row in mapper.execQuery(entityClass, builder, HashMap())) {
  160. try {
  161. result.add(rowParser.parseRow(row))
  162. } catch (e: Exception) {
  163. // DO NOTHING
  164. }
  165. }
  166. return result
  167. } // Fun exec()
  168. /**
  169. * 执行统计个数操作
  170. *
  171. * @param builder 查询查询构造器
  172. * @return 查询到的记录
  173. */
  174. override fun execCount(builder: SQueryBuilder<ENTITY>): Long {
  175. val list = mapper.execCount(entityClass, builder, HashMap())
  176. if (list.size == 1) {
  177. return list[0]
  178. }
  179. return list.size.toLong()
  180. } // Fun execCount()
  181. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  182. // 级联操作相关
  183. /**
  184. * 查询级联关系
  185. *
  186. * @param table 表名
  187. * @param id1 对象表ID字段名
  188. * @param id2 级联对象ID字段名
  189. * @param self 自身级联
  190. * @param filter 附加过滤条件
  191. * @param idList 对象ID列表
  192. * @return 关系列表
  193. */
  194. override fun relationQuery(table: String, id1: String, id2: String, self: Boolean, filter: String, idList: ArrayList<Any>): ArrayList<HashMap<String, Any>> {
  195. return mapper.relationQuery(table, id1, id2, self, filter, idList, HashMap());
  196. } // Fun cascadeIdList()
  197. } // Class SAbstractMybatisDao