MyBatis—利用MyBatis查询(查询所有,查询一行,条件查询)

2023-10-27

1、查询所有

基本步骤

1.定义mapper接口,编写接口方法
在这里插入图片描述
2.定义sql映射文件
创建一个和mapper接口相同的xml文件,放在相同包目录下面,然后编写sql语句
在这里插入图片描述
我是查询所有,所以sql语句和mysql查询所有一样,如果你想要查询特定字段,也可以自行定义。
在这里插入图片描述
3.编写MyBaits代码
编写代码的步骤(参考另一篇)

package com.mybatis.demo;


import com.mybatis.mapper.StuMapper;
import com.mybatis.pojo.Stu;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.InputStream;
import java.util.List;

public class MyBatis003 {
    public static void main(String[] args) throws Exception {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        SqlSession sqlSession = sqlSessionFactory.openSession();

        StuMapper stuMapper = sqlSession.getMapper(StuMapper.class);

        List<Stu> stus = stuMapper.selectAll();

        for (Stu stu:stus) {
            System.out.println(stu);
        }

        sqlSession.close();
    }
}

4.查询结果,将数据库表stu里面所有信息都查询出来了
在这里插入图片描述

5.注意信息
当你的数据库字段名和你的定义的实体类属性名不同时,不能查询出不同的字段对应数据信息。假如我数据库名称是username,实体类属是userName,下面是解决三种方法。
方法一:在定义sql语句时起别名
在这里插入图片描述
方法二:定义sql片段,直接用sql标签引入sql语句,直接用include标签加上sql片段的ID名就可以找到对用的SQL语句。
在这里插入图片描述
方法三:使用resultMap标签,映射数据库字段名和属性名(最常用)
resultMap里面最常用的两个子标签,一个是result,它是映射普通字段名和属性名,还有一个是id子标签,它是映射主键和属性名。里面的column属性时数据库表的字段名,property是实体类的属性名。
在这里插入图片描述

2、查询详情(通过特定属性查询)

1.定义mapper接口,编写接口方法,这里的参数列表就是你想要查询的属性对应的全部信息。可以通过name属性查询该学生全部信息。
在这里插入图片描述
2.编写sql映射文件
创建一个和mapper接口相同的xml文件,放在相同包目录下面,然后编写sql语句
在这里插入图片描述
3.编写MyBaits代码

package com.mybatis.demo;

import com.mybatis.mapper.StuMapper;
import com.mybatis.pojo.Stu;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

public class MyBatis004 {
    public static void main(String[] args) throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        SqlSession sqlSession = sqlSessionFactory.openSession();

        StuMapper stuMapper = sqlSession.getMapper(StuMapper.class);

        Stu stu = stuMapper.selectByName("小赵");

        System.out.println(stu);
    }
}

4.查询结果
在这里插入图片描述

5.注意细节
1.参数占位符的使用
参数占位符就是我上面的 name=#{name},一般有两种。一种就是#{},这个参数占位附可以防止sql注入,相当于name=?,还有一种是${},这个就不能防止sql注入了,因为它是直接把参数拼到后面,相当于name=name。
2.特殊字符处理
特殊字符就是=,>,<等,在xml中有的特殊字符会被xml文件识别,这时候就需要对特殊字符进行处理。一种方法就是使用转义字符,还有一种就是使用CDATA区
比如我要查询id小于18 的同学信息
在这里插入图片描述

3、多条件查询

以下案例都以在stu表查询小字开头的,住在上海,并且性别为男的同学

(1)接口参数列表三种表达方式

  1. 散装参数:散装参数需要用@Param把sql里面的占位符表示出来,好让对应的参数找到对应占位符。

    List<Stu> selectByCondition(@Param("name")String name,@Param("adr")String adr,@Param("gender")String gender);
    
  2. 类封装参数:类封装参数需要在MyBatis程序中定义对应的参数内容,再传入方法。

    List<Stu> selectByCondition(Stu stu);
    
  3. Map集合封装参数:要保证sql里面的参数名和Map集合中的键名保持一致。

    List<Stu> selectByCondition(Map map);
    

下面不同实例我会用不同的参数列表类型。

