本篇紧接上一篇的JavaWeb1继续进行以下的学习
5、Mybatis
MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射,用于简化JDBC 的开发
5.1概述介绍
①、特点
-
灵活的 SQL 执行:MyBatis 允许开发者编写原生 SQL,这使得 SQL 的编写更加灵活,能够针对不同的数据库进行优化。
-
映射简单直观:通过 XML 或注解的方式将 SQL 的结果映射成 Java 对象,使得开发者能够清晰地看到 SQL 和对象之间的映射关系。
-
支持动态 SQL:MyBatis 提供了强大的动态 SQL 支持,可以根据不同的条件动态生成 SQL 语句,减少了代码量。
-
易于集成:可以很容易地与 Spring 等框架集成,方便在大型项目中使用。
②、核心组件
-
SqlSessionFactory:它是 MyBatis 的核心对象之一,负责创建 SqlSession。它是线程安全的,通常在应用启动时创建一次,然后在整个应用生命周期中使用。
-
SqlSession:是执行命令、获取映射器和管理事务的。
-
Mapper:是 MyBatis 中的映射器,它定义了操作数据库的接口。通过接口和 XML 文件(或注解)的结合,MyBatis 能够将接口方法调用映射为具体的 SQL 执行。
③、配置文件
-
mybatis-config.xml:这是 MyBatis 的全局配置文件,它配置了 MyBatis 的运行环境等信息,例如数据库连接池、事务管理等。
-
Mapper XML 文件:定义了操作数据库的 SQL 语句以及 SQL 语句与 Java 对象之间的映射关系。
5.2、入门程序
①、创建项目
之后删除多余的文件,只保留.src和pom.xml即可
②、配置application.properties
spring.application.name=mybatis
# mybatis 配置数据库连接信息
# 表示连接到 localhost 上的 MySQL 数据库实例,端口号为 3306,数据库名称为 test
# 同时指定使用 com.mysql.cj.jdbc.Driver 驱动程序
# 用户名和密码分别为 root 和 123456
spring.datasource.url = "jdbc:mysql://localhost:3306/test";
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username = "root";
spring.datasource.password = "123456";

③、最终结构
最终主要编写:
-
创建User类
-
修改application.properties
-
编写Mapper接口
-
单元测试实现

注意启动MySQL
5.3、idea连接数据库
5.4、数据库连接池
数据库连接池是一种用于管理数据库连接的技术,它在应用程序和数据库之间建立一个连接的缓冲池,通过复用连接来提高数据库操作的性能。
①、主要特点
-
连接复用:避免频繁创建和关闭连接的开销
-
连接管理:统一管理连接的生命周期
-
性能优化:减少连接建立和释放的时间
-
资源控制:限制最大连接数,防止资源耗尽
②、常见Java的连接池实现
-
HikariCP:目前性能最好的JDBC连接池(创建spring boot项目默认自带使用的)
-
Apache DBCP:Apache Commons项目中的连接池
-
C3P0:老牌连接池,稳定性好
-
Druid:阿里巴巴开源连接池,提供监控功能
要想切换连接池需要实现两步(以将原默认的 HikariCP 切换为 Druid 为例):
-
引入需切换的连接池的依赖
<!-- Druid连接池核心依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.18</version> <!-- 请使用最新版本 -->
</dependency>
<!-- 如果需要Spring Boot支持 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.18</version> <!-- 请使用最新版本 -->
</dependency>
-
在 application.properties 中添加 type 配置
spring.application.name=mybatis
# mybatis 配置数据库连接信息
# 连接到 localhost 上的 MySQL 数据库,端口为 3306,数据库名为 test
# 数据库驱动类为 com.mysql.cj.jdbc.Driver
# 数据库用户名和密码分别为 root 和 123456
# 默认数据库连接池使用的是 HikariCP
# 如果想修改连接池的类型,可以在 application.properties 中添加以下配置
# 以切换连接池为阿里巴巴的 Druid 连接池为例,添加以下配置即可,同时需要在 pom.xml 中添加 Druid 连接池的依赖
# spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=123456
5.5、基于mybatis的注解实现数据库的增删改查
①、查找
在之前已经实现了,即测试数据库连接时使用的@Select注解
②、删除
-
接口中添加删除语句,使用@Delete注解
-
添加测试方法
-
查看数据库是否删除成功

