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

article/2025/7/9 1:47:48

文章目录

    • 1、查询所有
    • 2、查询详情(通过特定属性查询)
    • 3、多条件查询
    • (1)接口参数列表三种表达方式
    • (2)多条件查询
    • (3)动态Sql
    • (4)多条件动态查询
    • (5)单条件动态查询

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语句。所以这里相当于只查找了小字开头的同学,这正是单条件的解释。
在这里插入图片描述

先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦


http://chatgpt.dhexx.cn/article/8arWilng.shtml

相关文章

Redis实现分页和多条件模糊查询方案

导言 Redis是一个高效的内存数据库&#xff0c;它支持包括String、List、Set、SortedSet和Hash等数据类型的存储&#xff0c;在Redis中通常根据数据的key查询其value值&#xff0c;Redis没有模糊条件查询&#xff0c;在面对一些需要分页、排序以及条件查询的场景时(如评论&…

python操作es条件查询定制body

参考连接&#xff1a; python操作elasticsearch - 无量python - 博客园 1、切片查询 from elasticsearch import Elasticsearch# 建立连接 es Elasticsearch( hosts{192.168.0.120, 192.168.0.153}, # 地址timeout3600 # 超时时间 )# body指定查询条件 body {from: 0, #…

Oracle clob怎么存储超过4000长度的数据,你了解吗

目录 方式一、使用存储过程&#xff1a; 方式二、使用to_clob函数 方式三、mybatis中的方法 附&#xff1a; oracle将把varchar2字段&#xff08;长度4000&#xff09;改为clob类型 参考资料&#xff1a; 题记&#xff1a;我们知道Oracle存储的字段长度是有限制&#xff0…

oracle中clob和blob,Oracle中的BLOB和CLOB

非洲小白脸 阅读(364) 评论(0) 编辑 收藏 所属分类: oracle Oracle中的BLOB和CLOB 一、区别和定义 LONG: 可变长的字符串数据,最长2G,LONG具有VARCHAR2列的特性,可以存储长文本一个表中最多一个LONG列 LONG RAW: 可变长二进制数据,最长2G CLOB: 字符大对象Clob 用来存储单…

mysql clob blob_Oracle中 CLOB, BLOB和NLOB

SQL 类型 CLOB 在 Java TM 编程语言中的映射关系。SQL CLOB 是内置类型&#xff0c;它将 Character Large Object 存储为数据库表的某一行中的一个列。默认情况下&#xff0c;驱动程序使用 SQL locator(CLOB) 实现 Clob 对象&#xff0c;这意味着 CLOB 对象包含一个指向 SQL CL…

java clob 操作_Java Clob 操作

java操作数据库clob字段的简单例子&#xff1a; package com.test.db.clob; import java.io.BufferedReader; import java.io.IOException; import java.io.Writer; import java.sql.Clob; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prepar…

ORACLE中CLOB介绍及使用

一、Oracle中的varchar2类型 我们在Oracle数据库存储的字符数据一般是用VARCHAR2。VARCHAR2既分PL/SQL Data Types中的变量类型&#xff0c;也分Oracle Database中的字段类型&#xff0c;不同场景的最大长度不同。 在Oracle Database中&#xff0c;VARCHAR2 字段类型&#xf…

clob类型(数据库clob类型)

如何获取clob类型的字节长度 blob和clob最大是多少&#xff1f;还是没有最大限制&#xff1f;它们的最大上限就是4G&#xff0c;Clob可以存储单字节字符数据&#xff0c;Blob可以存储无结构的二进制数据 Oracle中Clob类型如何处理&#xff1f; string id Guid。NewGuid()。ToS…

CRC校验方法的实现

1&#xff0c;确定收发双方所使用的校验位数(由收发双方自定义) 如1个字节的为CRC-8校验&#xff0c;2字节为CRC-16校验&#xff0c;4字节为CRC-32校验。 2&#xff0c;确定除数(生成多项式) 根据校验字节数&#xff0c;确定某个除数G(x)&#xff0c;这个除数一般以二进制形式…

【Verilog】CRC校验码生成器原理及verilog实现

