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.propertiesapplication.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.propertiesapplication.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));
    

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

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

相关文章

python-leetcode 28.两数相加

题目&#xff1a; 给定两个非空链表&#xff0c;表示两个非负整数&#xff0c;它们每位数字都是按照逆序地方式存储&#xff0c;并且每个节点只能存储一位数字。请将两数相加&#xff0c;并以相同的形式返回一个表示和的链表。 输入&#xff1a;l1 [2,4,3], l2 [5,6,4] 输出…

【云安全】云原生- K8S API Server 未授权访问

API Server 是 Kubernetes 集群的核心管理接口&#xff0c;所有资源请求和操作都通过 kube-apiserver 提供的 API 进行处理。默认情况下&#xff0c;API Server 会监听两个端口&#xff1a;8080 和 6443。如果配置不当&#xff0c;可能会导致未授权访问的安全风险。 8080 端口…

微信小程序配置3 配置sass

1. 在config。json文件里面的setting配置“sass” 2. 改你需要的页面后缀名为scss。 3.查看页面即可看到样式。

16.React学习笔记.React更新机制

一. 发生更新的时机以及顺序## image.png props/state改变render函数重新执行产生新的VDOM树新旧DOM树进行diff计算出差异进行更新更新到真实的DOM 二. React更新流程## React将最好的O(n^3)的tree比较算法优化为O(n)。 同层节点之间相互比较&#xff0c;不跨节点。不同类型的节…

凸包算法—— cad c#二次开发

效果如下&#xff1a; 代码如下&#xff1a; using IfoxDemo; //[assembly: CommandClass(typeof(IFoxDemo.凸包class))]//只允许此类快捷键命令 namespace IFoxDemo {public class 凸包class{public static class 凸包助手{/// <summary>/// 计算点集的凸包并返回多段线…

ctfshow-36D杯

ctfshow-36D杯 给你shell ($obj[secret] ! $flag_md5 ) ? haveFun($flag) : echo "here is your webshell: $shell_path"; 这是个弱比较&#xff0c;输入?give_me_shell前三个是0说明二进制小于1000000就是ASCII的64&#xff0c; 0-32是不可见或非打印字符&…

Linux ARM64 将内核虚拟地址转化为物理地址

文章目录 前言一、通用方案1.1 kern_addr_valid1.2 __pa 二、ARM64架构2.1 AT S1E1R2.2 is_kernel_addr_vaild2.3 va2pa_helper 三、demo演示参考资料 前言 本文介绍一种通用的将内核虚拟地址转化为物理地址的方案以及一种适用于ARM64 将内核虚拟地址转化为物理地址的方案&…

本地部署DeepSeek集成VSCode创建自己的AI助手

文章目录 安装Ollama和CodeGPT安装Ollama安装CodeGPT 下载并配置DeepSeek模型下载聊天模型&#xff08;deepseek-r1:1.5b&#xff09;下载自动补全模型&#xff08;deepseek-coder:1.3b&#xff09; 使用DeepSeek进行编程辅助配置CodeGPT使用DeepSeek模型开始使用AI助手 ✍️相…

云原生AI Agent应用安全防护方案最佳实践(上)

当下&#xff0c;AI Agent代理是一种全新的构建动态和复杂业务场景工作流的方式&#xff0c;利用大语言模型&#xff08;LLM&#xff09;作为推理引擎。这些Agent代理应用能够将复杂的自然语言查询任务分解为多个可执行步骤&#xff0c;并结合迭代反馈循环和自省机制&#xff0…

解锁云电脑爽玩TGA游戏,ToDesk、海马云等多款云电脑游戏横测

作为一名游戏爱好者&#xff0c;我深入研究了云电脑技术在游戏娱乐中的应用。通过对比传统游戏机与云电脑的成本效益&#xff0c;我发现云电脑以其低成本和灵活性脱颖而出。我以自身为例&#xff0c;分析了云电脑如何满足对游戏体验的高要求。在测评中&#xff0c;我选择了ToDe…

