MyBatis高效查询:简化JDBC开发实战

Mybatis

MyBatis 是一款优秀持久层(DAO)框架,用于简化 JDBC 开发 ,原是 Apache 开源项目 iBatis,经历迁移改名,2010 年从 Apache 迁到 Google Code 并改名,2013 年 11 月迁至 GitHub,官网为 https://mybatis.org/mybatis-3/zh_CN/index.html ,在分层架构(controller 控制层、service 业务层、dao 持久层 )中,可通过注解(如 @Select )等方式操作数据库,像示例中 UserMapper 接口用 @Select("select * from user") 实现查询全部用户功能 。

MyBatis 查询所有用户数据

一、核心流程概述

利用 MyBatis 结合 SpringBoot 实现查询所有用户数据,通过简洁配置与注解方式,快速搭建数据库交互功能,核心涉及工程创建、环境配置、代码编写三个环节 。

二、步骤拆解与代码说明

(一)准备工作
  1. 工程创建与依赖引入
    创建 SpringBoot 工程时,在依赖选择界面勾选 MyBatis FrameworkMySQL Driver 等(如演示截图中 New Module 配置 ),让项目具备 MyBatis 操作数据库的基础环境。
  2. 数据库与实体类准备
    • 搭建数据库表 user,包含 idusernamepasswordnameage 等字段(对应示例数据 )。
    • 编写实体类 User,映射数据库表字段:
public class User { private Integer id; // IDprivate String username; // 用户名private String password; // 密码private String name; // 姓名 private Integer age; // 年龄// 省略Getter、Setter、构造方法等 
}
  1. MyBatis 配置(数据库连接)
    application.properties 中配置数据库连接信息,让 MyBatis 能访问数据库:
spring.datasource.url=jdbc:mysql://localhost:3306/web
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=1234
(二)编写 MyBatis 程序(持久层接口)

定义持久层接口 UserMapper,用 @Mapper 注解让 SpringBoot 自动创建代理对象并纳入 IOC 容器,通过 @Select 注解编写 SQL 语句:

package com.itxiaoli.mapper;import com.itxiaoli.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;import java.util.List;@Mapper 
public interface UserMapper {/*** 查询所有用户信息* @return 包含所有用户数据的 List<User>*/@Select("select * from user")public List<User> findAll();
}
  • @Mapper:关键注解,触发 MyBatis 动态代理机制,运行时生成接口实现类,方便注入使用。
  • @Select:指定要执行的 SQL 语句,这里 “select * from user” 实现查询 user 表全部数据,返回 List<User> 结果 。

三、关键要点总结

  • 依赖与配置:通过 SpringBoot 初始化工程并选对依赖,配合 application.properties 配置数据库,为 MyBatis 运行铺路。
  • 注解驱动@Mapper 托管接口实现类,@Select 简化 SQL 编写,无需额外 XML 映射文件(简单场景下 ),快速实现数据库查询。
  • 分层规范:持久层接口命名遵循 XxxMapper 规范,契合 MyBatis 开发习惯,清晰划分数据访问层级,让代码结构更规整 。

这套流程能高效实现 “查询所有用户数据” 需求,是 MyBatis 基础且典型的应用场景,后续可拓展复杂查询、增删改操作,或结合 XML 配置优化 SQL 管理 。

四、JDBC VS Mybatis

编程方式与代码复杂度
  • JDBC:代码较为繁琐。以查询用户数据为例,需要加载数据库驱动(Class.forName("com.mysql.cj.jdbc.Driver") ),建立数据库连接(DriverManager.getConnection(url, "root", "1234") ),创建并执行 SQL 语句(PreparedStatement ps = connection.prepareStatement("select * from user") ),手动处理结果集(遍历 ResultSet 并将数据封装到自定义对象 ),最后释放资源(resultSet.close()ps.close()connection.close() ) 。过程中代码量大,容易出错,尤其是处理复杂查询和结果集映射时,代码会更加冗长。
  • MyBatis:通过简洁的注解或 XML 配置来定义 SQL 语句。例如使用 @Mapper 注解标识持久层接口,@Select 注解编写 SQL 查询语句 ,MyBatis 会自动处理 SQL 执行和结果映射,大大简化了数据访问层的代码编写,提高了开发效率,代码结构也更加清晰。
