AbstractService.java 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. package me.zhengjie.archives.plus;
  2. import java.lang.reflect.Field;
  3. import java.util.Collection;
  4. import java.util.List;
  5. import java.util.Map;
  6. import org.apache.ibatis.logging.Log;
  7. import org.apache.ibatis.logging.LogFactory;
  8. import org.apache.ibatis.reflection.property.PropertyNamer;
  9. import com.baomidou.mybatisplus.core.conditions.Wrapper;
  10. import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
  11. import com.baomidou.mybatisplus.core.metadata.IPage;
  12. import com.baomidou.mybatisplus.core.toolkit.LambdaUtils;
  13. import com.baomidou.mybatisplus.core.toolkit.support.LambdaMeta;
  14. import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
  15. import com.baomidou.mybatisplus.extension.service.IService;
  16. public interface AbstractService<T> extends IService<T> {
  17. static final Log logger = LogFactory.getLog(AbstractService.class);
  18. /**
  19. * 博客地址:https://blog.csdn.net/qq_19266669/article/details/114369195
  20. * 查看AbstractLambdaWrapper通过方法得到字段名称
  21. *
  22. * @param column
  23. * @return
  24. */
  25. default String columnToString(SFunction<T, ?> column) {
  26. return column.toString();
  27. };
  28. /**
  29. * 根据 entity 条件,删除记录
  30. *
  31. * @param queryWrapper 实体包装类
  32. * {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
  33. */
  34. default boolean remove(T t) {
  35. Wrapper<T> queryWrapper = QueryWrapperUtil.convertQuery(t);
  36. return remove(queryWrapper);
  37. }
  38. /**
  39. * 根据 whereEntity 条件,更新记录
  40. *
  41. * @param entity 实体对象
  42. * @param updateWrapper 实体对象封装操作类
  43. * {@link com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper}
  44. * @throws SecurityException
  45. * @throws NoSuchFieldException
  46. */
  47. default boolean update(T entity, SFunction<T, ?> column, Object value) {
  48. try {
  49. UpdateWrapper<T> updateWrapper = new UpdateWrapper<>();
  50. // 这里使用反射得到字段,
  51. String conditions = columnToString(column);
  52. updateWrapper.eq(conditions, value);
  53. return update(entity, updateWrapper);
  54. } catch (Exception e) {
  55. e.printStackTrace();
  56. }
  57. return false;
  58. }
  59. /**
  60. * 根据 whereEntity 条件,更新记录
  61. *
  62. * @param entity 实体对象
  63. * @param updateWrapper 实体对象封装操作类
  64. * {@link com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper}
  65. * @throws SecurityException
  66. * @throws NoSuchFieldException
  67. */
  68. default boolean update(T entity, String column, Object value) {
  69. try {
  70. UpdateWrapper<T> updateWrapper = new UpdateWrapper<>();
  71. updateWrapper.eq(column, value);
  72. return update(entity, updateWrapper);
  73. } catch (Exception e) {
  74. e.printStackTrace();
  75. }
  76. return false;
  77. }
  78. default boolean update(T entity, SFunction<T, ?> column) {
  79. // 这里是反射,通过反射来得到
  80. // Field startRange = clazz.getDeclaredField(attribute[0]);
  81. // startRange.setAccessible(true);
  82. // Object val = startRange.get(obj);
  83. try {
  84. String columnName = columnToString(column);
  85. String fieldName = getFieldName(column);
  86. Class<?> clazz = entity.getClass();
  87. Field field = clazz.getDeclaredField(fieldName);
  88. // 抑制Java对修饰符的检查
  89. field.setAccessible(true);
  90. Object value = field.get(entity);
  91. field.set(entity, null);
  92. return update(entity, columnName, value);
  93. } catch (Exception e) {
  94. logger.error("update class" + entity.getClass() + " exception :" + e.getMessage());
  95. return false;
  96. }
  97. }
  98. default String getFieldName(SFunction<T, ?> column) {
  99. LambdaMeta meta = LambdaUtils.extract(column);
  100. String fieldName = PropertyNamer.methodToProperty(meta.getImplMethodName());
  101. return fieldName;
  102. }
  103. default boolean update(T entity, SFunction<T, ?> column, Collection<?> coll) {
  104. UpdateWrapper<T> updateWrapper = new UpdateWrapper<>();
  105. // 这里使用反射得到字段,
  106. try {
  107. String conditions = columnToString(column);
  108. updateWrapper.in(conditions, coll);
  109. return update(entity, updateWrapper);
  110. } catch (Exception e) {
  111. e.printStackTrace();
  112. }
  113. return false;
  114. }
  115. default boolean update(T entity, String conditions, Object... values) {
  116. UpdateWrapper<T> updateWrapper = new UpdateWrapper<>();
  117. updateWrapper.in(conditions, values);
  118. return update(entity, updateWrapper);
  119. }
  120. /**
  121. * 根据 Wrapper,查询一条记录 <br/>
  122. * <p>
  123. * 结果集,如果是多个会抛出异常,随机取一条加上限制条件 wrapper.last("LIMIT 1")
  124. * </p>
  125. *
  126. * @param queryWrapper 实体对象封装操作类
  127. * {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
  128. */
  129. default T getOne(T t) {
  130. Wrapper<T> queryWrapper = QueryWrapperUtil.convertQuery(t);
  131. return getOne(queryWrapper, true);
  132. }
  133. default Map<String, Object> getMap(T t) {
  134. Wrapper<T> queryWrapper = QueryWrapperUtil.convertQuery(t);
  135. return getMap(queryWrapper);
  136. }
  137. /**
  138. * 根据 Wrapper 条件,查询总记录数
  139. *
  140. * @param queryWrapper 实体对象封装操作类
  141. * {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
  142. */
  143. default long count(T t) {
  144. Wrapper<T> queryWrapper = QueryWrapperUtil.convertQuery(t);
  145. return count(queryWrapper);
  146. }
  147. /**
  148. * 查询列表
  149. *
  150. * @param queryWrapper 实体对象封装操作类
  151. * {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
  152. */
  153. default List<T> list(T t) {
  154. Wrapper<T> queryWrapper = QueryWrapperUtil.convertQuery(t);
  155. return list(queryWrapper);
  156. }
  157. /**
  158. * 查询列表
  159. *
  160. * @param queryWrapper 实体对象封装操作类
  161. * {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
  162. */
  163. default List<Map<String, Object>> listMaps(T t) {
  164. Wrapper<T> queryWrapper = QueryWrapperUtil.convertQuery(t);
  165. return listMaps(queryWrapper);
  166. }
  167. /**
  168. * 根据 Wrapper 条件,查询全部记录
  169. *
  170. * @param queryWrapper 实体对象封装操作类
  171. * {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
  172. */
  173. default List<Object> listObjs(T t) {
  174. Wrapper<T> queryWrapper = QueryWrapperUtil.convertQuery(t);
  175. return listObjs(queryWrapper);
  176. }
  177. /**
  178. * 翻页查询
  179. *
  180. * @param page 翻页对象
  181. * @param queryWrapper 实体对象封装操作类
  182. * {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
  183. */
  184. default <E extends IPage<T>> E page(E page, T t) {
  185. Wrapper<T> queryWrapper = QueryWrapperUtil.convertQuery(t);
  186. try {
  187. return page(page, queryWrapper);
  188. } catch (Exception e) {
  189. e.printStackTrace();
  190. }
  191. return null;
  192. }
  193. }