1.针对mybatis 我们 逆向工程生成的代码  有个方法 selectByExample

<select id="selectByExample" resultMap="BaseResultMap" parameterType="com.wuss.model.hotel.HotelCityInfoCriteria" ><!--WARNING -  该映射文件为自动生成, 请勿修改.-->select<if test="distinct" >distinct</if><include refid="Base_Column_List" />from hotel_city_info<if test="_parameter != null" ><include refid="Example_Where_Clause" /></if><if test="orderByClause != null" >order by ${orderByClause}</if><if test="limit != 0 " >limit ${start} , ${limit}</if></select><sql id="Base_Column_List" ><!--WARNING -  该映射文件为自动生成, 请勿修改.-->id, city_name, city_code, full_pin_yin, short_pin_yin</sql>

那么查询的时候就等价于 select * ,

没法只查询指定列,加快查询,如果想要查询指定列 的时候手写sql 又比较麻烦,能否可以 灵活的只查询指定列?

因此本人写了一个 只查询指定列的工具类

@Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class}),}
)
@Slf4j
public class SelectSpecificValue implements Interceptor {//private String selectMethod;private boolean showLog;private Properties properties;/*** 需要查询数据库的指定列和excludeThreadLocal不能共存* @author: wuss@wjs.com* @date: 2021/5/11 4:19 PM* @return:*/protected static final ThreadLocal<List<String>> threadLocal = new ThreadLocal<>();/*** 排除查询数据库的指定列 和threadLocal不能共存*/protected static final ThreadLocal<List<String>> excludeThreadLocal = new ThreadLocal<>();public static void setSelectList(List<String> list) {if (CollectionUtils.isNotEmpty(list)) {threadLocal.set(list);}}public static void setExcludeSelectList(List<String> list){if (CollectionUtils.isNotEmpty(list)) {excludeThreadLocal.set(list);}}private boolean dealSelectListFlag(){List<String> selectList = threadLocal.get();List<String> excludeList = excludeThreadLocal.get();if (CollectionUtils.isNotEmpty(selectList) && CollectionUtils.isNotEmpty(excludeList)){throw new BaseException("查询指定列 和 排除指定列不能共存");}if (CollectionUtils.isNotEmpty(selectList)){return true;}if (CollectionUtils.isNotEmpty(excludeList)){return true;}return false;}@Overridepublic Object intercept(Invocation invocation) throws Throwable {RoutingStatementHandler target = (RoutingStatementHandler) invocation.getTarget();MetaObject metaObject = SystemMetaObject.forObject(target);BoundSql boundSql = (BoundSql) metaObject.getValue("delegate.boundSql");MappedStatement statement = (MappedStatement) metaObject.getValue("delegate.mappedStatement");String id = statement.getId();if (id.indexOf(selectMethod) < 0 || !dealSelectListFlag()) {return invocation.proceed();}StringBuilder sb = buildSql(boundSql);metaObject = SystemMetaObject.forObject(boundSql);metaObject.setValue("sql", sb.toString());if (showLog){log.info("查询指定列sql:{}", sb.toString());}sb.setLength(0);Object proceed = null;try {proceed = invocation.proceed();}finally {clearThreadLocal();}return proceed;}private void clearThreadLocal() {threadLocal.remove();excludeThreadLocal.remove();}private StringBuilder buildSql(BoundSql boundSql) {String sql = boundSql.getSql();int index = sql.indexOf("from ");if (index <0){log.info("sql 语句异常:{}",sql);throw new BaseException("sql 语句异常");}StringBuilder sb = new StringBuilder();if (CollectionUtils.isNotEmpty(threadLocal.get())){buildSelectThreadLocal(sql, index, sb);return sb;}buildExcludeSelectThreadLocal(sql,index,sb);return sb;}private void buildSelectThreadLocal(String sql, int index, StringBuilder sb) {sb.append("select ");for (String s : threadLocal.get()) {sb.append(s + ",");}sb.setLength(sb.length() - 1);sb.append(" ");sb.append(sql.substring(index));}private void buildExcludeSelectThreadLocal(String sql, int index, StringBuilder sb) {String preStr = sql.substring(0, index);for (String s : excludeThreadLocal.get()) {preStr = preStr.replaceFirst(",? *\t*"+s,"");}preStr = preStr.replaceFirst("select[ *\t*\n*]*,","select  ");sb.append(preStr);sb.append(" ");sb.append(sql.substring(index));}@Overridepublic Object plugin(Object target) {return Plugin.wrap(target, this);}@Overridepublic void setProperties(Properties properties) {this.properties = properties;}public String getSelectMethod() {return selectMethod;}public void setSelectMethod(String selectMethod) {this.selectMethod = selectMethod;}public boolean isShowLog() {return showLog;}public void setShowLog(boolean showLog) {this.showLog = showLog;}
}

在配置Bean的时候配置如下:

 <bean id="selectPlugin" class="com.wjs.tmc.util.SelectSpecificValue"><property name="selectMethod" value="selectByExample" /></bean>在配置 plugins

说明:

1.setSelectList 设置只查询指定字段

2.setExcludeSelectList 设置排除字段

