SqlRunner.java 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. /*
  2. * Copyright (c) 2011-2020, baomidou (jobob@qq.com).
  3. * <p>
  4. * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  5. * use this file except in compliance with the License. You may obtain a copy of
  6. * the License at
  7. * <p>
  8. * https://www.apache.org/licenses/LICENSE-2.0
  9. * <p>
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  12. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  13. * License for the specific language governing permissions and limitations under
  14. * the License.
  15. */
  16. package com.baomidou.mybatisplus.extension.toolkit;
  17. import com.baomidou.mybatisplus.core.assist.ISqlRunner;
  18. import com.baomidou.mybatisplus.core.metadata.IPage;
  19. import com.baomidou.mybatisplus.core.toolkit.GlobalConfigUtils;
  20. import com.baomidou.mybatisplus.core.toolkit.StringUtils;
  21. import org.apache.ibatis.logging.Log;
  22. import org.apache.ibatis.logging.LogFactory;
  23. import org.apache.ibatis.session.SqlSession;
  24. import org.apache.ibatis.session.SqlSessionFactory;
  25. import org.mybatis.spring.SqlSessionUtils;
  26. import org.springframework.transaction.annotation.Transactional;
  27. import java.util.HashMap;
  28. import java.util.List;
  29. import java.util.Map;
  30. /**
  31. * SqlRunner 执行 SQL
  32. *
  33. * @author Caratacus
  34. * @since 2016-12-11
  35. */
  36. public class SqlRunner implements ISqlRunner {
  37. private Log log = LogFactory.getLog(SqlRunner.class);
  38. // 单例Query
  39. public static final SqlRunner DEFAULT = new SqlRunner();
  40. // 默认FACTORY
  41. // public static SqlSessionFactory FACTORY;
  42. private SqlSessionFactory sqlSessionFactory;
  43. private Class<?> clazz;
  44. public SqlRunner() {
  45. this.sqlSessionFactory = SqlHelper.FACTORY;
  46. }
  47. public SqlRunner(Class<?> clazz) {
  48. this.clazz = clazz;
  49. }
  50. /**
  51. * 获取默认的SqlQuery(适用于单库)
  52. *
  53. * @return ignore
  54. */
  55. public static SqlRunner db() {
  56. // 初始化的静态变量 还是有前后加载的问题 该判断只会执行一次
  57. if (DEFAULT.sqlSessionFactory == null) {
  58. DEFAULT.sqlSessionFactory = SqlHelper.FACTORY;
  59. }
  60. return DEFAULT;
  61. }
  62. /**
  63. * 根据当前class对象获取SqlQuery(适用于多库)
  64. *
  65. * @param clazz ignore
  66. * @return ignore
  67. */
  68. public static SqlRunner db(Class<?> clazz) {
  69. return new SqlRunner(clazz);
  70. }
  71. @Transactional
  72. @Override
  73. public boolean insert(String sql, Object... args) {
  74. SqlSession sqlSession = sqlSession();
  75. try {
  76. return SqlHelper.retBool(sqlSession.insert(INSERT, sqlMap(sql, args)));
  77. } finally {
  78. closeSqlSession(sqlSession);
  79. }
  80. }
  81. @Transactional
  82. @Override
  83. public boolean delete(String sql, Object... args) {
  84. SqlSession sqlSession = sqlSession();
  85. try {
  86. return SqlHelper.retBool(sqlSession.delete(DELETE, sqlMap(sql, args)));
  87. } finally {
  88. closeSqlSession(sqlSession);
  89. }
  90. }
  91. /**
  92. * 获取sqlMap参数
  93. *
  94. * @param sql 指定参数的格式: {0}, {1}
  95. * @param args 仅支持String
  96. * @return ignore
  97. */
  98. private Map<String, String> sqlMap(String sql, Object... args) {
  99. Map<String, String> sqlMap = new HashMap<>();
  100. sqlMap.put(SQL, StringUtils.sqlArgsFill(sql, args));
  101. return sqlMap;
  102. }
  103. @Transactional
  104. @Override
  105. public boolean update(String sql, Object... args) {
  106. SqlSession sqlSession = sqlSession();
  107. try {
  108. return SqlHelper.retBool(sqlSession.update(UPDATE, sqlMap(sql, args)));
  109. } finally {
  110. closeSqlSession(sqlSession);
  111. }
  112. }
  113. /**
  114. * 根据sql查询Map结果集
  115. * <p>SqlRunner.db().selectList("select * from tbl_user where name={0}", "Caratacus")</p>
  116. *
  117. * @param sql sql语句,可添加参数,格式:{0},{1}
  118. * @param args 只接受String格式
  119. * @return ignore
  120. */
  121. @Override
  122. public List<Map<String, Object>> selectList(String sql, Object... args) {
  123. SqlSession sqlSession = sqlSession();
  124. try {
  125. return sqlSession.selectList(SELECT_LIST, sqlMap(sql, args));
  126. } finally {
  127. closeSqlSession(sqlSession);
  128. }
  129. }
  130. /**
  131. * 根据sql查询一个字段值的结果集
  132. * <p>注意:该方法只会返回一个字段的值, 如果需要多字段,请参考{@code selectList()}</p>
  133. *
  134. * @param sql sql语句,可添加参数,格式:{0},{1}
  135. * @param args 只接受String格式
  136. * @return ignore
  137. */
  138. @Override
  139. public List<Object> selectObjs(String sql, Object... args) {
  140. SqlSession sqlSession = sqlSession();
  141. try {
  142. return sqlSession.selectList(SELECT_OBJS, sqlMap(sql, args));
  143. } finally {
  144. closeSqlSession(sqlSession);
  145. }
  146. }
  147. /**
  148. * 根据sql查询一个字段值的一条结果
  149. * <p>注意:该方法只会返回一个字段的值, 如果需要多字段,请参考{@code selectOne()}</p>
  150. *
  151. * @param sql sql语句,可添加参数,格式:{0},{1}
  152. * @param args 只接受String格式
  153. * @return ignore
  154. */
  155. @Override
  156. public Object selectObj(String sql, Object... args) {
  157. return SqlHelper.getObject(log, selectObjs(sql, args));
  158. }
  159. @Override
  160. public int selectCount(String sql, Object... args) {
  161. SqlSession sqlSession = sqlSession();
  162. try {
  163. return SqlHelper.retCount(sqlSession.<Integer>selectOne(COUNT, sqlMap(sql, args)));
  164. } finally {
  165. closeSqlSession(sqlSession);
  166. }
  167. }
  168. @Override
  169. public Map<String, Object> selectOne(String sql, Object... args) {
  170. return SqlHelper.getObject(log, selectList(sql, args));
  171. }
  172. /**
  173. * 获取Session 默认自动提交
  174. */
  175. private SqlSession sqlSession() {
  176. return (clazz != null) ? SqlSessionUtils.getSqlSession(GlobalConfigUtils.currentSessionFactory(clazz)) : SqlSessionUtils.getSqlSession(sqlSessionFactory);
  177. }
  178. /**
  179. * 释放sqlSession
  180. *
  181. * @param sqlSession session
  182. */
  183. private void closeSqlSession(SqlSession sqlSession) {
  184. SqlSessionFactory sqlSessionFactory;
  185. if (clazz != null) {
  186. sqlSessionFactory = GlobalConfigUtils.currentSessionFactory(clazz);
  187. } else {
  188. sqlSessionFactory = DEFAULT.sqlSessionFactory;
  189. }
  190. SqlSessionUtils.closeSqlSession(sqlSession, sqlSessionFactory);
  191. }
  192. }