数据库连接与资源管理
  • JDBC:在 JDBC 中,每次执行数据库操作都需要手动建立和关闭数据库连接。频繁的连接创建与关闭会消耗大量资源,影响性能,而且如果资源关闭操作出现遗漏,可能导致数据库连接泄漏等问题。
  • MyBatis:通常与数据库连接池(如 HikariCP ,在 Spring Boot 项目中默认集成 )结合使用。通过在配置文件(如application.properties )中配置数据库连接信息,连接池负责管理连接的创建、分配和回收,减少了连接创建的开销,提高了系统的性能和稳定性。
可维护性与可扩展性
  • JDBC:SQL 语句通常以硬编码的方式嵌入到 Java 代码中,当 SQL 需要修改时,需要在 Java 代码中查找并修改对应的 SQL 片段,尤其是在大型项目中,修改和维护成本较高。此外,对于不同数据库的兼容性支持,需要开发者手动处理 SQL 语法差异,扩展性较差。
  • MyBatis:SQL 语句与 Java 代码分离(使用注解时,SQL 也相对独立;使用 XML 配置时更明显 ),便于集中管理和维护 SQL。当需要修改 SQL 时,只需在对应的注解或 XML 文件中进行修改即可。同时,MyBatis 提供了良好的数据库兼容性,通过配置不同的数据库方言,可以方便地切换不同的数据库,扩展性更强。
数据映射
  • JDBC:从 ResultSet 中获取数据并封装到 Java 对象中,需要开发者手动编写代码进行数据类型转换和赋值,操作繁琐且容易出错。
  • MyBatis:具备强大的自动映射功能,能够根据数据库表结构和 Java 实体类的属性自动进行映射,将查询结果直接封装到对应的实体类对象中,减少了手动映射的工作量,提高了开发效率和代码的准确性。

总的来说,MyBatis 相比 JDBC 在开发效率、代码维护、资源管理等方面具有明显优势,更适合在企业级开发中使用,尤其是在复杂的业务场景下 。不过,了解 JDBC 有助于理解数据库操作的底层原理,而且在一些轻量级或对性能要求极致且业务简单的场景中,JDBC 也有其用武之地。

数据库连接池

一、核心概念

数据库连接池是管理数据库连接(Connection)的容器,负责分配、回收连接,让应用复用已有连接,而非每次新建,避免连接泄漏。

二、核心优势

  1. 资源复用:重复利用连接,减少创建 / 销毁连接的资源开销(如网络握手、数据库认证)。
  2. 提升响应速度:直接从池内拿现成连接,无需等待新建,系统响应更快。
  3. 避免连接泄漏:自动释放空闲过久的连接,防止因未关闭连接导致的资源耗尽问题。

三、技术规范与实现

  • 标准接口DataSource(Java 官方定义),第三方通过实现此接口提供连接池,核心方法 getConnection() 获取数据库连接。
  • 常见产品:
    • C3P0:经典老牌连接池,配置灵活但性能略逊。
    • DBCP:Apache 旗下,稳定但功能相对基础。
    • Druid(阿里开源):功能强大(支持监控、防 SQL 注入等),性能优秀,是 Java 生态常用选择。
    • Hikari:Spring Boot 默认连接池,轻量、高性能,优化极致,主流项目首选。

