【MyBatis】查询语句汇总

2023-11-11

定义一个Car类:

/**
 * 封装汽车相关信息的 pojo类
 */
public class Car {
    // 数据库表当中的字段应该和pojo类的属性一一对应
    // 建议使用包装类, 这样可以防止null的问题
    private Long id;
    private String carNum;
    private String brand;
    private Double guidePrice;
    private String produceTime;
    private String carType;
    public Car() {
    }
    public Car(Long id, String carNum, String brand, Double guidePrice, String produceTime, String carType) {
        this.id = id;
        this.carNum = carNum;
        this.brand = brand;
        this.guidePrice = guidePrice;
        this.produceTime = produceTime;
        this.carType = carType;
    }
    public Long getId() {return id;}
    public void setId(Long id) {this.id = id;}
    @Override
    public String toString() {
        return "Car{" +
                "id=" + id +
                ", carNum='" + carNum + '\'' +
                ", brand='" + brand + '\'' +
                ", guidePrice=" + guidePrice +
                ", produceTime='" + produceTime + '\'' +
                ", carType='" + carType + '\'' +
                '}';
    }
    public String getCarNum() {return carNum;}
    public void setCarNum(String carNum) {this.carNum = carNum;}
    public String getBrand() {return brand;}
    public void setBrand(String brand) {this.brand = brand;}
    public Double getGuidePrice() {return guidePrice;}
    public void setGuidePrice(Double guidePrice) {this.guidePrice = guidePrice;}
    public String getProduceTime() {return produceTime;}
    public void setProduceTime(String produceTime) {this.produceTime = produceTime;}
    public String getCarType() {return carType;}
    public void setCarType(String carType) {this.carType = carType;}
}

1. 查询之返回Car:

// CarMapper.xml
// 必须要指定返回结果的类型
<select id="selectById" resultType="Car">
    <!-- select * from car where id = #{id}-->
    // 列名要和pojo类中的属性名要对的上, 否则查出来为null
    select
        id, car_num as carNum, brand, guide_price as guidePrice,
        produce_time as produceTimme,
        car_type as catType
    from
        car
    where
        id = #{id}
</select>

// 接口
public interface CarMapper{
    // 根据id查询Car信息
    Car selectById(Long id);
}

// @test
public static void main(String[] args) {
    SqlSession sqlSession = SqlSessionUtil.openSession();
    CarMapper mapper = sqlSession.getMapper(CarMapper.class);
    
    Car car = mapper.selectById(16L);
    System.out.println(car);
    
    sqlSession.close();
}

2. 查询之返回多个Car:

// CarMapper.xml
// 必须要指定返回结果的类型
<select id="selectAll" resultType="Car">
    <!-- select * from car where id = #{id}-->
    // 列名要和pojo类中的属性名要对的上, 否则查出来为null
    select
        id, car_num as carNum, brand, guide_price as guidePrice,
        produce_time as produceTimme,
        car_type as catType
    from
        car
</select>

// 接口
public interface CarMapper{
    // 查询所有Car信息
    List<Car> selectAll();
}

// @test
public static void main(String[] args) {
    SqlSession sqlSession = SqlSessionUtil.openSession();
    CarMapper mapper = sqlSession.getMapper(CarMapper.class);
    
    List<Car> cars = mapper.selectAll();
    cars.forEach(car -> System.out.println(car));
    
    sqlSession.close();
}

3. 查询之返回Map:

  • map的key都是数据库的列名

// CarMapper.xml
// resultType="java.util.Map" 有别名: "map"
<select id="selectByIdRetMap" resultType="map">
    // 返回的类型是个map, 不需要和Car类属性匹配了
    select * from car where id = #{id}
</select>

// 接口
public interface CarMapper{
    // 根据id获取汽车信息, 将信息放到Map集合中
    Map<String, Object> selectByIdRetMap(Long id);
}

// @test
public static void main(String[] args) {
    SqlSession sqlSession = SqlSessionUtil.openSession();
    CarMapper mapper = sqlSession.getMapper(CarMapper.class);
    
    Map<String, Object> car = mapper.selectByIdRetMap(16L);
    System.out.println(car);
    sqlSession.close();
}

4. 查询之返回多个Map:

// CarMapper.xml
// resultType="map", 不能写"list"
<select id="selectAllRetListMap" resultType="map">
    // 返回的类型是个map, 不需要和Car类属性匹配了
    select * from car 
</select>