新数据结构(4)——Java继承

基本概念 继承的本质&#xff1a;重复使用已经定义好的方法和域&#xff0c;实现代码的重复利用。 使用继承之后&#xff0c;创建的子类可以方便地调用父类中已经定义的方法。 一个继承的例子&#xff1a; 重载和重写 重载 重载&#xff1a;发生在同一个类里&#xff0c;指…

VMware Workstate 的 Ubuntu18 安装 vmware tools(不安装没法共享)

在共享主机路径后&#xff0c;可以在&#xff1a; /mnt/hgfs/下方找到共享的文件。但没有安装vmware tool时是没法共享的。 如何安装vmware tool&#xff0c;网上版本很多。这里记录一下&#xff1a; VMware Workstation 17 Pro&#xff0c;版本&#xff1a;17.6.0 虚拟机系统…

【每日一题 | 2025】2.3 ~ 2.9

个人主页&#xff1a;GUIQU. 归属专栏&#xff1a;每日一题 文章目录 1. 【2.3】P8784 [蓝桥杯 2022 省 B] 积木画2. 【2.4】P8656 [蓝桥杯 2017 国 B] 对局匹配3. 【2.5】[ABC365D] AtCoder Janken 34. 【2.6】P8703 [蓝桥杯 2019 国 B] 最优包含5. 【2.7】P8624 [蓝桥杯 2015…

ARM Cortex-M3/M4 权威指南 笔记【二】架构

一、架构 1.1 架构简介 Cortex-M3/M4 处理器都基于 ARMv7-M 架构。最初的 ARMv7-M 架构是随着 Cortex-M3 处理器一同引入的&#xff0c;而在 Cortex-M4 发布时&#xff0c;架构中又额外增加了新的指令和特性&#xff0c;改进后的架构有时也被称为 ARMV7E-M。要了解 ARM7-M 和…

Java进阶14 TCP日志枚举

Java进阶14 TCP&日志&枚举 一、网络编程TCP Java对基于TCP协议得网络提供了良好的封装&#xff0c;使用Socket对象来代表两端的通信端口&#xff0c;并通过Socket产生IO流来进行网络通信。 1、TCP协议发数据 1.1 构造方法 方法 说明 Socket(InetAddress address…

jenkins备份还原配置文件

下载ThinBackup插件 方式1 从插件市场直接下载 Manage Jenkins->Manage Plugins->可选插件搜索 注意&#xff1a;有时可能因为网络或者版本问题下载不了&#xff0c;好像是默认下载最新版本&#xff0c;可选择手动安装&#xff01; 方式二 手动安装插件 点击查看手…

基于单片机的电子式单项智能电表设计(论文+源码)

1. 系统整体方案设计 本课题为基于单片机的电子式单项智能电表&#xff0c;在此设计如图2.1所示的系统总体架构&#xff0c;其采用STM32单片机作为主控制器&#xff0c;搭配外设HLW8032模块实现对电压&#xff0c;电流&#xff0c;功率因数&#xff0c;电能消耗等参数进行检测…

C#/.NET/.NET Core技术前沿周刊 | 第 24 期(2025年1.27-1.31)

前言 C#/.NET/.NET Core技术前沿周刊&#xff0c;你的每周技术指南针&#xff01;记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿&#xff0c;助力技术成长与视野拓宽。 欢迎投稿、推荐…

java项目之基于推荐算法的图书购物网站源码(ssm+mybatis+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的基于推荐算法的图书购物网站项目。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 基于推荐算法的…

使用亚马逊针对 PyTorch 和 MinIO 的 S3 连接器进行模型检查点处理

2023 年 11 月&#xff0c;Amazon 宣布推出适用于 PyTorch 的 S3 连接器。适用于 PyTorch 的 Amazon S3 连接器提供了专为 S3 对象存储构建的 PyTorch 数据集基元&#xff08;数据集和数据加载器&#xff09;的实现。它支持用于随机数据访问模式的地图样式数据集和用于流式处理…