Mybatis快速入门与核心知识总结
Mybatis
- 1. 实体类(Entity Class)
- 1.1 实体类的定义
- 1.2 简化编写
- 1.2.1 @Data
- 1.2.2 @AllArgsConstructor
- 1.2.3 @NoArgsConstructor
- 2. 创建 Mapper 接口
- 2.1 @Param
- 2.2 #{} 占位符
- 2.3 SQL 预编译
- 3. 配置 MyBatis XML 映射文件(可选)
- 3.1 默认规则
- 4. 配置 MyBatis 主配置文件
- 4.1 Properties配置项解析
- 4.2 Properties 和 YAML/YML 配置文件的对比
- 5. 编写测试代码
- 5.1 @SpringBootTest
- 5.2 @Autowired
- 5.3 userList.forEach(System.out::println)
MyBatis 是一个优秀的持久层框架,它简化了 JDBC 的使用,允许开发者通过 XML 或注解方式配置 SQL 语句,并自动将查询结果映射为 Java 对象,从而高效地进行数据库操作。
1. 实体类(Entity Class)
com/itheima/pojo/User.java
package com.itheima.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {private Integer id;private String username;private String password;private String name;private Integer age;
}
1.1 实体类的定义
实体类(Entity Class)是用于表示数据库中数据结构的对象模型。它们通常包含与数据库表列相对应的属性,并提供相应的getter和setter方法来访问这些属性。此外,实体类还可能包含一些业务逻辑或验证规则。