MyBatis 中 #{} 和 ${} 是两种不同的参数占位符,它们在 SQL 处理方式上有本质区别:
| 特性 | #{} (预编译占位符) | ${} (字符串替换) |
|---|---|---|
| 处理方式 | 预编译参数,生成 PreparedStatement | 直接文本替换,生成 Statement |
| 安全性 | 防止 SQL 注入,安全 | 有 SQL 注入风险,不安全 |
| 数据类型 | 自动处理类型转换 | 直接替换,不处理类型 |
| 适用场景 | 值参数(WHERE条件值等) | 动态表名、列名等非值部分 |
③、插入
和删除同理,不过如果要传入的参数过多,建议将其封装为一个类,直接传入该类对象即可
注意当切换依赖后,刷新后仍然报错可尝试手动清除maven缓存
④、修改
修改同上
⑤、补充
MyBatis @Update 注解中参数绑定的两种方式对比
在 MyBatis 中,您展示了两种参数传递方式,我将详细解释它们的区别和使用场景:
方式1:不使用 @Param 注解
@Update("update student2 set name = #{name} where id = #{id}")
public int update(String name, Integer id);
特点:
-
MyBatis 默认使用参数索引名称:
#{param1}对应第一个参数,#{param2}对应第二个参数 -
但同时也支持直接使用参数名
#{name}和#{id}(需要满足特定条件)
使用条件:
-
使用 Java 8+ 编译时添加
-parameters参数 -
或 MyBatis 配置了
useActualParamName=true(MyBatis 3.4.1+)
优点:
-
代码简洁
-
不需要额外注解
缺点:
-
依赖编译配置,可移植性较差
-
参数重命名时容易出错
方式2:使用 @Param 注解
@Update("update student2 set name = #{name} where id = #{id}")
public int update(@Param("name") String name, @Param("id") Integer id);
特点:
-
明确指定每个参数的名称
-
在 SQL 中必须使用
@Param指定的名称(#{name}和#{id})
优点:
-
不依赖编译配置,可移植性好
-
参数名明确,代码更易读
-
重构时更安全(IDE 可以正确识别引用)
-
支持复杂场景(如集合、多参数等)
缺点:
-
代码稍显冗长
最佳实践建议
-
生产代码推荐使用 @Param:
-
特别是多人协作项目
-
需要长期维护的项目
-
-
简单项目/快速原型可以省略:
-
确保开发环境配置正确(Java 8+ 的
-parameters) -
小型或个人项目
-
-
特别注意:
-
如果方法只有一个参数且是简单类型,通常不需要
@Param -
如果参数是对象(如
User),直接使用属性名即可(#{user.name})
-
-
XML 配置方式:如果使用 XML 映射文件,
@Param几乎是必须的:
<update id="update">
UPDATE student2 SET name = #{name} WHERE id = #{id}
</update>
版本兼容性说明
-
MyBatis 3.4.0 及之前:必须使用
@Param或多参数方法的param1形式 -
MyBatis 3.4.1+:可以通过配置
useActualParamName=true支持直接使用参数名 -
Spring Boot + MyBatis:Spring Boot 2.0+ 默认启用了
useActualParamName
选择哪种方式取决于您的项目需求、团队规范和开发环境配置。对于需要长期维护的严肃项目,明确使用 @Param 是更可靠的选择。
精简总结:当前基于 springboot 官方骨架创建的项目可不使用
@Param注解,基于其他骨架如阿里云创建的则不可省略
5.6、基于mybatis的xml映射配置实现数据库的增删改查
XML 映射文件是 MyBatis 的核心配置之一,用于定义 SQL 语句和映射规则。
默认规则:
-
XML 映射文件的名称与 Mapper 接口名称一致,并且将 XML 映射文件和 Mapper 接口放置在相同包下(同包同名)。
-
XML 映射文件的 namespace 属性为 Mapper 接口全限定名一致。

-
XML 映射文件中 SQL 语句的 id 与 Mapper 接口中的方法名一致,并保持返回类型一致。
-
namespace:必须对应Mapper接口的全限定名
-
id:必须对应接口方法名
-
parameterType:可以省略,MyBatis通常能自动推断
-
resultType/resultMap:指定结果映射
-
#{}和{}:#{}是预编译参数,{}是字符串替换
如果未实现同包同名,即以上的两个默认规则,可在 application.properties 中自定义你的xml映射文件所处位置,可添加类似以下配置:
mybatis.mapper-locations = classpath:mapper/*.xml
即在类路径下resources中的mapper文件夹中寻找所有以xml结尾的文件
基础文件结构
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--注意此处的 namespace 要和 UserMapper 接口的全限定名一致-->
<mapper namespace="org.example.mybatis.mapper.UserMapper">
<!--要执行的 SQL 语句-->
</mapper>
常用SQL语句类型
注意以下SQL语句都是要插入到基础文件结构中的mapper标签内才可生效
1. SELECT 查询
<!-- 执行的是 UserMapper 接口中的 selectAll 方法 -->
<!-- 返回的类型是你自定义的类,需要写全限定名 -->
<select id="selectAll" resultType="org.example.mybatis.pojo.User">
SELECT * FROM student2
</select>
<select id="selectById" resultType="User" parameterType="Long">
SELECT * FROM users WHERE id = #{id}
</select>
<!-- 结果映射到Map -->
<select id="selectAsMap" resultType="map">
SELECT id, username FROM users
</select>
2. INSERT 插入
<insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
INSERT INTO users(username, password)
VALUES(#{username}, #{password})
</insert>
<!-- 批量插入 -->
<insert id="batchInsert">
INSERT INTO users(username, email) VALUES
<foreach collection="list" item="user" separator=",">
(#{user.username}, #{user.email})
</foreach>
</insert>
3. UPDATE 更新
<update id="updateUser" parameterType="User">
UPDATE users
SET username=#{username}, password=#{password}
WHERE id=#{id}
</update>
4. DELETE 删除
<delete id="deleteUser" parameterType="Long">
DELETE FROM users WHERE id = #{id}
</delete>
简单的 SQL 语句可使用注解进行,复杂的则建议使用 XML 映射
5.7、项目配置文件的优化
①、YAML 基本格式规范
-
键值对格式:键与值之间必须用 冒号 + 空格 分隔。
port: 8080 address: 127.0.0.1 -
缩进表示层级:
-
只能使用空格,不允许使用 Tab(IDEA 会自动将 Tab 替换为空格)。
-
同层级元素必须左对齐。
-
-
注释:使用
#开头,直到行尾的内容都会被忽略。# 这是注释
②、定义格式
定义对象(Map)
user:
name: 张三
age: 18
password: 123456
定义数组(List / Set)
hobby:
- java
- game
- sport
特殊注意:以 0 开头的值
如果配置项的值以 0 开头,必须用引号包裹,否则 YAML 会将其解析为八进制数。
# 错误示例(会被解析为八进制)
code: 0123
# 正确示例
code: "0123"
故我们原来的application.properties文件可改为yaml文件的格式
spring.application.name=mybatis
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=123456
# 以上是application.properties文件,以下是application.yml文件
spring:
application:
name: mybatis
datasource:
url: jdbc:mysql://localhost:3306/test
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 123456
以上的 yaml 文件的定义格式大家可去看我的k8s的学习笔记,其中对于pod、deployment、statefulset等组件的定义均使用的是 yaml 文件的格式
至此基础便学习完成,当然部分maven高级知识我有分开单独学习,以及docker等工具的使用需要自行学习

768

被折叠的 条评论
为什么被折叠?



