SAbstractMybatisDao.kt 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. /*
  2. * *********************************************************************************************************************
  3. *
  4. * !!
  5. * .F88X
  6. * X8888Y
  7. * .}888888N;
  8. * i888888N; .:! .I$WI:
  9. * R888888I .'N88~ i8}+8Y&8"l8i$8>8W~'>W8}8]KW+8IIN"8&
  10. * .R888888I .;N8888~ .X8' "8I.!,/8" !%NY8`"8I8~~8>,88I
  11. * +888888N; .8888888Y "&&8Y.}8,
  12. * ./888888N; .R888888Y .'}~ .>}'.`+> i}! "i' +/' .'i~ !11,.:">, .~]! .i}i
  13. * ~888888%: .I888888l .]88~`1/iY88Ii+1'.R$8$8]"888888888> Y8$ W8E X8E W8888'188Il}Y88$*
  14. * 18888888 E8888881 .]W%8$`R8X'&8%++N8i,8N%N8+l8%` .}8N:.R$RE%N88N%N$K$R 188,FE$8%~Y88I
  15. * .E888888I .i8888888' .:$8I;88+`E8R:/8N,.>881.`$8E/1/]N8X.Y8N`"KF&&FK!'88*."88K./$88%RN888+~
  16. * 8888888I .,N888888~ ~88i"8W,!N8*.I88.}888%F,i$88"F88" 888:E8X.>88!i88>`888*.}Fl1]*}1YKi'
  17. * i888888N' I888Y ]88;/EX*IFKFK88X K8R .l8W 88Y ~88}'88E&%8W.X8N``]88!.$8K .:W8I
  18. * .i888888N; I8Y .&8$ .X88! i881.:%888>I88 ;88] +88+.';;;;:.Y88X 18N.,88l .+88/
  19. * .:R888888I
  20. * .&888888I Copyright (c) 2016-2020. 博锐尚格科技股份有限公司
  21. * ~8888'
  22. * .!88~ All rights reserved.
  23. *
  24. * *********************************************************************************************************************
  25. */
  26. package com.persagy.mybatis
  27. import com.persagy.base.extensions.toJson
  28. import com.persagy.database.*
  29. import com.persagy.database.extensions.keyColumnList
  30. import com.persagy.database.extensions.keyFieldList
  31. import com.persagy.mybatis.extensions.toInsertRow
  32. import com.persagy.mybatis.extensions.toUpdateRow
  33. import org.slf4j.LoggerFactory
  34. /**
  35. * Mybatis基础Dao操作
  36. *
  37. * @author 庞利祥 <sybotan@126.com>
  38. */
  39. abstract class SAbstractMybatisDao<ENTITY: Any>(entityClazz: Class<ENTITY>) : SAbstractDao<ENTITY>(entityClazz) {
  40. /** 静态对象 */
  41. companion object {
  42. /** 日志记录器 */
  43. private val logger = LoggerFactory.getLogger(SAbstractMybatisDao::class.java)
  44. } // companion object
  45. /** sql映射对象*/
  46. abstract val mapper: IBaseMapper<ENTITY>
  47. /** 读取记录行解析器 */
  48. private val rowParser = SRowParser(entityClazz)
  49. /**
  50. * 在数据库中插入实体
  51. *
  52. * @param entity 插入数据库的实体
  53. * @return 手入是否成功
  54. */
  55. override fun insert(entity: ENTITY): Boolean {
  56. val entityMap = entity.toInsertRow()
  57. val result = mapper.insert(entityClass, entityMap)
  58. try {
  59. if (entityMap.containsKey("_id")) {
  60. val id = entityMap["_id"]
  61. val keyField = entity::class.java.keyFieldList()[0]
  62. val accessible = keyField.isAccessible //canAccess(entity)
  63. keyField.isAccessible = true
  64. keyField.set(entity, id)
  65. keyField.isAccessible = accessible
  66. }
  67. } catch (e: Exception) {
  68. // DO NOTHING
  69. }
  70. return result
  71. } // Fun insert()
  72. /**
  73. * 在数据库中插入实体
  74. *
  75. * @param entity 插入数据库的实体
  76. * @return 手入是否成功
  77. */
  78. override fun replace(entity: ENTITY): Boolean {
  79. return try {
  80. mapper.replace(entityClass, entity.toInsertRow(), entity.javaClass.keyColumnList())
  81. } catch (e: Exception) {
  82. e.printStackTrace()
  83. false
  84. }
  85. } // Fun replace()
  86. /**
  87. * 根据条件删除
  88. *
  89. * @param args 删除条件
  90. * @return 删除是否成功
  91. */
  92. override fun delete(args: List<SFilter>): Boolean {
  93. return try {
  94. mapper.delete(entityClass, args, HashMap())
  95. } catch (e: Exception) {
  96. e.printStackTrace()
  97. false
  98. }
  99. } // Fun delete()
  100. /**
  101. * 删除所有记录
  102. *
  103. * @return 删除是否成功
  104. */
  105. override fun deleteAll(): Boolean {
  106. return try {
  107. mapper.deleteAll(entityClass)
  108. } catch (e: Exception) {
  109. e.printStackTrace()
  110. false
  111. }
  112. } // Fun deleteAll()
  113. /**
  114. * 根据条件更新
  115. *
  116. * @param projection 将被更新的字段列表(以逗号分隔),为空表示更新所有非空字段
  117. * @param args 删除条件
  118. * @return 更新是否成功
  119. */
  120. override fun update(entity: ENTITY, projection: ArrayList<String>?, args: List<SFilter>?): Boolean {
  121. return try {
  122. mapper.update(entityClass, entity.toUpdateRow(), projection, args, HashMap())
  123. } catch (e: Exception) {
  124. e.printStackTrace()
  125. false
  126. }
  127. } // Fun update()
  128. /**
  129. * 根据条件查询记录
  130. *
  131. * @param args 查询条件
  132. * @return 查询构造器
  133. */
  134. override fun select(args: List<SFilter>): SQueryBuilder<ENTITY> {
  135. // 以下循环解决 “SingletonList cannot be cast to java.util.ArrayList” 错误。
  136. val filterList = ArrayList<SFilter>()
  137. args.forEach {
  138. filterList.add(it)
  139. }
  140. return SQueryBuilder(this, filterList)
  141. } // Fun select()
  142. /**
  143. * 根据条件查询所有记录
  144. *
  145. * @return 查找的记录
  146. */
  147. override fun selectAll(): SQueryBuilder<ENTITY> {
  148. val sQueryBuilder = SQueryBuilder(this, ArrayList())
  149. // sQueryBuilder.count = 999999999
  150. sQueryBuilder.limit(999999999)
  151. logger.debug("查询记录:${sQueryBuilder.toJson()}")
  152. return sQueryBuilder
  153. } // Fun selectAll()
  154. /**
  155. * 执行查询操作
  156. *
  157. * @param builder 查询查询构造器
  158. * @return 查询到的记录
  159. */
  160. override fun execQuery(builder: SQueryBuilder<ENTITY>): ArrayList<ENTITY> {
  161. val result = ArrayList<ENTITY>()
  162. for (row in mapper.execQuery(entityClass, builder, HashMap())) {
  163. try {
  164. result.add(rowParser.parseRow(row))
  165. } catch (e: Exception) {
  166. // DO NOTHING
  167. }
  168. }
  169. return result
  170. } // Fun exec()
  171. /**
  172. * 执行统计个数操作
  173. *
  174. * @param builder 查询查询构造器
  175. * @return 查询到的记录
  176. */
  177. override fun execCount(builder: SQueryBuilder<ENTITY>): Long {
  178. val list = mapper.execCount(entityClass, builder, HashMap())
  179. if (list.size == 1) {
  180. return list[0]
  181. }
  182. return list.size.toLong()
  183. } // Fun execCount()
  184. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  185. // 级联操作相关
  186. /**
  187. * 查询级联关系
  188. *
  189. * @param table 表名
  190. * @param id1 对象表ID字段名
  191. * @param id2 级联对象ID字段名
  192. * @param self 自身级联
  193. * @param filter 附加过滤条件
  194. * @param idList 对象ID列表
  195. * @return 关系列表
  196. */
  197. override fun relationQuery(table: String, id1: String, id2: String, self: Boolean, filter: String, idList: ArrayList<Any>): ArrayList<HashMap<String, Any>> {
  198. return mapper.relationQuery(table, id1, id2, self, filter, idList, HashMap());
  199. } // Fun cascadeIdList()
  200. } // Class SAbstractMybatisDao