四、使用示例(以 Druid 为例,Spring Boot 场景)

  1. 引入依赖

    <dependency>  <groupId>com.alibaba</groupId>  <artifactId>druid-spring-boot-starter</artifactId>  <version>1.2.19</version>  
    </dependency>  
    
  2. 配置连接池

    指定连接池类型、数据库地址、账号密码等:

    spring.datasource.type=com.alibaba.druid.pool.DruidDataSource  
    spring.datasource.url=jdbc:mysql://localhost:3306/web  
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver  
    spring.datasource.username=root  
    spring.datasource.password=1234  
    

五、小结

数据库连接池通过 “复用连接 + 管理生命周期”,解决了直连数据库的性能与资源问题。记住核心点:

  • 角色:连接的 “容器管家”,分配、回收连接。
  • 价值:省资源、提速度、防泄漏。
  • 实现:基于 DataSource 接口,主流产品各有侧重(Hikari 轻量默认、Druid 功能丰富)。

简单说,连接池就是让数据库连接 “按需复用、自动管理” 的工具,是 Java 开发中优化数据库交互的基础手段 。

Mybatis对数据库表增删改查

一、查询操作

(一)、查询所有信息
  1. 实现方式:在UserMapper接口中,通过@Select注解定义查询 SQL 语句,如@Select("select * from user") ,该注解让 MyBatis 自动执行对应的查询逻辑,将查询结果映射为User实体类的集合返回 。
@Select("select * from user")
public List<User> findAll();
  1. 测试验证:在测试类MybaitsQuickstartApplicationTests里,注入UserMapper后,调用findAll方法执行查询,通过遍历结果集userList.forEach(user -> System.out.println(user)); ,验证查询功能是否正常,检查能否正确获取数据库中user表的全部数据 。
@Test
public void testFindAll(){List<User> userList = userMapper.findAll();userList.forEach(user -> System.out.println(user));
}
  1. 关键优势:利用 MyBatis 注解方式,无需额外编写 XML 映射文件,简化了简单查询场景的配置,让查询逻辑与接口定义紧密结合,方便维护,同时 MyBatis 自动完成结果集到实体类的映射,提升开发效率 。
(二)、根据用户名和密码查询用户信息
	 /*** 根据username和password查询用户信息*/@Select("SELECT * FROM user WHERE username=#{username} AND password=#{password}")public User findByUsernameAndPassword(@Param("username") String username,@Param("password") String password);

[!CAUTION]

@Param 是 MyBatis 中多参数传递时的常用注解,通过显式命名参数,实现 SQL 语句与方法参数的精准绑定,提升代码可读性和维护性,是日常开发中推荐的参数传递方式。

 /*** 测试根据用户名和密码查询用户信息*/@Testpublic void testFindByUsernameAndPassword() {User user = userMapper.findByUsernameAndPassword("小王", "123456");System.out.println(user);}

[!NOTE]

