MyBatis操作数据库(1)

1. MyBatis 简介

MyBatis 是一款持久层框架,简化了 JDBC 的复杂操作,通过配置和映射文件将 Java 对象与数据库表关联。核心优势:

  • 自动管理资源:无需手动关闭连接、释放资源。

  • 动态 SQL:支持参数绑定、条件查询等。

  • 灵活映射:支持结果集与 Java 对象的自动映射。

2. 快速入门
2.1 准备工作
  1. 创建 Spring Boot 工程,添加依赖:

<!-- MyBatis 依赖 -->
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.3</version>
</dependency>
<!-- MySQL 驱动 -->
<dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId>
</dependency>

2.数据库表准备

CREATE TABLE `user_info` (`id` INT NOT NULL AUTO_INCREMENT,`username` VARCHAR(127) NOT NULL,`password` VARCHAR(127) NOT NULL,`age` TINYINT NOT NULL,`gender` TINYINT DEFAULT '0' COMMENT '1-男 2-女 0-默认',`phone` VARCHAR(15) DEFAULT NULL,`delete_flag` TINYINT DEFAULT '0' COMMENT '0-正常 1-删除',`create_time` DATETIME DEFAULT NOW(),`update_time` DATETIME DEFAULT NOW() ON UPDATE NOW(),PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

3.实体类

@Data
public class UserInfo {private Integer id;private String username;private String password;private Integer age;private Integer gender;private String phone;private Integer deleteFlag;private Date createTime;private Date updateTime;
}
2.2 配置数据源

在 application.yml 中配置数据库连接:

spring:datasource:url: jdbc:mysql://localhost:3306/mybatis_test?useSSL=false&characterEncoding=utf8username: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driver
3. 注解方式操作数据库
3.1 查询操作

Mapper 接口

@Mapper
public interface UserInfoMapper {@Select("SELECT username, password, age, gender, phone FROM user_info")List<UserInfo> queryAllUser();
}

测试类

@SpringBootTest
class UserInfoMapperTest {@Autowiredprivate UserInfoMapper userInfoMapper;@Testvoid queryAllUser() {List<UserInfo> userList = userInfoMapper.queryAllUser();System.out.println(userList);}
}
3.2 参数传递

使用 #{参数名} 动态传参:

@Select("SELECT * FROM user_info WHERE id = #{id}")
UserInfo queryById(Integer id);
3.3 插入操作

返回自增主键:

@Options(useGeneratedKeys = true, keyProperty = "id")
@Insert("INSERT INTO user_info (username, password) VALUES (#{username}, #{password})")
Integer insert(UserInfo userInfo);
4. XML 方式操作数据库
4.1 配置 XML 路径

在 application.yml 中指定 XML 文件位置:

mybatis:mapper-locations: classpath:mapper/*Mapper.xml
4.2 编写 XML 文件

UserInfoMapper.xml

<mapper namespace="com.example.mapper.UserInfoMapper"><select id="queryAllUser" resultType="UserInfo">SELECT * FROM user_info</select><insert id="insertUser" useGeneratedKeys="true" keyProperty="id">INSERT INTO user_info (username, password)VALUES (#{username}, #{password})</insert>
</mapper>
4.3 结果映射

解决字段名与属性名不一致问题:

<resultMap id="userMap" type="UserInfo"><id column="id" property="id"/><result column="delete_flag" property="deleteFlag"/><result column="create_time" property="createTime"/><result column="update_time" property="updateTime"/>
</resultMap>
5. 常见问题与解决方案
5.1 字段名映射
  1. 开启驼峰命名(推荐)

mybatis:configuration:map-underscore-to-camel-case: true

   2. 手动别名

SELECT delete_flag AS deleteFlag FROM user_info
5.2 #{} 与 ${} 的区别
  • #{}:预编译 SQL,防止 SQL 注入。

  • @Select("SELECT * FROM user_info WHERE username = #{name}")
    UserInfo queryByName(String name);

    ${}:直接拼接 SQL,适用于动态排序或表名:

@Select("SELECT * FROM user_info ORDER BY ${sortKey}")
List<UserInfo> queryBySort(@Param("sortKey") String sortKey);
5.3 模糊查询

使用 CONCAT 函数避免 SQL 注入:

@Select("SELECT * FROM user_info WHERE username LIKE CONCAT('%', #{key}, '%')")
List<UserInfo> queryByKeyword(String key);
6. 多表查询示例

实体类

@Data
public class ArticleInfo {private Integer id;private String title;private String content;private Integer userId;private String username; // 关联用户表字段
}

Mapper 接口

@Select("SELECT a.*, u.username FROM article_info a LEFT JOIN user_info u ON a.user_id = u.id WHERE a.id = #{id}")
ArticleInfo getArticleWithUser(Integer id);
7. 数据库连接池

Spring Boot 默认使用 Hikari,切换为 Druid

<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.21</version>
</dependency>
8. 总结
  • 核心功能:MyBatis 通过注解或 XML 简化 SQL 操作,支持动态 SQL 和结果映射。

  • 最佳实践

    • 优先使用 #{} 防止 SQL 注入。

    • 开启驼峰命名简化字段映射。

    • 复杂 SQL 使用 XML 配置,简单操作使用注解。

  • 企业规范:表名小写下划线分隔,必备字段 idcreate_timeupdate_time

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

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

相关文章

ModuleNotFoundError: No module named ‘matplotlib_inline‘

ModuleNotFoundError: No module named matplotlib_inline 1. ModuleNotFoundError: No module named matplotlib_inline2. matplotlib-inlineReferences 如果你在普通的 Python 脚本或命令行中运行代码&#xff0c;那么不需要 matplotlib_inline&#xff0c;因为普通的 Python…

SSL证书自动化管理(ACME协议)工作流程介绍

SSL证书自动化管理&#xff08;ACME协议&#xff09;是一种用于自动化管理SSL/TLS证书的协议&#xff0c;以下是其详细介绍&#xff1a; 一、ACME协议概述 ACME协议由互联网安全研究小组&#xff08;ISRG&#xff09;设计开发&#xff0c;旨在实现SSL证书获取流程的自动化。通…

基于FPGA的特定序列检测器verilog实现,包含testbench和开发板硬件测试

目录 1.课题概述 2.系统测试效果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 本课题采用基于伪码匹配相关峰检测的方式实现基于FPGA的特定序列检测器verilog实现,包含testbench和开发板硬件测试。 2.系统测试效果 仿真测试 当检测到序列的时候&#xf…

#管理Node.js的多个版本

在 Windows 11 上管理 Node.js 的多个版本&#xff0c;最方便的方法是使用 nvm-windows&#xff08;Node Version Manager for Windows&#xff09;。它允许你轻松安装、切换和管理多个 Node.js 版本。 &#x1f4cc; 方法 1&#xff1a;使用 nvm-windows&#xff08;推荐 ✅&a…

【已解决】Webstorm 每次使用 git pull/push 都要输入令牌/密码登录

解决办法&#xff1a;勾上【使用凭据帮助程序】&#xff08;英文&#xff1a;Use credential helper&#xff09;

大模型架构记录13【hr agent】

一 Function calling 函数调用 from dotenv import load_dotenv, find_dotenvload_dotenv(find_dotenv())from openai import OpenAI import jsonclient OpenAI()# Example dummy function hard coded to return the same weather # In production, this could be your back…

Spring Boot向Vue发送消息通过WebSocket实现通信

注意&#xff1a;如果后端有contextPath&#xff0c;如/app&#xff0c;那么前端访问的url就是ip:port/app/ws 后端实现步骤 添加Spring Boot WebSocket依赖配置WebSocket端点和消息代理创建控制器&#xff0c;使用SimpMessagingTemplate发送消息 前端实现步骤 安装sockjs-…

【嵌入式学习5】PyQt5模块介绍、创建第一个窗口

目录 1、PyQt介绍 ①特点 ②主要组件 2、创建第一个窗口 exce_() 1、PyQt介绍 PyQt 是一个用于创建图形用户界面&#xff08;GUI&#xff09;应用程序的 Python 库&#xff0c;它是 Qt 框架的 Python 绑定。 ①特点 跨平台&#xff1a;支持多种操作系统&#xff0c;包括…

封装自己的api签名sdk

api平台接口调用&#xff0c;需要通过签名去核对是不是有效的用户&#xff0c;&#xff0c;一般会给两个key&#xff0c;acceeKey 和 secretKey,第一个相当于用户名&#xff0c;第二个相当于密钥&#xff0c;&#xff0c;&#xff0c;前端通过一定的算法&#xff0c;&#xff0…

很简单 的 将字幕生成视频的 方法

一、一键将字幕生成视频的 方法 1、下载任性动图 10.7 以上版本 2、设置背景 1&#xff09;背景大小 拉伸背景到合适大小&#xff0c;或者选择右侧比例 2&#xff09;、直接空背景&#xff0c;设置背景颜色等详细信息 3&#xff09;、或者 复制或者突然图片做背景 3、设置文…

Spring 核心技术解析【纯干货版】- XXI:Spring 第三方工具整合模块 Spring-Context-Suppor 模块精讲

在企业级开发中&#xff0c;我们经常需要与 第三方工具 进行集成&#xff0c;如 邮件发送、任务调度、缓存管理等。Spring 为此提供了 Spring-Context-Support 模块&#xff0c;它封装了多个常见的第三方工具库&#xff0c;使得开发者可以更方便地将它们集成到 Spring 项目中。…

c++柔性数组、友元、类模版

目录 1、柔性数组&#xff1a; 2、友元函数&#xff1a; 3、静态成员 注意事项 面试题&#xff1a;c/c static的作用? C语言&#xff1a; C: 为什么可以创建出 objx 4、对象与对象之间的关系 5、类模版 1、柔性数组&#xff1a; #define _CRT_SECURE_NO_WARNINGS #…

主相机绑定小地图

资源初始化&#xff1a;在类中通过 property 装饰器定义主相机、小地图相机、小地图精灵等资源属性&#xff0c;便于在编辑器中赋值。在 start 方法里&#xff0c;当确认这些资源存在后&#xff0c;创建渲染纹理并设置其大小&#xff0c;将渲染纹理与小地图相机关联&#xff0c…

linux-core分析-柔性数组越界访问

文章目录 core的调用栈core分析修改修改原因柔性数组定义代码修改总结core的调用栈 vocb core 崩溃:core的大小都是573M左右 Program terminated with signal SIGSEGV, Segmentation fault. #0 0x0000007f789af0d0 in strlen () from /lib/libc.so.6[Current thread is 1 (LW…

leetcode 代码随想录 数组-区间和

题目 给定一个整数数组 Array&#xff0c;请计算该数组在每个指定区间内元素的总和。 输入&#xff1a; 第一行输入&#xff1a;为整数数组 Array 的长度 n&#xff0c;接下来 n 行&#xff0c;每行一个整数&#xff0c;表示数组的元素。随后的输入为需要计算总和的区间&…

部署nerdctl工具

nerdctl 是一个专为Containerd设计的容器管理命令行工具&#xff0c;旨在提供类似 Docker 的用户体验&#xff0c;同时支持 Containerd 的高级特性&#xff08;如命名空间、compose等&#xff09;。 1、下载安装 wget https://github.com/containerd/nerdctl/releases/downlo…

【论文笔记】DeepSeek-R1 技术报告

最强开源LLM&#xff0c;性能和效果都很棒&#xff1b;在数学、代码这种有标准正确答案的场景&#xff0c;表现尤为突出&#xff1b;一些其他场景的效果&#xff0c;可能不如DeepSeek-V3和Qwen。 Deepseek-R1没有使用传统的有监督微调sft方法来优化模型&#xff0c;而使用了大规…

YOLO学习笔记 | 基于YOLOv5的车辆行人重识别算法研究(附matlab代码)

基于YOLOv5的车辆行人重识别算法研究 🥥🥥🥥🥥🥥🥥🥥🥥🥥🥥🥥🥥🥥🥥 摘要 本文提出了一种基于YOLOv5的车辆行人重识别(ReID)算法,结合目标检测与特征匹配技术,实现高效的多目标跟踪与识别。通过引入注意力机制、优化损失函数和轻量化网络结构…

Buildroot与Yocto介绍比对

Buildroot 和 Yocto 是嵌入式 Linux 领域最常用的两大系统构建工具&#xff0c;它们在功能定位、使用方法和适用场景上有显著差异。以下从专业角度对两者进行对比分析&#xff1a; 一、Buildroot 核心功能与特点 1. 功能定位 轻量级系统构建工具&#xff1a;专注于快速生成精…

VUE3初始化项目安装

本次就是作为实验使用&#xff0c;包括安装过程中遇到的问题&#xff0c;供大家提供参考&#xff0c;话不多说&#xff0c;看过程&#xff1a; 第1步&#xff1a;首先分别安装node.js和npm&#xff0c;这步网上有很多资料&#xff0c;很简单&#xff0c;过程省略了&#xff0c…