且两者不能共存

为啥引入:ThreadLocal 为了线程安全 和 跨方法调用传参,查询出结果只会 remove 防止内存泄漏

使用:

mybatis 插件查询指定列相关推荐

  1. mysql 查询指定字段数据_MySQL使用select语句查询指定表中指定列(字段)的数据

    本文介绍mysql数据库中执行select查询语句,查询指定列的数据,即指定字段的数据. 再来回顾一下sql语句中的select语句的语法: select 语句的基本语法: select from w ...

  2. 表、数据的增删改查(所有列、指定列、添加常量、字段起别名、和并列、去除重复、条件查询、比较、判断空、模糊查询)...

    表的增减改查 desc tablename;查看表结构 drop table name;删除表 字段增改删:格式 alter table tablename add column name varch ...

  3. mysql select 指定列_MySQL使用select语句查询指定表中指定列(字段)的数据

    本文介绍mysql数据库中执行select查询语句,查询指定列的数据,即指定字段的数据. 再来回顾一下sql语句中的select语句的语法: select 语句的基本语法: select from w ...

  4. SQL service基础(二)对数据指定列查询、条件查询、查询结果排序、聚集函数查询、分组统计查询

    实验目标: 1.掌握指定列或全部列查询 2.掌握按条件查询 3.掌握对查询结果排序 4.掌握使用聚集函数的查询 5.掌握分组统计查询 一.请完成书中实验7.1,并完成以下问题. 1.查询所有学生的姓名 ...

  5. android:查询数据库 指定列 指定列名 并输出查询结果(如查询电话本,SMS的ContentResolver提供的)

    如查询电话本,SMS的ContentResolver提供的cursor = getContentResolver().query(Uri.parse("content://sms/inbox ...

  6. 优雅的利用Mybatis插件实现sql查询耗时统计

    优雅的利用Mybatis插件实现sql查询耗时统计 一. Mybatis反射机制讲解 二. 代理模式讲解 静态代理 动态代理 JDK动态代理参考代码 Proxy.newProxyInstance(xx ...

  7. mybatis 取查询值_MyBatis面试题集合,90%会遇到这些问题

    点击蓝字关注我们吧! 1.#{}和${}的区别是什么? ${}是Properties文件中的变量占位符,它可以用于标签属性值和sql内部,属于静态文本替换,比如${driver}会被静态替换为com. ...

  8. MyBatis(四)MyBatis插件原理

    MyBatis插件原理 MyBatis对开发者非常友好,它通过提供插件机制,让我们可以根据自己的需要去增强MyBatis的功能.其底层是使用了代理模式+责任链模式 MyBatis官方https://m ...

  9. SpringCloud或SpringBoot+Mybatis-Plus利用mybatis插件实现数据操作记录及更新对比

    引文 本文主要介绍如何使用mybatis插件实现拦截数据库操作并根据不同需求进行数据对比分析,主要适用于系统中需要对数据操作进行记录.在更新数据时准确记录更新字段 核心:mybatis插件(拦截器). ...

最新文章

  1. 【正一专栏】曼城攻击力惊人露出冠军相
  2. java中形参不可以是对象吗_(重要)java都是值传递,与对象形参所指向的对象改变,其实参所指向的对象也相应改变并不矛盾(2011年9.30日一天写的两个程序的总结结果)...
  3. 阿里1682亿背后的协同研发云——云效正式商业化
  4. Oracle学习(十五)PLSQL安装
  5. openshift_Openshift源中的高可用性Drools无状态服务
  6. Swing应用程序中的CDI事件可将UI与事件处理分离
  7. Django学习---原生ajax
  8. 关于Image创建的内存管理
  9. java及java web学习笔记
  10. mysql连接量设置_mysql连接数设置操作方法(Too many connections)
  11. linux监测服务日志脚本,LINUX下的一个性能监测脚本
  12. Setup Factory打包winform程序
  13. 推荐算法之协同过滤算法详解(原理,流程,步骤,适用场景)
  14. Generative Face Completion
  15. Windows聚焦问题修复
  16. 关于Bmob的一些浅述
  17. Ubuntu 18.04 2080ti 安装显卡驱动
  18. 帝国CMS(EmpireCMS) v7.5配置文件写入漏洞分析
  19. Write-Ahead Log(WAL)的工作原理
  20. Ubuntu 查看Nvidia显卡驱动信息

热门文章

  1. 什么是中间件?常见中间件有哪些?
  2. 如何让冰冷的数据说“人话”?头部房产平台这么做|学员分享
  3. 心里话python_一个老运维的心里话
  4. 一直想说的心里话:由保研事件看出一个人的劣根性。
  5. xfce添加快捷图标
  6. 8086 汇编寄器基础篇 物理地址- 寻址方式 - 寄存器说明
  7. c语言怎么比较两个字母大小,C语言strcmp()函数:比较两个字符串的大小
  8. 第五人格为什么总是服务器维护,《第五人格》闪退怎么办 第五人格闪退解决方式...
  9. 如何使用word管理参考论文——交叉引用
  10. 《林超:给年轻人的跨学科通识课》导图 07:认知科学模型