在使用tkMyBatis时,Dao层直接继承的Mapper<T>,就可以使用已有的函数进行CRUD,但是有的时候,检索的时候不需要返回所有的列,如果能像Mybatis之前在xml里面指明返回哪些列,岂不是更加有效率。

于是,简单查看了一下Mapper<T>的内容,如果只关注select的部分,按照Mapper<T>->BaseMapper<T>->BaseSelectMapper<T>->SelectOneMapper<T>,可以查看到SelectOne方法的接口。

public interface SelectOneMapper<T> {@SelectProvider(type = BaseSelectProvider.class, method = "dynamicSQL")T selectOne(T record);
}

标签@SelectProvider

mybatis3之后提供的,用于灵活的设置sql来源,这里设置了服务提供类和方法,但这个库并没有直接用method指定的方法来返回sql,而是在运行时进行解析的。

在查看BaseSelectProvider,在里面找到selectOne的具体实现,简单来说就是返回了一个String类型的sql语句。

    public String selectOne(MappedStatement ms) {Class<?> entityClass = getEntityClass(ms);//修改返回值类型为实体类型setResultType(ms, entityClass);StringBuilder sql = new StringBuilder();sql.append(SqlHelper.selectAllColumns(entityClass));sql.append(SqlHelper.fromTable(entityClass, tableName(entityClass)));sql.append(SqlHelper.whereAllIfColumns(entityClass, isNotEmpty()));return sql.toString();}

可以看到,selectOne通过SqlHelper.selectAllColums包含了所有列。其他select相关的函数,也是返回所有列的,所以如果直接继承tkMyBatis的 Mapper<T>,那么检索相关就一定会返回所有列。
既然 @SelectProvider指定了tkMyBatis定义的这些接口实际的sql语句,那么为了返回指定的列,就可以考虑自定义SelectProvider类,来实现高效率的检索。

实现如下:

BookDao.interface

public interface BookDao extends Mapper<Book> {@SelectProvider(type = BookSelectProvider.class, method = "selectIdAndName")@ResultMap("BookResultMap")public Book selectIdAndName(@Param("id") Integer id);
}

注意:ResultMap一定要在xml中定义,否则找不到返回类型,同时,如果结果可能是多个,要使用List类型的返回结果定义接口。

BookSelectProvider.java

public class BookSelectProvider {public String selectIdAndName(int id) {return "select id,name from book where id = " + id;}
}

Book.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sherry.demo.mapper.BookDao"><resultMap id="BookResultMap" type="com.sherry.demo.entity.Book"><id column="id" property="id" jdbcType="INTEGER" /><result column="name" property="name" jdbcType="VARCHAR" /></resultMap>
</mapper>

Book.java

public class Book {@Id@GeneratedValue(generator = "JDBC")private Integer id;private String name;@Column(name="price")private double price;// get set toString省略
}

tkMyBatis 检索时返回指定列相关推荐

  1. 比对数组指定列php,指定列的数组

    ## 返回指定列的数组(array_column) ~~~ if(!function_exists('array_column')){ /** * 获取数组指定列,然后返回数组 * @param ar ...

  2. FreeSql (八)插入数据时指定列

    插入数据时指定列,和忽略列对应,未被指定的列将被忽略. var connstr = "Data Source=127.0.0.1;Port=3306;User ID=root;Passwor ...

  3. python csv文件和xlsx文件混杂时,提取指定列数据并合并

    这篇文章是R语言 如何合并csv文件(批量读取csv文件)的姊妹篇.提供更为强大的功能. 解决的问题是提取csv文件和xlsx文件混杂时,文件合并问题.具体来说,下面的代码是提取指定列文本,简单清洗后 ...

  4. 【PhpSpreadsheet】实现excel冻结列和行(即左右滚动时指定列和行固定不动)

    composer require phpoffice/phpspreadsheet 版本:^1.18 在做表格数据导出时,如何冻结列和行(即左右滚动时冻结的列和行固定不动) 代码 $spreadshe ...

  5. python set没有顺序_Python一题多解学思路:指定列前置

    前言 熟读 Python 基本数据结构,但实际应用时却大脑短路,无法解决问题? 熟悉 pandas ,但遇到没有内置的方法,就不知所措? 如果你有这种情况,那么你缺少的是解决问题的思路. 经常向我提问 ...

  6. python列表按照指定顺序排序-Python3实现对列表按元组指定列进行排序的方法分析...

    本文实例讲述了Python3实现对列表按元组指定列进行排序的方法.分享给大家供大家参考,具体如下: Python版本: python3.+ 运行环境: Mac OS IDE: pycharm Pyth ...

  7. .net core webapi 列表返回指定的字段_ADO.NET 使用初探之SQL操作 | C# 数据操作系列...

    0.前言 在上一篇中初略的介绍了一下SQL的基本写法,这一篇开始我们正式步入C#操作数据库的范围.通过这一系列的内容,我想大家能对于数据库交互有了一定的认识和基础.闲话不多说,先给大家介绍一个C#操作 ...

  8. orm提取指定列_使用ORM提取数据很容易! 是吗?

    orm提取指定列 介绍 几乎所有系统都以某种方式与外部数据存储一起运行. 在大多数情况下,它是一个关系数据库,并且通常将数据获取委托给某些ORM实现. ORM涵盖了很多例程,并且带来了一些新的抽象作为 ...

  9. delphi listview1添加指定列_对表格的列进行批量处理的函数详解

    Table.TransformColumns Table.TransformColumns(table as table, transformOperations as list, optional ...

最新文章

  1. Attention!注意力机制模型最新综述(附下载)
  2. 贾斯帕马斯基林的故事笔记
  3. 那些不回微信的人,都在看什么?
  4. 浅谈百度司南大数据企业的风向标
  5. Hadoop的详细配置(持续更新)
  6. java文件 空心_解决Eclipse中java文件的图标变成空心J的问题
  7. [UE4]Expandable Area可展开的区域
  8. 2021年编程语言排行榜出炉,第一名实至名归!
  9. [论文速览]A Neural Attention Model for Sentence Summarization
  10. [深度学习]CNN的基础结构与核心思想
  11. Android签名证书的生成
  12. jqury ajax 标准
  13. 电脑是怎么把代码转换成可执行程序的?
  14. python中da_python数据类型一
  15. 北京,有2000万人假装在生活
  16. EasyPlayerPro RTMP播放器助力远程娃娃机直播抓娃娃技术方案
  17. 喜马拉雅追更攻略:如何订阅更新通知
  18. 基于Spring boot开发电子宿舍管理系统毕业设计源码132056
  19. iOS仿QQ分组效果
  20. request.js

热门文章

  1. Flutter从入门到实战(一)之环境搭建(Mac版)
  2. el-upload 限制上传数量,然后隐藏加号
  3. CSRF攻击原理以及防御方法
  4. linux usb免驱麦克风,pyaudio检测不到USB 麦克风
  5. 又拍云+springboot+element实现头像上传并将外链地址存到数据库
  6. uniCloud - 云存储及文件上传
  7. mysql语法——基于palo数据库
  8. js中unload什么意思_JS之onunload、onbeforeunload事件详解
  9. 小G砍树 (换根dp)
  10. 服务器充电桩是什么显示,服务区有充电桩吗,汽车充电桩介绍