当前位置: 首页 > news >正文

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.dtcms.com/a/314916.html

相关文章:

  • Python 虚拟环境深入浅出全指南
  • 为流媒体时代而生的云服务:Akamai 推出 Accelerated Compute 加速计算服务
  • 在 Maven 多模块项目中统一管理配置文件
  • 8.4 Java Web(Maven P50-P57)
  • 【web应用】为什么 子模块已经删除,但 Maven 依赖项仍然报错?
  • python采集拍立淘按图搜索API接口,json数据参考
  • maven install和package的区别
  • AI绘图-Stable Diffusion-WebUI的基本用法
  • 安卓开发--ConstraintLayout(约束布局)
  • 5天挑战网络编程 -DAY1(linux版)
  • 二十年代深度立体匹配的进化与前沿综述
  • 咖啡参考基因组
  • 机器学习 入门——决策树分类
  • FreeRTOS源码分析四:时钟中断处理响应流程
  • 倒排索引:Elasticsearch 搜索背后的底层原理
  • 【C#】Blazor基本应用
  • ICCV2025 Tracking相关paper汇总和解读(19篇)
  • Matlab(2)
  • Maven配置,Idea集成Maven_依赖引入,Idea生成单元测试
  • 《AI Agent工程师(初级)》
  • ubuntu24.01安装odoo18
  • gdb print设置技巧,离线查看复杂结构体和数组变量内容,展开多层嵌套的结构体的方法
  • 【Docker安装】Ubuntu 24.04.2 LTS系统下安装Docker环境——指定APT源安装方式
  • C + +
  • 宝塔运维实战:CentOs7启动PHP7.4失败
  • 华为OD机考2025C卷 - 最小矩阵宽度(Java Python JS C++ C )
  • Linux下PXE服务器搭建
  • 嵌入式数据结构笔记(二):内存工具与链表操作
  • QT 如何实现enum与字符串的互转
  • Java基础学习(一):类名规范、返回值、注释、数据类型