基于官方骨架创建的springboot项目中,接口编译时会保留方法形参名,@Param注解可以省略 (#{形参名})。

在这里插入图片描述

二、删除操作

  1. 实现方式:在UserMapper接口中,使用@Delete注解编写删除 SQL,@Delete("DELETE FROM user WHERE id = #{id}") ,其中#{id}是 MyBatis 的占位符,会生成预编译 SQL,避免 SQL 注入风险,方法返回Integer类型,用于接收删除操作影响的行数 。
@Delete("DELETE FROM user WHERE id = #{id}")
public Integer deleteById(Integer id);
  1. 测试验证:测试类中注入UserMapper,调用deleteById方法并传入要删除的用户id(如5 ),通过输出返回的影响行数System.out.println("受影响的记录数据" + i); ,判断删除操作是否执行成功,验证删除逻辑的正确性 。
@Test
public void testDeleteById(){Integer i= userMapper.deleteById(5);System.out.println("受影响的记录数据" + i);
}
  1. 注意要点:DML 操作(增删改)的返回值代表执行后影响的行数,这是判断操作是否生效的重要依据;编写删除 SQL 时,合理使用#{}占位符保障安全,若因特殊需求(如动态表名)需用${} ,要做好参数校验防止 SQL 注入 。

三、#{} VS ${}

符号说明场景优缺点
#{…}占位符。执行时,会将#{…}替换为?,生成预编译SQL参数值传递安全、性能高 (推荐)
${…}拼接符。直接将参数拼接在SQL语句中,**存在SQL注入问题 **表名、字段名动态设置时使用不安全、性能低

在这里插入图片描述

四、增加操作

  /*** 添加用户信息* @param user* @return*/@Insert("INSERT INTO user (username, password, name,age) VALUES (#{username}, #{password}, #{name}, #{age})")public void insert(User user);
 /*** 测试添加*/@Testpublic void testInsert(){User user=new User(null,"小高","123456","小高",18);userMapper.insert(user);}

五、修改操作

  /*** 更新用户信息*/@Update("UPDATE user SET username=#{username},password=#{password},name=#{name},age=#{age} WHERE id=#{id}")public void update(User user);
    /*** 测试更新*/@Testpublic void testUpdate(){User user=new User(4,"小王","123456","小王",108);userMapper.update(user);}

XML映射配置

官方说明:https://mybatis.net.cn/getting-started.html

一、XML 映射配置核心规则

在 MyBatis 里,除注解配置 SQL,还能通过 XML 配置文件写 SQL,需遵循以下规则:

(一)文件命名与位置(同包同名)

XML 映射文件名称要和 Mapper 接口名称一致,且放在相同包下(/ 建目录,而非 . ,比如 Mapper 接口是 com.it.mapper.UserMapper ,XML 文件就放 src/main/resources/com/it/mapper/UserMapper.xml ,保证 “同包同名” )。

(二)namespace 属性

XML 映射文件的 namespace 属性,和 Mapper 接口的全限定名一致。像 Mapper 接口是 com.it.mapper.UserMapper ,XML 里就写 <mapper namespace="com.it.mapper.UserMapper"> ,这样 MyBatis 才能关联接口和 XML 里的 SQL 。

(三)SQL 语句匹配

XML 里 SQL 语句的 id ,要和 Mapper 接口中的方法名一致,返回类型也得匹配。比如接口有 List<User> findAll(); 方法,XML 中就写 <select id="findAll" resultType="com.itheima.pojo.User"> ,确保调用接口方法时,能找到对应 SQL 执行。

二、注解与 XML 开发选择

(一)注解开发场景

MyBatis 注解适合简单增删改查(CRUD )。像单表的简单查询、插入,用 @Select @Insert 等注解,直接在 Mapper 接口写 SQL ,简洁高效,少了 XML 文件配置的繁琐。

(二)XML 开发场景

若要实现复杂 SQL 功能(比如多表关联查询、动态 SQL 拼接 ),推荐用 XML 配置。XML 能更清晰组织复杂 SQL ,方便维护,还支持动态标签(<if> <foreach> 等 ),应对多变业务需求。

三、实际应用要点

  • 目录创建:建 XML 存放目录,牢记用 / 分隔包名(如 com/it/mapper ),别用 . ,否则编译后文件位置不对,MyBatis 找不到映射文件。
  • 严格匹配规则:开发时,仔细核对 XML 文件名、namespace 、SQL 的 id 与 Mapper 接口,稍有不匹配,就会报 “找不到 SQL 语句” 等错误。
  • 合理选开发方式:简单功能优先用注解,减少配置;复杂场景选 XML ,让 SQL 管理更灵活,结合二者优势,提升开发效率与代码可维护性。

通过掌握这些,就能正确用 XML 配置 MyBatis 映射,根据需求选注解或 XML 开发,保障 MyBatis 持久层操作稳定、高效 。

四 手动指定XML文件目录

#指定XML映射配置文件的位置
mybatis.mapper-locations=classpath:文件名/*.xml

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/91951.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/91951.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

系统信息及进程管理命令

系统信息及进程管理 一、系统信息查看 常用命令&#xff1a;uname、hostnam、hostnamectl、uptime、df、du、free、lscpu 1、uname (1)、命令简介 uname 是一个在 Unix 和类 Unix 系统&#xff08;如 Linux、macOS&#xff09;中常用的命令行工具&#xff0c;用于显示系统信息。…

【Z字形变换】

代码思路分析&#xff1a;Z 字形变换 1. 边界情况处理 if (r 1 || r > n) return s;r 1&#xff1a;只有一行&#xff0c;直接返回原字符串&#xff08;无需变换&#xff09;。r > n&#xff1a;行数大于等于字符串长度&#xff0c;每行只有一个字符&#xff0c;直接返…

VBA中类的解读及应用第二十五讲:把源数据赋给类利用类完成查找

《VBA中类的解读及应用》教程【10165646】是我推出的第五套教程&#xff0c;目前已经是第一版修订了。这套教程定位于最高级&#xff0c;是学完初级&#xff0c;中级后的教程。类&#xff0c;是非常抽象的&#xff0c;更具研究的价值。随着我们学习、应用VBA的深入&#xff0c;…

Vue3核心语法进阶(Hook)

Vue3 自定义 Hook&#xff1a;让你的代码像乐高一样“可复用”&#xff01;大家好&#xff0c;我是你们的前端小伙伴&#xff01;上一篇我们聊了 Vue3 的生命周期&#xff0c;今天咱们继续深入 Vue3 的核心利器——自定义 Hook&#xff08;Custom Hook&#xff09;。如果你已经…

工控领域协议之Modbus

Modbus 是一种通信协议&#xff0c;用于工业自动化领域中的设备之间的通信。它是一种串行通信协议&#xff0c;广泛应用于连接不同设备、传感器和执行器的工业控制系统。 Modbus 在工业控制系统、自动化设备、能源管理系统等领域得到广泛应用。 Modbus 协议的基本特点&#xff…

大件垃圾识别 mAP↑28%:陌讯多模态融合算法实战解析

一、行业痛点&#xff1a;大件垃圾识别的现实困境在城市环卫智能化转型过程中&#xff0c;大件垃圾&#xff08;如废旧家具、电器等&#xff09;的自动化识别与分拣成为关键环节。据住建部《城市环境卫生发展报告》显示&#xff0c;传统人工分拣模式下大件垃圾识别准确率不足 6…

vk框架或者普通函数封装的一些函数可以拿取使用【会持续更新】

1.身份证校验【通用】/*** function isIDCard* description 判断是否为有效的身份证号码。* param {string} idCard - 待验证的身份证号码。* returns {boolean} 返回验证结果。*/ pubFun.isIDCard function (idCard) {// 身份证号码为15位或者18位&#xff0c;15位时全为数字…

如何给Word和WPS文档添加密码或取消密码

要保护Word和WPS文档&#xff0c;可以为它们加密&#xff0c;加密有两类&#xff1a;打开密码和修改密码。密码设置有两个入口&#xff0c;一个是在另存为&#xff0c;一个是在文件菜单。Word和WPS文字的路径略有不同&#xff0c;微软Office和WPS的其他套件也是如此操作。一、W…

uni-app项目gitignore文件示例

uni-app 忽略以下文件和目录 DS_Store 忽略 UniApp 编译生成的小程序相关目录 unpackage/ uni_modules/ 忽略编辑器自动生成的文件 idea/ vscode/ 忽略日志文件 logs/ 忽略临时文件 temp/ 忽略构建工具自动生成的文件 build/ 忽略 npm 安装的包文件 package-lock.json yarn.loc…

LeetCode 135:分糖果

LeetCode 135&#xff1a;分糖果问题本质与核心挑战 给定孩子的评分数组&#xff0c;需满足 “每个孩子至少1颗糖果&#xff0c;相邻评分高的孩子糖果更多”&#xff0c;求最少糖果总数。核心挑战&#xff1a; 相邻约束是双向的&#xff08;左→右和右→左都需满足&#xff09;…

【QT】安装与配置

个人主页&#xff1a;Guiat 归属专栏&#xff1a;QT 文章目录1. QT简介与准备工作1.1 什么是QT1.2 QT的版本选择1.3 系统要求检查2. QT安装方式详解2.1 官方在线安装器2.2 离线安装包2.3 包管理器安装3. Windows平台安装配置3.1 Windows安装步骤3.2 环境变量配置3.3 Visual Stu…

Java从入门到精通 - 算法、正则、异常

算法、正则、异常 此笔记参考黑马教程&#xff0c;仅学习使用&#xff0c;如有侵权&#xff0c;联系必删 文章目录算法、正则、异常1. 常见算法1.1 简单认识算法1.1.1 什么是算法&#xff1f;1.1.2 为什么要学习算法&#xff1f;1.2 排序算法1.2.1 冒泡排序1.2.1.1 实现冒泡排…

题单【排序】

P1271 【深基9.例1】选举学生会 P1271 【深基9.例1】选举学生会 - 洛谷 【方法一】快速排序 使用sort()&#xff0c;注意数组的范围&#xff01;&#xff01;&#xff01; #include<bits/stdc.h> using namespace std;int a[2000000],n,m;int main() {cin>>n>&g…

【机器学习】(算法优化二)提升算法之:AdaBoost与随机梯度

文章目录一、 AdaBoost&#xff1a;自适应提升算法1、AdaBoost数学原理详解1.1、 目标函数1.2、 样本权重更新的逻辑1.3、 模型权重计算的含义1.4、 AdaBoost的核心思想2、为什么AdaBoost如此有效&#xff1f;二、 随机梯度提升算法&#xff1a;梯度优化下更精细的优化1、随机梯…

力扣 hot100 Day65

75. 颜色分类 给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums &#xff0c;原地 对它们进行排序&#xff0c;使得相同颜色的元素相邻&#xff0c;并按照红色、白色、蓝色顺序排列。 我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。 必须在不使用库内置的 sort 函…

12.Linux 磁盘管理

Linux : 磁盘管理 一、磁盘设备命名规则磁盘类型设备命名模式示例特点SATA/SCSI/SAS/dev/sdXsda&#xff08;第一块硬盘&#xff09; sda1&#xff08;第一块硬盘第一分区&#xff09;机械硬盘/通用接口NVMe/dev/nvmeXnYpZnvme0n1&#xff08;第一通道第一块盘&#xff09; …

《Linux服务与安全管理》| DHCP服务器安装和配置

《Linux服务与安全管理》| DHCP服务器安装和配置 目录 《Linux服务与安全管理》| DHCP服务器安装和配置 一、点击“编辑虚拟机设置”&#xff0c;配置三台虚拟机为“仅主机”模式。 二、server01开机&#xff0c;root用户登录&#xff0c;输入nmtui&#xff0c;进入图形界面…

赛博威携手Dify,助力AI在企业的场景化落地

人工智能正以前所未有的速度重塑商业世界。我们经历了从理论探索到大语言模型&#xff08;LLM&#xff09;的爆发式增长&#xff0c;如今&#xff0c;一个以“AI Agent&#xff08;智能体&#xff09;”为核心的新阶段已然来临。AI Agent代表了人工智能应用的未来形态。它不再被…

嵌入式硬件中三极管推挽电路控制与实现

我们昨天讲到了这个电路。 如果 A 电是 PWM 波,那么请问 B 点是不是 PWM 波呢?那么,当 PWM 为高时, B 点的电流是从哪里流过来的?

数据结构——查找(三、树形查找)

一、二叉排序树&#xff08;BST&#xff09;1、二叉排序树的定义构造一棵二叉排序树的目的并不是排序&#xff0c;而是提高查找、插入和删除关键字的速度二叉排序树&#xff08;也称二叉搜索树&#xff09;或者是一颗空树&#xff0c;或者是具有以下性质的二叉树1、若左子树非空…