(2)多条件查询

实现步骤‘
1.定义Mapper接口,编写对应方法
在这里插入图片描述

2.编写sql映射文件
在这里插入图片描述

3.编写MyBatis代码

package com.mybatis.demo;

import com.mybatis.mapper.StuMapper;
import com.mybatis.pojo.Stu;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class MyBatis005 {
    public static void main(String[] args) throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        SqlSession sqlSession = sqlSessionFactory.openSession();

        StuMapper stuMapper = sqlSession.getMapper(StuMapper.class);

        List<Stu> stus = stuMapper.selectByCondition("小%", "上海", "男");

        for (Stu stu:stus) {
            System.out.println(stu);
        }

        sqlSession.close();
    }

}

4.运行结果
在这里插入图片描述

(3)动态Sql

什么是动态sql:动态sql就是sql语句随着用户输入的条件不同,对应生成的sql语句也会不同。比如在查询用户的时候,你可能只知道用户的姓名,也可能知道用户姓名,性别等。不同的输入对应sql语句是不同的。动态sql就可以解决这个问题。MyBatis提供了一些动态sql方法以及介绍,这里我就不一一介绍了。你可以去官网看对应语句以及用法。
在这里插入图片描述

(4)多条件动态查询

实现步骤
1.定义mapper接口,编写方法。(这里用类封装参数列表) 在这里插入图片描述
2.编写sql映射文件,这里用到了动态sql if语句,就是先判断有没有传入这个参数,如果有那就执行对应where条件,如果没有就不添加where条件到sql语句。
在这里插入图片描述
3.编写MyBatis代码
在编写代码时我用到的是类封装参数列表,所以在执行sql语句之前要封装好实体类。
在这里插入图片描述

package com.mybatis.demo;

import com.mybatis.mapper.StuMapper;
import com.mybatis.pojo.Stu;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class MyBatis006 {
    public static void main(String[] args) throws IOException {
        Stu stu = new Stu();

        String name = "小%";
        String adr = "上海";
        String gender = "男";

        stu.setName(name);
        stu.setAdr(adr);
        stu.setGender(gender);

        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        SqlSession sqlSession = sqlSessionFactory.openSession();

        StuMapper stuMapper = sqlSession.getMapper(StuMapper.class);

        List<Stu> stus = stuMapper.selectByCondition(stu);

        for (Stu s:stus
             ) {
            System.out.println(s);
        }

        sqlSession.close();
    }
}

4.运行结果
在这里插入图片描述
5.注意点
由于if条件里面的sql语句是直接拼接在总的sql语句上的,所以如果第一个if里面的text为空,那里面的sql语句是不会加上去的。以我写的为例,如果参数列表name为空,那总的sql语句就变成了select * from stu whereand adr in adr and gender = gender;显然不符合sql语句语法,会报错。
在这里插入图片描述
MyBatis提供了解决这个问题的方法,就是在if标签外面将where关键字替换成为一个where标签,然后里面每个sql语句都加一个and就好了。
在这里插入图片描述

(5)单条件动态查询

实现步骤
1.定义一个mapper接口,定义对应方法(这里使用的是map集合封装参数)
在这里插入图片描述
2.定义sql映射文件,单条件动态查询用到的是choose:when,otherwise,相当于java里面的Switch:case,default。当满足第一个when标签的test条件,就执行当前语句,不会再往下执行。when里面都不满足就执行otherwise里面的。
在这里插入图片描述
3.编写MyBatis代码
这里使用的是map集合封装参数,所以在执行sql之前要把参数列表封装到map集合里面。

在这里插入图片描述

package com.mybatis.demo;

import com.mybatis.mapper.StuMapper;
import com.mybatis.pojo.Stu;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MyBatis007 {
    public static void main(String[] args) throws IOException {
        Map map = new HashMap<>();

        String name = "小%";
        String adr = "上海";
        String gender = "男";

        map.put("name",name);
        map.put("adr",adr);
        map.put("gender",gender);

        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        SqlSession sqlSession = sqlSessionFactory.openSession();

        StuMapper stuMapper = sqlSession.getMapper(StuMapper.class);

        List<Stu> stus = stuMapper.selectByCondition(map);

        for (Stu s:stus
             ) {
            System.out.println(s);
        }

        sqlSession.close();
    }
}

