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 实现查询所有用户数据,通过简洁配置与注解方式,快速搭建数据库交互功能,核心涉及工程创建、环境配置、代码编写三个环节 。
二、步骤拆解与代码说明
(一)准备工作
- 工程创建与依赖引入
创建 SpringBoot 工程时,在依赖选择界面勾选MyBatis Framework
、MySQL Driver
等(如演示截图中New Module
配置 ),让项目具备 MyBatis 操作数据库的基础环境。 - 数据库与实体类准备
- 搭建数据库表
user
,包含id
、username
、password
、name
、age
等字段(对应示例数据 )。 - 编写实体类
User
,映射数据库表字段:
- 搭建数据库表
public class User { private Integer id; // IDprivate String username; // 用户名private String password; // 密码private String name; // 姓名 private Integer age; // 年龄// 省略Getter、Setter、构造方法等
}
- 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)的容器,负责分配、回收连接,让应用复用已有连接,而非每次新建,避免连接泄漏。
二、核心优势
- 资源复用:重复利用连接,减少创建 / 销毁连接的资源开销(如网络握手、数据库认证)。
- 提升响应速度:直接从池内拿现成连接,无需等待新建,系统响应更快。
- 避免连接泄漏:自动释放空闲过久的连接,防止因未关闭连接导致的资源耗尽问题。
三、技术规范与实现
- 标准接口:
DataSource
(Java 官方定义),第三方通过实现此接口提供连接池,核心方法getConnection()
获取数据库连接。 - 常见产品:
C3P0
:经典老牌连接池,配置灵活但性能略逊。DBCP
:Apache 旗下,稳定但功能相对基础。Druid
(阿里开源):功能强大(支持监控、防 SQL 注入等),性能优秀,是 Java 生态常用选择。Hikari
:Spring Boot 默认连接池,轻量、高性能,优化极致,主流项目首选。
四、使用示例(以 Druid 为例,Spring Boot 场景)
-
引入依赖
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.19</version> </dependency>
-
配置连接池
指定连接池类型、数据库地址、账号密码等:
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对数据库表增删改查
一、查询操作
(一)、查询所有信息
- 实现方式:在
UserMapper
接口中,通过@Select
注解定义查询 SQL 语句,如@Select("select * from user")
,该注解让 MyBatis 自动执行对应的查询逻辑,将查询结果映射为User
实体类的集合返回 。
@Select("select * from user")
public List<User> findAll();
- 测试验证:在测试类
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));
}
- 关键优势:利用 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注解可以省略 (#{形参名})。
二、删除操作
- 实现方式:在
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);
- 测试验证:测试类中注入
UserMapper
,调用deleteById
方法并传入要删除的用户id
(如5
),通过输出返回的影响行数System.out.println("受影响的记录数据" + i);
,判断删除操作是否执行成功,验证删除逻辑的正确性 。
@Test
public void testDeleteById(){Integer i= userMapper.deleteById(5);System.out.println("受影响的记录数据" + i);
}
- 注意要点: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