// 接口
public interface CarMapper{
    // 查询所有的car信息, 返回一个存放Map集合的List集合
    List<Map<String, Object>> selectAllRetListMap();
}

// @test
public static void main(String[] args) {
    SqlSession sqlSession = SqlSessionUtil.openSession();
    CarMapper mapper = sqlSession.getMapper(CarMapper.class);
    
    List<Map<String, Object>> maps = mapper.selectAllRetListMap();
    maps.forEach(map -> System.out.println(map));
    sqlSession.close();
}

5. 查询之返回Map<String,Map>:

  • 拿Car的id做key, 以后取出对应的Map集合时更加方便

  • 需要使用到@MapKey注解

// CarMapper.xml
// resultType="map", 不能写"list"
<select id="selectAllRetMap" resultType="map">
    // 返回的类型是个map, 不需要和Car类属性匹配了
    select * from car 
</select>

// 接口
public interface CarMapper{
    // 查询所有的Car, 返回一个Map集合
    // Map集合的key是每条记录的主键值
    // Map集合的value是每条记录
    @MapKey("id") // 将查询结果的id值作为一个大map集合的key
    Map<Long,Map<String, Object>> selectAllRetMap();
}

// @test
public static void main(String[] args) {
    SqlSession sqlSession = SqlSessionUtil.openSession();
    CarMapper mapper = sqlSession.getMapper(CarMapper.class);
    
    Map<Long,Map<String, Object>> maps = mapper.selectAllRetMap();
    System.out.println(maps);
    sqlSession.close();
}

6. resultMap结果映射:

查询结果的列名和Java对象的属性名对应不上怎么办?

  1. as给列起别名

// CarMapper.xml
// 必须要指定返回结果的类型
<select id="selectAll" resultType="Car">
    select
       id, 
        car_num as carNum, 
        brand, 
        guide_price as guidePrice,
        produce_time as produceTimme,
        car_type as catType
    from
        car
</select>

// 接口
public interface CarMapper{
    // 查询所有Car信息
    List<Car> selectAll();
}

// @test
public static void main(String[] args) {
    SqlSession sqlSession = SqlSessionUtil.openSession();
    CarMapper mapper = sqlSession.getMapper(CarMapper.class);
    
    List<Car> cars = mapper.selectAll();
    cars.forEach(car -> System.out.println(car));
    
    sqlSession.close();
}
  1. 使用resultMap进行结果映射

// CarMapper.xml

<resultMap id="carResultMap" type="Car">
    // 如果数据库表中有主键, 一般都是有主键的, 否则不符合数据库设计第一范式
    // 如果有主键, 建议这里面配置一个id标签, 这样是为了提高效率
    <id property ="id" column="id"/>
    // property后面填写的是POJO类的属性名
    // column后面填写的是数据库的字段名
    <result property="carNum" column="car_num"/>
    // 如果属性名和字段名相同, 可以不配置
    <result property="brand" column="brand"/>    
    <result property="guidePrice" column="guide_price"/>
    <result property="produceTime" column="produce_time"/>
    <result property="carType" column="car_type"/>
</resultMap>

// resultMap属性用来指定使用哪个结果映射, resultMap后面的值是resultMap的id
<select id="selectAllByResultMap" resultMap="carResultMap">
    select * from car 
</select>

// 接口
public interface CarMapper{
    // 查询所有Car信息, 使用resultMap标签
    List<Car> selectAllByResultMap();
}

// @test
public static void main(String[] args) {
    SqlSession sqlSession = SqlSessionUtil.openSession();
    CarMapper mapper = sqlSession.getMapper(CarMapper.class);
    
    List<Car> cars = mapper.selectAllByResultMap();
    cars.forEach(car -> System.out.println(car));
    
    sqlSession.close();
}
  1. 是否开启驼峰命名自动映射(配置settings)

  • 使用这种方式的前提是: 属性遵循java命名规范, 数据库的列名遵循sql的命名规范

  • java命名规范: 首字母小写, 后面每个单词首字母大写, 遵循驼峰命名方式

  • sql命名规范: 全部小写, 单词之间采用下划线分割

如何启用该功能呢? 需要在mybatis-config.xml文件中配置
    
// 放在properties标签后面
<settings>
    <setting name="mapUnderscoreToCameCase" value="true">
</settings>

// CarMapper.xml
<select id="selectAllBymapUnderscoreToCameCase" resultType="Car">
    select * from car
</select>