4.执行结果
看到这个执行结果你可能有点质疑,不是有限定地址在上海,性别为男的吗。其实第三步已经解释了,当满足一个when标签的条件后,后面的条件不会被传到sql语句。所以这里相当于只查找了小字开头的同学,这正是单条件的解释。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MyBatis—利用MyBatis查询(查询所有,查询一行,条件查询) 的相关文章

  • java中删除字符串中的特殊字符?

    如何删除字符串中除 之外的特殊字符 现在我用 replaceAll w s 它删除了所有特殊字符 但我想保留 谁能告诉我我该怎么办 Use replaceAll w s 我所做的是将下划线和连字符添加到正则表达式中 我添加了一个 连字符之前
  • 一种使用 Java Robot API 和 Selenium WebDriver by Java 进行文件上传的解决方案

    我看到很多人在使用 Selenium WebDriver 的测试环境中上传文件时遇到问题 我使用 selenium WebDriver 和 java 也遇到了同样的问题 我终于找到了解决方案 所以我将其发布在这里希望对其他人有所帮助 当我需
  • Prim 的迷宫生成算法:获取相邻单元格

    我基于 Prim 算法编写了一个迷宫生成器程序 该算法是 Prim 算法的随机版本 从充满墙壁的网格开始 选择一个单元格 将其标记为迷宫的一部分 将单元格的墙壁添加到墙壁列表中 While there are walls in the li
  • Java中接口作为方法参数

    前几天去面试 被问到了这样的问题 问 反转链表 给出以下代码 public class ReverseList interface NodeList int getItem NodeList nextNode void reverse No
  • 检查 Android 手机上的方向

    如何查看Android手机是横屏还是竖屏 当前配置用于确定要检索的资源 可从资源中获取Configuration object getResources getConfiguration orientation 您可以通过查看其值来检查方向
  • 制作java包

    我的 Java 类组织变得有点混乱 所以我要回顾一下我在 Java 学习中跳过的东西 类路径 我无法安静地将心爱的类编译到我为它们创建的包中 这是我的文件夹层次结构 com david Greet java greeter SayHello
  • 将 Long 转换为 DateTime 从 C# 日期到 Java 日期

    我一直尝试用Java读取二进制文件 而二进制文件是用C 编写的 其中一些数据包含日期时间数据 当 DateTime 数据写入文件 以二进制形式 时 它使用DateTime ToBinary on C 为了读取 DateTime 数据 它将首
  • Java直接内存:在自定义类中使用sun.misc.Cleaner

    在 Java 中 NIO 直接缓冲区分配的内存通过以下方式释放 sun misc Cleaner实例 一些比对象终结更有效的特殊幻像引用 这种清洁器机制是否仅针对直接缓冲区子类硬编码在 JVM 中 或者是否也可以在自定义组件中使用清洁器 例
  • org.jdesktop.application 包不存在

    几天以来我一直在构建一个 Java 桌面应用程序 一切都很顺利 但是今天 当我打开Netbeans并编译文件时 出现以下编译错误 Compiling 9 source files to C Documents and Settings Ad
  • Tomcat 6找不到mysql驱动

    这里有一个类似的问题 但关于类路径 ClassNotFoundException com mysql jdbc Driver https stackoverflow com questions 1585811 classnotfoundex
  • 如何在 Maven 中显示消息

    如何在 Maven 中显示消息 在ant中 我们确实有 echo 来显示消息 但是在maven中 我该怎么做呢 您可以使用 antrun 插件
  • 当单元格内的 JComboBox 中有 ItemEvent 时,如何获取 CellRow

    我有一个 JTable 其中有一列包含 JComboBox 我有一个附加到 JComboBox 的 ItemListener 它会根据任何更改进行操作 但是 ItemListener 没有获取更改的 ComboBox 所在行的方法 当组合框
  • 使用用户定义函数 MySql 时出错

    您好 请帮我解决这个问题 提前致谢 我在数据库中定义了这些函数 CREATE FUNCTION levenshtein s1 VARCHAR 255 s2 VARCHAR 255 RETURNS INT DETERMINISTIC BEGI
  • 无法连接到 MAMP 上的 phpMyAdmin

    我收到此错误消息 MySQL 说道 无法连接 设置无效 phpMyAdmin 尝试连接 MySQL 服务器 但服务器拒绝连接 您应该检查配置中的主机 用户名和密码 并确保它们与 MySQL 服务器管理员提供的信息相对应 用户和通行证是默认的
  • 如何修复“sessionFactory”或“hibernateTemplate”是必需的问题

    我正在使用 Spring Boot JPA WEB 和 MYSQL 创建我的 Web 应用程序 它总是说 sessionFactory or hibernateTemplate是必需的 我该如何修复它 我已经尝试过的东西 删除了本地 Mav
  • java迭代器内部是如何工作的? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个员工列表 List
  • 如何修复 pgbackups 错误:备份 url 无效?

    我正在尝试按照迁移到 Cedar 的说明进行操作 除了我进行了重大重写 因此这不是前一个应用程序的分支 而是一个单独的分支 并停留在数据库迁移步骤 我安装了 pgbackup 和 heroku postgresql 插件 但得到了这个结果
  • com.jcraft.jsch.JSchException:身份验证失败

    当我从本地磁盘上传文件到远程服务器时 出现这样的异常 com jcraft jsch JSchException Auth fail at org apache tools ant taskdefs optional ssh Scp exe
  • rake db 问题:迁移 -

    我无法为 Ruby on Rails 设置 MySQL 数据库 设置数据库并确保 config database yml 文件匹配后 我遇到了以下错误消息 U Rails alpha gt rake db migrate trace in
  • Swagger/Openapi-Annotations:如何使用 $ref 生成 allOf?

    我正在生成 Rest 端点 包括添加OpenAPI Swagger对生成的代码进行注释 虽然它对于基本类型运行得很好 但我在自定义类方面遇到了一些问题 现在我有很多自定义类的重复架构条目 使用 Schema 实现 MyClass class

