tkMyBatis 检索时返回指定列
在使用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 检索时返回指定列相关推荐
- 比对数组指定列php,指定列的数组
## 返回指定列的数组(array_column) ~~~ if(!function_exists('array_column')){ /** * 获取数组指定列,然后返回数组 * @param ar ...
- FreeSql (八)插入数据时指定列
插入数据时指定列,和忽略列对应,未被指定的列将被忽略. var connstr = "Data Source=127.0.0.1;Port=3306;User ID=root;Passwor ...
- python csv文件和xlsx文件混杂时,提取指定列数据并合并
这篇文章是R语言 如何合并csv文件(批量读取csv文件)的姊妹篇.提供更为强大的功能. 解决的问题是提取csv文件和xlsx文件混杂时,文件合并问题.具体来说,下面的代码是提取指定列文本,简单清洗后 ...
- 【PhpSpreadsheet】实现excel冻结列和行(即左右滚动时指定列和行固定不动)
composer require phpoffice/phpspreadsheet 版本:^1.18 在做表格数据导出时,如何冻结列和行(即左右滚动时冻结的列和行固定不动) 代码 $spreadshe ...
- python set没有顺序_Python一题多解学思路:指定列前置
前言 熟读 Python 基本数据结构,但实际应用时却大脑短路,无法解决问题? 熟悉 pandas ,但遇到没有内置的方法,就不知所措? 如果你有这种情况,那么你缺少的是解决问题的思路. 经常向我提问 ...
- python列表按照指定顺序排序-Python3实现对列表按元组指定列进行排序的方法分析...
本文实例讲述了Python3实现对列表按元组指定列进行排序的方法.分享给大家供大家参考,具体如下: Python版本: python3.+ 运行环境: Mac OS IDE: pycharm Pyth ...
- .net core webapi 列表返回指定的字段_ADO.NET 使用初探之SQL操作 | C# 数据操作系列...
0.前言 在上一篇中初略的介绍了一下SQL的基本写法,这一篇开始我们正式步入C#操作数据库的范围.通过这一系列的内容,我想大家能对于数据库交互有了一定的认识和基础.闲话不多说,先给大家介绍一个C#操作 ...
- orm提取指定列_使用ORM提取数据很容易! 是吗?
orm提取指定列 介绍 几乎所有系统都以某种方式与外部数据存储一起运行. 在大多数情况下,它是一个关系数据库,并且通常将数据获取委托给某些ORM实现. ORM涵盖了很多例程,并且带来了一些新的抽象作为 ...
- delphi listview1添加指定列_对表格的列进行批量处理的函数详解
Table.TransformColumns Table.TransformColumns(table as table, transformOperations as list, optional ...
最新文章
- Attention!注意力机制模型最新综述(附下载)
- 贾斯帕马斯基林的故事笔记
- 那些不回微信的人,都在看什么?
- 浅谈百度司南大数据企业的风向标
- Hadoop的详细配置(持续更新)
- java文件 空心_解决Eclipse中java文件的图标变成空心J的问题
- [UE4]Expandable Area可展开的区域
- 2021年编程语言排行榜出炉,第一名实至名归!
- [论文速览]A Neural Attention Model for Sentence Summarization
- [深度学习]CNN的基础结构与核心思想
- Android签名证书的生成
- jqury ajax 标准
- 电脑是怎么把代码转换成可执行程序的?
- python中da_python数据类型一
- 北京,有2000万人假装在生活
- EasyPlayerPro RTMP播放器助力远程娃娃机直播抓娃娃技术方案
- 喜马拉雅追更攻略:如何订阅更新通知
- 基于Spring boot开发电子宿舍管理系统毕业设计源码132056
- iOS仿QQ分组效果
- request.js