// 接口
public interface CarMapper{
    // 查询所有Car信息, 启用驼峰命名自动映射机制
    List<Car> selectAllBymapUnderscoreToCameCase();
}

// @test
public static void main(String[] args) {
    SqlSession sqlSession = SqlSessionUtil.openSession();
    CarMapper mapper = sqlSession.getMapper(CarMapper.class);
    
    List<Car> cars = mapper.selectAllBymapUnderscoreToCameCase();
    cars.forEach(car -> System.out.println(car));
    
    sqlSession.close();
}

7. 查询之返回总记录条数:

// CarMapper.xml
// resultType后面也可以写上java.lang.Long
<select id="selectTotal" resultType="long">
    select count(*) from car
</select>

// 接口
public interface CarMapper{
    // 获取Car的总记录条数
    Long selectTotal();
}

// @test
public static void main(String[] args) {
    SqlSession sqlSession = SqlSessionUtil.openSession();
    CarMapper mapper = sqlSession.getMapper(CarMapper.class);
    
    Long nums = mapper.selectTotal();
    System.out.println(nums);
    
    sqlSession.close();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【MyBatis】查询语句汇总 的相关文章

  • 如何在 Android 中的 Chrome 或 Firefox 等特定浏览器的 Web 视图中加载应用程序

    我是 Android 新手 我正在做一个应用程序 我需要在平板电脑上的 Web 视图中加载现有的应用程序 在平板电脑中 当我使用 Web 视图加载应用程序时 我的应用程序将加载到默认浏览器中 如何在平板电脑上的 Web 视图中的特定浏览器
  • Hashset - 创建 Set 后使对象相同

    如果我们在 HashSet 中添加两个不同的对象 可变的 然后通过调用 setter 更改对象的值 使它们相同 则大小仍然是 hashSet 的 2 我无法理解其原因 public static void main String args
  • java 中的梵文 i18n

    我正在尝试使用来自互联网的示例 ttf 文件在 java 中使用 i18n 进行梵文 印地文 我可以加载资源包条目 还可以加载 ttf 并设置字体 但它不会根据需要呈现 jlabel 它显示块代替字符 如果我在 Eclipse 中调试 我可
  • 如何在 MySQL 中启用严格 sql_mode?

    我怎样才能启用严格sql mode在 MySQL 中 我想从 SQL 中获取数据并在中处理相同的数据strict mode 我现在的sql mode is mysql gt SELECT sql mode sql mode NO ENGIN
  • 如何准确判断 double 是否为整数? [复制]

    这个问题在这里已经有答案了 具体来说 在 Java 中 我如何确定double是一个整数 为了澄清 我想知道如何确定 double 实际上不包含任何分数或小数 我主要关心的是浮点数的性质 我想到的方法 以及我通过谷歌找到的方法 基本上遵循以
  • Apache Thrift Java-Javascript 通信

    我正在编写一个基于 Apache Thrift 的 Java 服务器 它将从 Javascript 客户端接收数据 我已经完成了 Java 服务器 但问题是我可以获得 Javascript 客户端的工作示例 我无法找到一个好的示例 构建文档
  • 为什么通过 方法向 List 添加元素(类型正确)会出现编译错误? [复制]

    这个问题在这里已经有答案了 我对泛型通配符概念几乎没有疑问 1 假设我有一个方法 void write List
  • 关于 Cassandra 与 MySQL 的一些建议

    几天前我在这里问了一个问题 得到了一些非常好的答案 我正在考虑做一个带有个人资料 个人简介等的facebook风格的网站 并询问我是否应该使用mysql 答案是使用Cassandra 因为好多了 我只是问这是每个人都会建议的 只是我对mys
  • 获取Android库中的上下文

    我正在编写一个 Android 应用程序 它的一些功能封装在内部库中 但是 要使此功能发挥作用 库需要一个应用程序上下文的实例 为图书馆提供这种上下文的最佳方式是什么 我看到了一些选择 但没有一个有吸引力 Have my library c
  • Java Junit 测试 HTTP POST 请求

    我需要测试以下方法而不改变方法本身 该方法向服务器发出 POST 方法 但我需要制作一个独立于服务器的测试用例 在将其重定向到本地文件之前 我测试了类似的方法 但为此我将协议指定为文件 主机名指定为 localhost 端口指定为 1 我的
  • 在拇指上方显示修改后的 JSlider 值

    有没有一种简单的方法可以在使用某些 外观和感觉 的同时更改 JSlider 上方标签中显示的值 为了清楚起见 我正在谈论这个值 具体来说 我想显示除以 1000 的值而不是值本身 我知道如果我显示它们 我可以为刻度设置标签 但用户将不得不猜
  • 是否可以手动检查 LocateRegistry 是否存在?

    I 已经发现 https stackoverflow com a 8338852 897090一种安全的方式获得LocateRegistry 即使注册表尚不存在 Registry registry null try registry Loc
  • RxJava android mvp 单元测试 NullPointerException

    我是 mvp 单元测试的新手 我想对演示者进行一个非常基本的测试 它负责登录 我只想断言 view onLoginSuccess 这是演示者代码 public LoginPresenter LoginViewContract loginVi
  • ActiveMQ JNDI 查找问题

    尝试使用 JNDI 运行以下 ActiveMQ http activemq apache org jndi support html http ActiveMQ 20JNDI 并且我的 jboss server node lib 文件夹中有
  • Java 8 方法签名不一致

    Java 8 为我们提供了具有很长签名的新方法 如下所示 static
  • 从字节数组设置 img src

    我需要设置img src我在对象中拥有的字节数组的属性 img
  • Firebase:用户注册后如何进行电话号码验证?

    所以我知道我可以使用电子邮件验证或电话号码验证 但我想做的是在用户注册或登录后进行电话号码验证 如何连接这两种身份验证方法 最后 Firebase中是否有一个函数可以检查用户是否通过电话号码验证 谢谢 即使用户已通过身份验证 您仍然可以使用
  • 如何在J2ME中获取数字的幂[重复]

    这个问题在这里已经有答案了 可能的重复 J2ME power double double 数学函数实现 https stackoverflow com questions 2076913 j2me powerdouble double ma
  • MySqlConnectionStringBuilder - 使用证书连接

    我正在尝试连接到 Google Cloud Sql 这是一个 MySql 解决方案 我能够使用 MySql Workbench 进行连接 我如何使用 C 连接MySqlConnectionStringBuilder 我找不到提供这三个证书的
  • 如何获取所有mysql元组结果并转换为json

    我能够从表中获取单个数据 但是当我试图获取表上的所有数据时 我只得到一行 cnn execute sql rows cnn fetchall column t 0 for t in cnn description for row in ro

随机推荐

  • 解空间

    目录 一 解空间 二 解空间的相对性 三 解空间结构 四 解空间结构的相对性 五 对象空间 六 对象空间和解空间的关系 1 对象空间等于解空间 2 解空间是对象空间的子空间 3 解空间是对象空间的子空间构成的集合 4 解空间是对象空间 或其
  • 求二叉树的深度/求二叉树的节点数

    1 求二叉树的深度 高度 思路 递归解法 1 如果二叉树为空 则树的深度为0 递归返回条件 2 如果二叉树不为空 二叉树深度 max 左子树节点个数 右子树节点的个数 1 代码如下 二叉树节点的数据结构 class treeNode pub
  • C语言,判断二维字符数组是否存在回文字符串 例如:char a[] [10]={“asd“,“asa“,“werew“,“yuyu“};

    判断二维字符数组是否存在回文字符串 例如 char a 10 asd asa werew yuyu 提示存在回文字符串 回文字符串对称 思路 循环二维字符数组 判断每一个字符串是否是回文字符串 回文字符串使用单独函数 2 1 循环二维数组
  • C++14中返回类型推导的使用

    使用C 14中的auto返回类型 编译器将尝试自动推导 deduce 返回类型 namespace int xx 1 auto f return xx return type is int const auto f3 return xx r
  • 如何不冒昧的问妹子年龄又能清楚的知道她多大呢?Python来告诉你。

    前言 昨天 公司一个程序员过生日 一大帮子单身老爷们儿聚餐 可怜 所以大家呼朋唤友 有女朋友的带着闺蜜 朋友 好说歹说 准备一起聚聚 顺便给大家互相介绍 下 说不定 哎嘿有互相看对眼的呢 结果 人家小姐姐问你猜她多大 给程序员猜小姐姐年龄的
  • SSDA-YOLO:新的YOLOv5改进方法——用于跨域目标检测的半监督域自适应YOLO方法

    文章转载来源于自动驾驶之心 作者汽车人 域自适应目标检测 DAOD 旨在缓解跨域差异导致的传输性能下降 然而 大多数现有的DAOD方法由计算密集的两级检测器主导 这不是工业应用的首选 本文提出了一种新的基于半监督域自适应YOLO SSDA
  • Bailian3709 2进制转化为3进制【进制转换】

    题目链接 2进制转化为3进制 总时间限制 1000ms 内存限制 65536kB 描述 输入一个2进制的数 要求输出该2进制数的3进制表示 在3进制的表示中 只有0 1 2三种符号 输入 第1行是测试数据的组数n 后面跟着n行输入 每组测试
  • 彻底弄懂CommonJS和AMD/CMD!

    JS中的模块规范 CommonJS AMD CMD 如果你听过js模块化这个东西 那么你就应该听过或CommonJS或AMD甚至是CMD这些规范咯 我也听过 但之前也真的是听听而已 现在就看看吧 这些规范到底是啥东西 干嘛的 一 Commo
  • Ubuntu 搜狗输入法显示繁体,一直不显示简体

    1 问题 在ubuntu系统下 安装好sogou输入法之后 用了一段时间之后 输入拼音之后 老是出现繁体字 很烦 原因 可能误触了繁体简体开关 2 解决办法 按住shift 不放 同时 按下ctrl 和F键 即可 有些博客和评论说这种方式在
  • linux各种文件系统挂载总结

    mount语法 mount t 类型 o 挂接方式 源路径 目标路径 t 选项 iso9660 光盘或光盘镜像 msdos DOS fat16文件系统 vfat Windows 9x fat32文件系统 ntfs Windows NT nt
  • Redis核心知识点

    Redis面试精选 1 redis 简介 简单来说 redis 就是一个数据库 不过与传统https download csdn net download liyangxueit 12307486库不同的是 redis 的数据是存在内存中的
  • ++k与k++区别 和双目运算符结合

    最近在写代码时发现了这样一个错误 题目如下 链接 Hdu 1027 关键代码如下 int k 1 while next permutation s begin s end if k m 注意 问题就出在这里 for int i 0 i
  • C#编程和网络编程入门

    文章目录 一 用C 编写一个命令行 控制台程序 二 用C 编写一个简单的Form窗口程序 参考 一 用C 编写一个命令行 控制台程序 要求 用C 编写一个命令行 控制台hello world程序 实现如下功能 在屏幕上连续输出50行 hel
  • Qt的MVC模型/视图编程(一)——理论知识

    一 为什么需要MVC模型 视图 MVC模型 视图架构是用于实现对大量数据的存储 处理及其显示 如下图所示 没用MVC存储数据的是图片中的上半部分 用了MVC处理数据后的是图片的下半部分 1 MVC模型 视图的作用 a 模型 数据 与视图 显
  • 基于QT的串口调试助手制作

    目录 1 创建文件 2 串口界面制作 3 代码 4 结果 5 改进 6 百度链接 1 创建文件 创建带有ui界面的qt程序 可以点击文件 新建文件或项目就会出现上面的界面 选这Application 应用程序 创建项目 其中Qt Widge
  • 实验七 组合数据类型 Educoder

    实验七 组合数据类型 Educoder 组合数据类型是计算机编程中非常重要的概念之一 它允许我们将多个不同类型的数据组合在一起 形成一个新的数据类型 在本篇文章中 我将介绍组合数据类型的概念和用法 并通过一个示例源代码来展示它的应用 在讨论
  • “自顶向下,逐步求精”方法简要介绍

    什么是自顶向下 逐步求精 自顶向下 逐步求精 是结构化程序设计常见的思路 自顶向下 是将复杂 大的问题划分为小问题 找出问题的关键 重点所在 然后用精确的思维定性 定量地去描述问题 逐步求精 是将现实世界的问题经抽象转化为逻辑空间或求解空间
  • openwrt下crontab定时任务实现

    openwrt下crontab定时任务实现 我的需求是需要加个定时执行脚本来监控智能网关运行的进程 一旦网关进程异常关闭 就能立即把它拉起来 从而保证网关运行的可靠性 这里我们用到了crontab服务 OpenWRT系统默认已经加入了cro
  • 最大比例

    题目描述 解析 接下来就是求解k和p的过程 在这道题中很难使用欧几里得算法就求解最大公约数 因此尝试使用另一种方法 更相减损术 循环相减法 如果要使用欧几里得算法的话 就需要开一个非常复杂的根号 非常难算 代码 include
  • 【MyBatis】查询语句汇总

    定义一个Car类 封装汽车相关信息的 pojo类 public class Car 数据库表当中的字段应该和pojo类的属性一一对应 建议使用包装类 这样可以防止null的问题 private Long id private String