随机推荐

  • Ubuntu下pycharm的安装和卸载

    pycahrm安装 首先要去pycharm的官方网站下载Linux版本的pycharm安装包 如果想要下载以前版本的pycharm可以登录下方的网站去下载 https www jetbrains com pycharm download o
  • 按摩软件仿东郊到家系统开发,上门预约系统;

    按摩软件仿东郊到家系统开发 上门预约系统 用户端 技师端 商家端 以及管理后台 上门预约的操作 1 技师管理 技师满意度进行统一跟踪评估 进行分级管理 分级评估 2 订单管理 按订单状态分类筛选 安装进度一目了然 3 智能派单 根据客户位置
  • 64位机器源码安装遇到的问题,解决,一锅端

    1 如果是centos5会出现如下问题 checking host system type Invalid configuration x86 64 unknown linux gnu machine x86 64 unknown not
  • Hexo-零基础搭建个人博客(详解)

    Hexo零基础搭建个人博客 Hexo是一个基于 node js的快速生成静态博客的开源框架 支持 Markdown和大多数 Octopress 插件 一个命令即可部署到 Github页面 Giteee Heroku等 强大的APl 可无限扩
  • 数据库关闭四种方式

    数据库关闭四种方式 shutdown 参数 默认normal abort 模拟突然掉电 内存被清空 内存中的数据没有写入数据文件 事务被立即中断 没有提交也没有回滚 immediate 强制中断当前正在运行的所有事务 回滚这些事务 回滚完毕
  • c语言编写简易的自动售货机程序

    今天本来想做一个弹窗的可以输入有按钮点确定的自动售货机程序的 但是因为学校没教我是自学的找了一下午 不是教我如何创建的 就是代码各种报错的 我试了一下午都不行 只能放弃了 今天这串代码是根据我的c语言笔试 我们有上机考试的 的其中一道编程的
  • 二、量化选股

    文章目录 总体介绍 一 基本面选股 1 因子选股 判断方法 五个步骤 2 风格轮动 3 行业轮动 二 市场行为选股 1 资金流 2 动量反转 基本概念 1 行为金融学 2 阿尔法动量模型 3 一致预期 4 趋势追踪 基本概念 5 筹码选股
  • uniGUI用Grid++Report报表插件设计保存报表(For unigui ver:0.95.0.1045)

    uniGUI的0 95 0 1045版本提供了CallbackUrl 我们也可以用这个提供的回调网址来实现优秀的国产报表插件在IE Chorme FireFox中在线设计并保存报表到服务端的功能 界面效果如下 代码如下 unit Main
  • SpringBoot用线程池ThreadPoolExecutor处理百万级数据

    SpringBoot用线程池ThreadPoolExecutor处理百万级数据 更多优秀文章 请扫码关注个人微信公众号或搜索 程序猿小杨 添加 一 背景 使用JDK线程池ThreadPoolExecutor多线程异步执行批量插入 更新等操作
  • 如何优雅地用VScode在Ubuntu服务器上跑cuda代码

    0 安装相关软件 VScode 及对应插件 推荐VScode配置好远程服务后在服务端添加如下插件 Xming Xming X Server for Windows download SourceForge netDownload Xming
  • CMake Error: CMake was unable to find a build program corresponding to “Ninja“.

    CMake Error CMake was unable to find a build program corresponding to Ninja 使用cmake G ninja 后出现问题 报错信息如下所示 CMake Error C
  • 关于dispose 方法的资源释放

    当在程序上实现dispose 方法时 当前对象所占用的资源会被释放 当前对象便不能再被使用 但在内存中还并不会被及时的释放 要待到下次垃圾回收的时候 内存才能得到释放
  • Redis哨兵模式高可用原理

    我们知道主从复制是高可用的基石 从库宕机依然可以将请求发送给主库或者其他从库 但是 Master 宕机 只能响应读操作 写请求无法再执行 所以主从复制架构面临一个严峻问题 主库挂了 无法执行 写操作 无法自动选择一个 Slave 切换为 M
  • javabean相关问题

    目录 一般情况下 javabean有哪些具体的规范 JavaBean规范 在jsp页中 如何实现对它页的引入 or 嵌入 1 第一种 js import 2 第二种 jsp include指令 3 第三种 jsp include动作 什么是
  • Qt笔记8--zlib实现gzip解压

    Qt笔记8 zlib实现gzip解压 几个月前 由于需要使用过zlib解压文本和图片 现在将当初的方法记录在这里 以便于后续查阅 1 功能及使用方法 功能 1 解压gzip压缩的字符串 2 解压gzip压缩的图片 方法 1 下载并编译zli
  • 日常学习 mmsegmentation处理数据集和图片格式

    mmsegmentation 对数据集的读取与处理 对于自定义数据集需要在mmseg datasets下建立自己的数据集文件 如 import os path as osp from builder import DATASETS from
  • BUG -- 背景图片 background-postion 值为 百分比 时无效

    最近再写公司官网 要求响应式 为了图方便用百分比遇到一个bug 经过多方测试 此时遇到的问题是 当background size的值与容器的width height值相同时 同为px或者 background postion属性值设置为百分
  • 毕业设计-基于人工智能的脱机手写数字识别系统

    目录 前言 课题背景和意义 实现技术思路 一 相关背景知识介绍 二 基于智能优化算法的SVM在手写数字中的应用 三 基于智能优化算法的KELM在手写数字中的应用 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实
  • js爬虫反扒

    3 js动态网页抓取方式 重点 许多时候爬虫取到的页面仅仅是一个静态的页面 即网页的源代码 就像在浏览器上的 查看网页源代码 一样 一些动态的东西如javascript脚本执行后所产生的信息是抓取不到的 下面两种方案 可用来python爬取
  • MyBatis—利用MyBatis查询(查询所有,查询一行,条件查询)

    文章目录 1 查询所有 2 查询详情 通过特定属性查询 3 多条件查询 1 接口参数列表三种表达方式 2 多条件查询 3 动态Sql 4 多条件动态查询 5 单条件动态查询 1 查询所有 基本步骤 1 定义mapper接口 编写接口方法 2