目录 一、CRC的基本原理 二、CRC生成步骤 2.1举个栗子 三、Verilog实现 四、参考资料 4.1 CRC在线计算器 一、CRC的基本原理 CRC &#xff1a;Cyclic Redundancy Check循环冗余校验码 将被处理的报文比特序列当做一个二进制多项式A(x)的系数&#xff0c;任意一个由二进制…

CRC校验原理及其使用

目录 何为CRC 为什么需要校验 为什么是CRC CRC的缺点 目录 何为CRC 为什么需要校验 为什么是CRC CRC的缺点 如何进行CRC校验 校验标准式是什么玩意&#xff1f; 常见的CRC校验 CRC校验计算过程 CRC校验代码参考 代码解读 生成CRC8校验表的代码 CRC检验网站 如何…

FPGA校验(2):CRC校验

CRC:输入序列对某个表达式求余数&#xff0c;或者认为一系列数据求异或的过程。 CRC校验 CRC原理 CRC实现非常简单&#xff0c;但想要真正掌握CRC算法原理&#xff0c;就必须清楚地了解有限域的运算规则&#xff0c;知道CRC就是有限域中的除法余数&#xff0c;并且清楚如何将串…

crc校验c语言程序,C语言:CRC校验

一、CRC码 CRC:Cylic Reduancy check译作汉语就是循环冗余校验码。 二、XOR XOR:逻辑运算符异或,不知道用符号怎么写,总之其运算法则是,不同为1,相同为0。 三、用XOR代替算术运算上除法的两个例子。 1、10110010000/11001 第一次异或(相除),得到商为1,余数为1111,加入…

【Verilog】CRC 校验(二)用 Verilog 实现生成 CRC 校验码

目录 实验任务 CRC 生成 Verilog 实现 电路生成原理 模块设计图 CRC 生成时序图 具体代码实现 上板验证 实验任务 在上一篇介绍了 CRC 校验码的原理&#xff0c;如何计算 CRC 校验码&#xff0c;这篇介绍如何利用 Verilog 实现CRC 校验码的生成。 什么是 CRC 校验码&a…

CRC校验 - 基于FPGA的实现

CRC校验 - 基于FPGA的实现 0 背景 CRC即循环冗余校验&#xff1a;常用于数据通信领域中&#xff0c;通常由发送端添加校验码于单帧数据的尾部&#xff0c;并由接受方进行提取和校验该帧数据传输是否正确。 循环冗余检查&#xff08;CRC&#xff09;是一种数据传输检错功能&am…

CRC校验的原理及实现方法

一、CRC校验介绍 循环冗余校验码&#xff08;CRC&#xff09;&#xff0c;是一种常用的、具有检错、纠错能力的校验码&#xff0c;在早期的通信中运用广泛。循环冗余校验码常用于外存储器和计算机同步通信的数据校验。循环冗余校验是通过某种数学运算来建立数据位和校验位的约定…

C#编程,CRC校验原理

1.CRC简介 CRC全称循环冗余校验(Cyclic Redundancy Check&#xff0c; CRC)&#xff0c;是通信领域数据传输技术中常用的检错方法&#xff0c;用于保证数据传输的可靠性。网上有关这方面的博客和资料很多&#xff0c;本文尽量简洁的梳理一下它的原理。后面还会结合自己的实践经…

LabVIEW实现CRC校验

目录 1、内部控件计算CRC校验 2、公式节点计算CRC校验 CRC&#xff08;循环冗余校验&#xff09;&#xff0c;是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术&#xff0c;主要用来检测或校验数据传输或者保存后可能出现的错误。它是利用除…

CRC校验及C语言实现

摘自&#xff1a;CRC校验原理及其C语言实现 地址&#xff1a;https://blog.csdn.net/whik1194/article/details/108837493?spm1001.2014.3001.5502 目录 什么是校验算法CRC算法简介CRC参数模型CRC计算CRC校验CRC计算的C语言实现CRC计算工具总结 什么是校验算法 最近的工作中&…

SwitchHosts

SwitchHosts 官网&#xff1a;https://oldj.github.io/SwitchHosts/ 客户端支持 WindowsLinuxMac 功能支持 快速切换Hosts在线 hosts 方案Chrome浏览器Hosts实时生效 v3.3.12后将被支持&#xff0c;可暂时下载 https://github.com/CloverNet/SwitchHosts