1.2 简化编写
其中,@Data、@AllArgsConstructor 和 @NoArgsConstructor 是 Lombok 提供的注解,用于简化 Java 类的编写。这些注解可以自动生成常见的代码,减少样板代码(boilerplate code),使代码更加简洁和易读。下面是对这三个注解的简要解释:
1.2.1 @Data
@Data 是 Lombok 提供的一个综合性注解,它实际上是以下多个注解的组合:
@Getter和@Setter: 自动生成所有字段的 getter 和 setter 方法。@ToString: 自动生成toString()方法。@EqualsAndHashCode: 自动生成equals()和hashCode()方法。@RequiredArgsConstructor: 生成一个包含所有final字段或标记为@NonNull的构造函数。
1.2.2 @AllArgsConstructor
@AllArgsConstructor 注解用于生成一个包含所有字段的构造函数。每个字段都会成为构造函数的一个参数。
使用 @AllArgsConstructor 注解后,Lombok 会为 User 类生成如下构造函数:
public User(Integer id, String username, String password, String name, Integer age) {this.id = id;this.username = username;this.password = password;this.name = name;this.age = age;
}
1.2.3 @NoArgsConstructor
@NoArgsConstructor 注解用于生成一个无参构造函数。这对于需要反射创建对象的框架(如 Spring、Hibernate 等)非常有用。
使用 @NoArgsConstructor 注解后,Lombok 会为 User 类生成如下无参构造函数:
public User() {
}
2. 创建 Mapper 接口
创建一个 UserMapper 接口,定义与 User 相关的数据库操作方法。
com/itheima/mapper/UserMapper.java
package com.itheima.mapper;import com.itheima.pojo.User;
import org.apache.ibatis.annotations.*;import java.util.List;@Mapper //应用程序在运行时, 会自动的为该接口创建一个实现类对象(代理对象), 并且会自动将该实现类对象存入IOC容器 - bean
public interface UserMapper {/*** 查询所有用户*/@Select("select id, username, password, name, age from user")public List<User> findAll();/*** 根据ID删除用户*/@Delete("delete from user where id = #{id}")//public void deleteById(Integer id);public Integer deleteById(Integer id);/*** 新增用户*/@Insert("insert into user(username, password, name, age) values (#{username}, #{password}, #{name}, #{age})")public void insert(User user);/*** 更新用户*/@Update("update user set username = #{username}, password = #{password}, name = #{name}, age = #{age} where id = #{id}")public void update(User user);/*** 根据用户名和密码查询用户*/@Select("select * from user where username = #{username} and password = #{password}")public User findByUsernameAndPassword(@Param("username") String username,@Param("password") String password);
}
2.1 @Param
@Param 注解用于给方法参数命名,使得在 SQL 映射文件或注解中可以通过名称引用这些参数。这对于有多个参数的方法特别有用,而且在默认情况下,方法的形参名称不会被保留在 .class 字节码中。这意味着在运行时,MyBatis 无法直接获取方法参数的名称,只能通过参数的顺序进行绑定。
- 可读性:通过命名参数,SQL 语句更易于理解和维护。
- 灵活性:允许在同一个方法中有多个参数,并且每个参数都可以通过名称引用,而不是依赖于位置。
- 避免混淆:当有多个参数时,避免因参数顺序错误导致的问题。
然而,若您基于 Spring Boot 框架进行开发,并且您的项目继承自 spring-boot-starter-parent 父级工程,则该父级工程已预配置了以下插件。这使得在编译后能够保留方法的形式参数名称,从而允许框架在运行时访问这些参数名称。
<build><pluginManagement><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><parameters>true</parameters></configuration></plugin></plugins></pluginManagement>
</build>
2.2 #{} 占位符
#{} 是 MyBatis 中用于传递参数的占位符。它会将传入的参数值进行预编译处理,防止 SQL 注入攻击,并提高查询效率,以下是占位符与拼接符的区别
| 特性 | #{} 占位符 | ${} 拼接符 |
|---|---|---|
| 预编译 | 支持,防止 SQL 注入 | 不支持,容易导致 SQL 注入 |
| 类型转换 | 自动进行类型转换 | 不进行类型转换 |
| 适用场景 | 绑定参数值,如字段值、条件等 | 动态生成 SQL 语句,如表名、列名等 |
| 安全性 | 高,防止 SQL 注入 | 低,容易受到 SQL 注入攻击 |
| 性能 | 高,可以利用数据库的执行计划缓存 | 低,每次执行都需要重新解析和编译 |
| 灵活性 | 较低,适合固定结构的 SQL 语句 | 高,适合动态生成 SQL 语句 |
#{}占位符:用于传递参数值,支持预编译和类型转换,防止 SQL 注入,适合大多数场景。${}拼接符:用于直接拼接 SQL 字符串,不进行预编译和转义处理,适合动态生成 SQL 语句,但需特别注意安全性。
2.3 SQL 预编译
SQL 预编译(Prepared Statements)是指在执行 SQL 语句之前,先将其编译成数据库可以识别的执行计划,然后在实际执行时只需要传递参数即可。这种方式不仅可以提高查询效率,还能有效防止 SQL 注入攻击。
- 安全性:通过预编译机制,参数会被安全地传递到数据库,避免了直接拼接 SQL 字符串带来的 SQL 注入风险。
- 性能提升:对于重复执行的 SQL 语句,数据库可以缓存并重用执行计划,减少解析和编译的时间开销。
- 简化开发:开发者无需手动编写复杂的 SQL 语句拼接逻辑,减少了出错的可能性。
3. 配置 MyBatis XML 映射文件(可选)
使用 MyBatis 的注解,主要是来完成一些简单的增删改查功能。如果需要实现复杂的 SQL 功能,建议使用 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"><mapper namespace="com.itheima.mapper.UserMapper"><!-- 根据ID删除用户 --><select id="deleteById" parameterType="int" resultType="com.itheima.pojo.User">SELECT * FROM User WHERE id = #{id}</select><!-- 查询所有用户 --><select id="findAll" resultType="com.itheima.pojo.User">SELECT * FROM User</select>
3.1 默认规则
XML映射文件的名称与 Mapper 接口名称一致,并且将XML映射文件和 Mapper 接口放置在相同包下(同包同名)。XML映射文件的namespace属性为 Mapper 接口全限定名一致。XML映射文件中 sql 语句的id与 Mapper 接口中的方法名一致,并保持返回类型一致。

4. 配置 MyBatis 主配置文件
application.properties
spring.application.name=springboot-mybatis-quickstart
spring.datasource.url=jdbc:mysql://localhost:3306/userdb
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=mq20011103
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
这段配置文件是典型的 Spring Boot 应用程序中的 application.properties 或 application.yml 文件的一部分,用于配置应用程序的名称、数据源连接信息以及 MyBatis 的日志实现。下面是对每个配置项的详细解析:
4.1 Properties配置项解析
-
spring.application.name=springboot-mybatis-quickstart -
作用:设置应用程序的名称。
-
解释:这个属性定义了应用的名称,通常用于在日志、监控工具和其他地方标识该应用。在这个例子中,应用的名称为
springboot-mybatis-quickstart。 -
spring.datasource.url=jdbc:mysql://localhost:3306/userdb -
作用:设置数据库连接的 URL。
-
解释:这个属性指定了要连接的数据库的 JDBC URL。这里的 URL 表示连接到本地 (
localhost) MySQL 数据库服务器上的userdb数据库,端口号为 3306。 -
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver -
作用:设置数据库驱动类名。
-
解释:这个属性指定了用于连接数据库的 JDBC 驱动类。对于 MySQL 数据库,驱动类名为
com.mysql.cj.jdbc.Driver,这是 MySQL Connector/J 提供的驱动类。 -
spring.datasource.username=root -
作用:设置数据库用户名。
-
解释:这个属性指定了连接数据库时使用的用户名。在这个例子中,用户名为
root。 -
spring.datasource.password=mq20011103 -
作用:设置数据库密码。
-
解释:这个属性指定了连接数据库时使用的密码。在这个例子中,密码为
mq20011103。请注意,实际生产环境中应确保密码的安全性,避免直接硬编码在配置文件中。 -
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl -
作用:设置 MyBatis 的日志实现类。
-
解释:这个属性指定了 MyBatis 使用的日志实现类。
org.apache.ibatis.logging.stdout.StdOutImpl表示将 MyBatis 的日志输出到标准输出(控制台)。这有助于调试和查看 SQL 执行情况。
4.2 Properties 和 YAML/YML 配置文件的对比
| 特性 | Properties 文件 | YAML 文件 |
|---|---|---|
| 语法 | 扁平化键值对 | 层次结构化,使用缩进 |
| 可读性 | 较低,尤其是复杂配置 | 高,结构清晰 |
| 维护性 | 较低,特别是对于嵌套配置 | 高,嵌套结构易于管理 |
| 数据类型支持 | 仅支持字符串,需手动转换其他类型 | 支持多种数据类型,自动类型转换 |
| 缩进敏感性 | 不敏感 | 敏感,必须保持一致的缩进 |
| 使用场景 | 简单配置,传统应用 | 复杂配置,现代框架如 Spring Boot |
application.yaml/yml
spring:application:name: springboot-mybatis-quickstartdatasource:url: jdbc:mysql://localhost:3306/userdbdriver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: mq20011103mybatis:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
5. 编写测试代码
编写一个简单的测试类来验证这些操作是否正常工作:
package com.itheima;import com.itheima.mapper.UserMapper;
import com.itheima.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.List;@SpringBootTest
class AliyunMybatisQuickstartApplicationTests {@Autowiredprivate UserMapper userMapper;@Testpublic void testFindAll(){List<User> userList = userMapper.findAll();userList.forEach(System.out::println);}/*** 测试删除*/@Testpublic void testDeleteById(){Integer i = userMapper.deleteById(4);System.out.println("执行完毕, 影响的记录数: " + i);}/*** 测试新增*/@Testpublic void testInsert(){User user = new User(null,"gaoyuanyuan","666888","高圆圆", 18);userMapper.insert(user);}/*** 测试更新*/@Testpublic void testUpdate(){User user = new User(1,"zhouyu","666888","周瑜", 20);userMapper.update(user);}/*** 测试查询*/@Testpublic void testSelect(){User user = userMapper.findByUsernameAndPassword("zhouyu", "666888");System.out.println(user);}}
5.1 @SpringBootTest
@SpringBootTest 是一个用于集成测试的注解,它会启动整个 Spring Boot 应用程序上下文(ApplicationContext),以便在测试环境中进行依赖注入和其他 Spring 功能的测试。
- 启动整个应用程序:当使用
@SpringBootTest注解时,Spring Boot 会自动创建并启动一个完整的应用程序上下文,类似于实际运行的应用程序。 - 自动配置:该注解会自动加载应用程序的配置文件(如
application.properties或application.yml),并根据这些配置初始化相应的 Bean。 - 依赖注入:允许在测试类中使用
@Autowired注解来注入需要测试的组件或服务。
5.2 @Autowired
@Autowired 是一个用于依赖注入的注解,它可以自动将所需的依赖项注入到类中。
- 自动注入:通过
@Autowired注解,Spring 容器会自动查找匹配的 Bean 并将其注入到目标字段、构造函数或方法参数中。 - 字段注入:可以直接在字段上使用
@Autowired,如示例中的userMapper字段。 - 构造函数注入:也可以在构造函数上使用
@Autowired,这种方式通常被认为更安全和推荐。 - Setter 方法注入:可以在 setter 方法上使用
@Autowired,但这种方式较少使用。
5.3 userList.forEach(System.out::println)
userList.forEach(System.out::println); 这行代码使用了 Java 8 引入的 方法引用 和 Lambda 表达式,目的是对 userList 中的每一个元素调用 System.out.println() 方法进行打印。
- 等效的 Lambda 表达式 如果你不使用方法引用,可以使用 Lambda 表达式来实现相同的功能:
userList.forEach(user -> System.out.println(user));
相关文章:
Mybatis快速入门与核心知识总结
Mybatis 1. 实体类(Entity Class)1.1 实体类的定义1.2 简化编写1.2.1 Data1.2.2 AllArgsConstructor1.2.3 NoArgsConstructor 2. 创建 Mapper 接口2.1 Param2.2 #{} 占位符2.3 SQL 预编译 3. 配置 MyBatis XML 映射文件(可选)3.1 …...
用docker在本地用open-webui部署网页版deepseek
前置条件 用Ollama在本地CMD窗口运行deepseek大模型-CSDN博客文章浏览阅读109次,点赞5次,收藏2次。首次运行需要下载deepseek的大模型包(大约5GB,根据本地网速的不同在半个小时到几个小时之间下载完成) ,并…...
2025.2.8——一、[护网杯 2018]easy_tornado tornado模板注入
题目来源:BUUCTF [护网杯 2018]easy_tornado 目录 一、打开靶机,整理信息 二、解题思路 step 1:分析已知信息 step 2:目标——找到cookie_secret step 3:构造payload 三、小结 一、打开靶机,整理信…...
前端实现在PDF上添加标注(1)
前段时间接到一个需求,用户希望网页上预览PDF,同时能在PDF上添加文字,划线,箭头和用矩形框选的标注,另外还需要对已有的标注进行修改,删除。 期初在互联网上一通搜索,对这个需求来讲发现了两个问…...
【CXX-Qt】1.1 Rust中的QObjects
本文涉及到了使用CXX-Qt将Rust、C和QML集成到Qt应用程序中的各个方面。下面,我将提供一个简单的示例,演示如何使用CXX-Qt来创建一个Rust结构体并将其作为QObject子类暴露给C和QML。 一、设置CXX-Qt环境 首先,确保您已经安装了Rust、CXX和CX…...
操作系统中的任务调度算法
一、引言 在操作系统中,任务调度算法是核心组件之一,它负责合理分配有限的 CPU 资源,以确保系统的高效运行和良好的用户体验。任务调度的目标是实现公平性、最小化等待时间、提高系统吞吐量,并最大化 CPU 的利用率。不同的任务调…...
GitCode 助力 Easy-Es,革新 Elasticsearch 开发体验
项目仓库(点击阅读原文链接可直达) https://gitcode.com/dromara/easy-es 项目背景:填补 Elasticsearch ORM 框架空白 在 Java 开发领域,Excel 和 Elasticsearch 的代码编写难度一直名列前茅,尤其是 Elasticsearch&a…...
线程同步(互斥锁与条件变量)
文章目录 1、为什么要用互斥锁2、互斥锁怎么用3、为什么要用条件变量4、互斥锁和条件变量如何配合使用5、互斥锁和条件变量的常见用法 参考资料:https://blog.csdn.net/m0_53539646/article/details/115509348 1、为什么要用互斥锁 为了使各线程能够有序地访问公共…...
EF Core中实现值对象
目录 值对象优点 值对象的需求 值类型的实现 值类型GEO的实现 值类型MultilingualString的实现 案例:构建表达式树,简化值对象的比较 值对象优点 把有紧密关系的属性打包为一个类型把领域知识放到类的定义中 class shangjia {long id;string nam…...
《从入门到精通:蓝桥杯编程大赛知识点全攻略》(十一)-回文日期、移动距离、日期问题
前言 在这篇博客中,我们将通过模拟的方法来解决三道经典的算法题:回文日期、移动距离和日期问题。这些题目不仅考察了我们的基础编程能力,还挑战了我们对日期处理和数学推理的理解。通过模拟算法,我们能够深入探索每个问题的核心…...
Kubernetes 最佳实践:Top 10 常见 DevOps/SRE 面试问题及答案
1. 如何在 Kubernetes 中设置资源请求和限制? 资源请求确保容器有最小资源量(CPU/内存),而限制则强制容器消耗的最大资源量。这有助于高效资源分配并防止资源争用。 示例: resources:requests:memory: "256Mi&…...
Docker Compose介绍及安装使用MongoDB数据库详解
在现代容器化应用部署中,Docker Compose是一种非常实用的工具,它允许我们通过一个docker-compose.yml文件来定义和运行多容器应用程序。然而,除了Docker之外,Podman也提供了类似的工具——Podman Compose,它允许我们在…...
科普:数据仓库中的“指标”和“维度”
在数据仓库中,指标和维度是两个核心概念,它们对于数据分析和业务决策至关重要。以下是对这两个概念的分析及举例说明: 一、指标 定义: 指标是用于衡量业务绩效的关键数据点,通常用于监控、分析和优化企业的运营状况。…...
11.swagger使用
菜单位置 未登录接口会返回401 登录的token存储的位置 配置文件swagger配置中将/dev-api修改/...
java高级知识之集合
前言 集合是java开发中的重点内容,需要掌握的东西很多,面试中可问的东西很多,无论是深度还是广度。集合框架中Collection对应的实现类如下所示,这些都是要完全掌握,一个可以分为三大类List集合、Set‘集合以及Map集合…...
deepseek + kimi 高效生成PPT
1.在deepseek中生成ppt大纲 2.将大纲复制到kimi中生成PPT kimi:https://kimi.moonshot.cn/...
hadoop之MapReduce:片和块
假如我现在500M这样的数据,如何存储? 500M 128M 128M 128M 116M 分为四个块进行存储。 计算的时候,是按照片儿计算的,而不是块儿。 块是物理概念,一个块就是128M ,妥妥的,毋庸置疑。 片是逻辑概念&…...
好好说话:深度学习扫盲
大创项目是和目标检测算法YOLO相关的,浅浅了解了一些有关深度学习的知识。在这里根据本人的理解做一些梳理。 深度学习是什么? 之前经常听到AI,机器学习,深度学习这三个概念,但是对于三者的区别一直很模糊。 AI&…...
ASP.NET Core的贫血模型与充血模型
目录 概念 需求 贫血模型 充血模型 总结 概念 贫血模型:一个类中只有属性或者成员变量,没有方法。充血模型:一个类中既有属性、成员变量,也有方法。 需求 定义一个类保存用户的用户名、密码、积分;用户必须具有…...
【愚公系列】《Python网络爬虫从入门到精通》001-初识网络爬虫
标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主&…...
Kubernetes控制平面组件:etcd(一)
云原生学习路线导航页(持续更新中) kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计(一)Kubernetes架构原则和对象设计(二)Kubernetes架构原则和对象设计(三)kubectl 和 …...
2100年芜湖人的一天:张明的生活剪影
2100年芜湖人的一天:张明的生活剪影 破晓 6:30 "沙沙"的微风声轻轻掠过耳畔,杨柳的沙沙声混合着若有若无的鸟鸣,张明的意识从深邃的梦境中缓缓浮现。这并非真实的自然声响,而是他的脑机接口精心编织的唤醒交响曲。量子…...
外贸网站源码 助力企业抢占蛇年市场先机!
在竞争激烈的外贸市场中,蛇年无疑是企业寻求突破与增长的关键一年。外贸网站源码为企业提供了快速搭建专业外贸网站的解决方案,助力企业在新的一年抢占市场先机。 快速上线 时间就是商机,尤其是在蛇年这样充满变数和机遇的年份。外贸网站源码…...
verilog练习:i2c slave 模块设计
文章目录 前言1.结构2.代码2.1 iic_slave.v2.2 sync.v2.3 wr_fsm.v2.3.1 状态机状态解释 2.4 ram.v 3. 波形展示4. 建议5. 资料总结 前言 首先就不啰嗦iic协议了,网上有不少资料都是叙述此协议的。 下面将是我本次设计的一些局部设计汇总,如果对读者有…...
项目6:基于大数据校园一卡通数据分析和可视化
1、项目简介 本项目是基于大数据的清华校园卡数据分析系统,通过Hadoop,spark等技术处理校园卡交易、卡号和商户信息数据。系统实现消费类别、男女消费差异、学院消费排行和年级对比等分析,并通过Web后端和可视化前端展示结果。项目运行便捷&…...
Linux常见系统日志类型
目录 系统日志(/var/log/syslog 或 /var/log/messages) 认证日志(/var/log/auth.log 或 /var/log/secure) Web服务器日志(/var/log/apache2/ 或 /var/log/nginx/) MySQL日志(/var/log/mysql/…...
npm 常用命令大全
npm 常用命令大全 下载包 npm install清理缓存 npm cache clean --force查看当前配置 npm config get registry设置淘宝镜像 npm config set registry https://registry.npmmirror.com查看 npm 版本 npm -vnpm 设置超时时间 npm config set fetch-timeout 600更新依赖 …...
java.io.InvalidClassException
类实现序列问题 如果实现了序列,最好生成序列号,因为类结构发生改变时,会报错 java.io.InvalidClassException 所以实现序列,需要生成序列号 private static final long serialVersionUID 1L;...
Datawhale 组队学习 Ollama教程 task1
一、Ollama 简介 比喻:Ollama 就像是一个“魔法箱子”,里面装满了各种大型语言模型(LLM)。你不需要懂复杂的魔法咒语(配置),只需要轻轻一按(一条命令),就能让…...
大模型基本原理(二)——ChatGPT的工作原理
如何得到一个ChatGPT? 1、无监督预训练:通过大量的文本数据集进行无监督训练,得到一个基座模型(只会续写文本) 2、监督微调:通过一些人类撰写的高质量对话数据对基座模型进行监督微调,得到一个…...
