目录

一、什么是 MyBatis?为什么要用它?

二、MyBatis 核心概念(通俗理解)

1.SqlSessionFactory

2.SqlSession

3.Mapper接口

4.映射文件(XML)

三、手把手搭建第一个 MyBatis 项目

1. 准备工作

2. 核心配置文件(mybatis-config.xml)

3. 编写实体类(User.java)

4. 编写 Mapper 接口(UserMapper.java)

5. 编写映射文件(UserMapper.xml)

6. 编写测试类(MyBatisTest.java)

四、核心知识点总结

1.参数传递

2.结果映射


一、什么是 MyBatis?为什么要用它?

MyBatis 是一款 Java 半自动化映射框架,核心作用是简化数据库操作。

对比传统 JDBC:

  • 无需手动写 Connection、Statement、ResultSet 等重复代码 SQL 语句,减少了50%以上的代码量。
  • 与 Java 代码分离,便于维护和优化 自动完成数据库字段与 Java 实体类的映射。
  • 提供映射标签,支持对象与数据库的 ORM 字段关系映射。

简单说:用 MyBatis 写数据库操作,更简单、更灵活

二、MyBatis 核心概念(通俗理解)

1.SqlSessionFactory

  • 数据库连接的 “工厂”,通过核心配置文件创建
  • 作用:生产SqlSession(类似生产 “数据库连接”,同样也需要关闭资源)

2.SqlSession

  • 数据库会话对象,相当于“数据库连接”
  • 作用:获取Mapper接口,执行SQL操作

3.Mapper接口

  • 定义数据库操作方法(如 selectUserById、insertUser)
  • 无需实现类,MyBatis 会自动生成代理对象

4.映射文件(XML)

  • 存放 SQL 语句,与 Mapper 接口一一对应
  • 通过标签(select/insert 等)绑定接口方法

三、手把手搭建第一个 MyBatis 项目

1. 准备工作

数据库:MySQL,创建 user 表(附建表 SQL):

CREATE TABLE `user` (`id` int(11) PRIMARY KEY AUTO_INCREMENT,`username` varchar(50) NOT NULL,`age` int(3) DEFAULT NULL,`create_time` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

项目:Maven 工程,引入依赖(pom.xml):

<!-- MyBatis 核心包 -->
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.10</version>
</dependency>
<!-- MySQL 驱动 -->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.30</version>
</dependency>

2. 核心配置文件(mybatis-config.xml)

放在 resources 目录下,配置数据库连接和映射文件路径:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><environments default="development"><environment id="development"><!-- 事务管理:JDBC 方式 --><transactionManager type="JDBC"/><!-- 数据源:连接池方式 --><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis_demo?useSSL=false"/><property name="username" value="root"/> <!-- 你的数据库用户名 --><property name="password" value="123456"/> <!-- 你的数据库密码 --></dataSource></environment></environments><!-- 映射文件路径:指定 Mapper XML 位置 --><mappers><mapper resource="mapper/UserMapper.xml"/></mappers>
</configuration>

3. 编写实体类(User.java)

属性与表字段对应(建议用驼峰命名,如 createTime 对应表 create_time):

public class User {private Integer id;private String username;private Integer age;private LocalDateTime createTime;// 省略 getter、setter、toString 方法
}

4. 编写 Mapper 接口(UserMapper.java)

定义数据库操作方法:

public interface UserMapper {//查询所有用户List<User> selectAllUser();// 根据 ID 查询用户User selectById(Integer id);// 新增用户int insert(User user);// 根据 ID 修改用户int updateById(User user);// 根据 ID 删除用户int deleteById(Integer id);
}

5. 编写映射文件(UserMapper.xml)

放在 resources/mapper 目录下,绑定 Mapper 接口并写 SQL:

<?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 必须与 Mapper 接口全类名一致 -->
<mapper namespace="com.example.mapper.UserMapper"><!-- 查询:id 与接口方法名一致,resultType 是返回类型 --><select id="selectById" resultType="com.example.pojo.User">select * from user where id = #{id}</select><!-- 新增:useGeneratedKeys 获取自增主键,keyProperty 绑定实体类属性 --><insert id="insert" useGeneratedKeys="true" keyProperty="id">insert into user(username, age, create_time)values(#{username}, #{age}, #{createTime})</insert><!-- 修改 --><update id="updateById">update user setusername = #{username},age = #{age}where id = #{id}</update><!-- 删除 --><delete id="deleteById">delete from user where id = #{id}</delete>
</mapper>

#{}是一种常见的占位符语法, 用于将变量或表达式的结果嵌入到双引号/单引号字符串中,自动转换为字符串类型。(能够有效防止sql注入问题)

6. 编写测试类(MyBatisTest.java)

通过SqlSession执行操作:

public class MyBatisTest {public static void main(String[] args) throws IOException {// 1. 读取核心配置文件InputStream is = Resources.getResourceAsStream("mybatis-config.xml");// 2. 创建 SqlSessionFactorySqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);// 3. 获取 SqlSession(true 表示自动提交事务)SqlSession session = factory.openSession(true);// 4. 获取 Mapper 接口代理对象UserMapper userMapper = session.getMapper(UserMapper.class);// 5. 执行 SQL 操作// 新增用户User user = new User();user.setUsername("张三");user.setAge(20);user.setCreateTime(LocalDateTime.now());int insert = userMapper.insert(user);System.out.println("新增成功,影响行数:" + insert);System.out.println("新增的用户 ID:" + user.getId()); // 自增 ID 会回显// 查询用户(用上面新增的 ID)User queryUser = userMapper.selectById(user.getId());System.out.println("查询结果:" + queryUser);// 修改用户queryUser.setAge(21);int update = userMapper.updateById(queryUser);System.out.println("修改成功,影响行数:" + update);// 删除用户int delete = userMapper.deleteById(user.getId());System.out.println("删除成功,影响行数:" + delete);// 6. 关闭会话session.close();}
}

四、核心知识点总结

1.参数传递

  • 单个参数:直接用 #{参数名}(如 #{id})
  • 多个参数:有两种方法:(1)传入参数时放入Map键值对,通过键名访问值,达到传入多个参数的目的;(2)传入参数时将要传入的值封装到实体类中,通过访问实体类属性名传入多个参数
  • 实体类参数:用 #{属性名}(如 #{username} 对应 user.getUsername())

2.结果映射

  • 表字段与实体属性名一致:用 resultType 直接指定实体类
  • 符合Mybatis定义映射规则:用 resultType 直接指定实体类,并且在mybatis-config.xml里面配置驼峰映射
  • 不一致:用 resultMap 手动映射
<settings><!--将数据库中的下划线映射为驼峰--><setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>

位置放于mybatis-config.xml中<environments>前

<resultMap id="userMap" type="com.example.pojo.User"><id column="id" property="id"/> <!-- 主键 --><result column="username" property="username"/><result column="age" property="age"/><result column="create_time" property="createTime"/> <!-- 字段与属性映射 -->
</resultMap>

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

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

相关文章

数据结构初阶(12)排序算法—插入排序(插入、希尔)(动图演示)

2. 常见排序算法的实现2.0 十大排序算法2.1 插入排序 2.1.1 基本思想直接插入排序是一种简单的插入排序法&#xff1a;基本思想把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中。直到所有的记录插入完为止&#xff0c;得到一个新的有序序列 。 比 挪 (…

MySQL优化常用的几个方法

本实例是对慢sql从2万优化到5千优化方法的汇总。 首先贴上优化效果&#xff1a;1、更新数据时使用ID更新&#xff1b;2、"分页/轮询"查询时先获取符合数据要求主键的最大和最小ID&#xff0c;然后WHERE条件增加ID步增查询&#xff1b;3、检查SQL是否命中WHERE条件&am…

深入解析 AUTOSAR:汽车软件开发的革命性架构

引言在汽车智能化、网联化、电动化浪潮席卷全球的今天&#xff0c;汽车电子系统的复杂性与日俱增。传统“烟囱式”的 ECU 开发模式&#xff08;各供应商独立开发软硬件&#xff09;带来了巨大的兼容性、复用性和维护成本挑战。AUTOSAR&#xff08;AUTomotive Open System ARchi…

计算机视觉(opencv)实战一——图像本质、数字矩阵、RGB + 图片基本操作(灰度、裁剪、替换等)

OpenCV 入门教程&#xff1a; OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉库&#xff0c;广泛应用于图像处理、视频分析、机器学习等领域。 在 Python 中&#xff0c;cv2 是 OpenCV 的主要接口模块。本文将带你一步步掌握 cv2…

《探索C++ set与multiset容器:深入有序唯一性集合的实现与应用》

前引&#xff1a;在STL的关联式容器中&#xff0c;set以其严格的元素唯一性和自动排序特性成为处理有序数据的核心工具。其底层基于红黑树&#xff08;Red-Black Tree&#xff09;实现&#xff0c;保证了O(log n)的查找、插入与删除复杂度&#xff01;本文将从底层原理切入&…

各测试平台功能对比分析(ITP,Postman,Apifox,MeterSphere)

对比ITP与Postman,Apifox,MeterSphere 功能特性ITPPostmanApifoxMeterSphere接口测试✅ 可视化接口调试&#xff0c;支持多种请求方式✅ 支持✅ 支持✅ 支持场景测试✅ 多接口串联测试&#xff0c;支持前后置脚本✅ Collections功能✅ 支持✅ 支持定时任务✅ 基于Celery的定时…

开源日志log4cplus—如何将 string类型转为tstring类型,又如何将char*类型转换为tstring类型?

文章目录&#x1f527; 一、理解 log4cplus::tstring 的本质⚙️ 二、std::string 转 tstring 的三种方法✅ 1. 使用内置宏 LOG4CPLUS_STRING_TO_TSTRING&#xff08;推荐&#xff09;✅ 2. 手动条件编译转换&#xff08;精细控制&#xff09;✅ 3. 多字节模式下的直接赋值⚙️…

深度学习之CNN网络简介

CNN网络简单介绍 1.概述 卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;是一种专门用于处理具有网格状结构数据的深度学习模型。 ​ CNN网络主要有三部分构成&#xff1a;卷积层、池化层和全连接层构成&#xff0c;其中卷积层负责提取图像中…

【微实验】基频提取的MATLAB实现(优化版)

前情提要&#xff1a; 【超详细】科普&#xff1a;别再只会用自相关&#xff01;YIN 和 PYIN 如何破解音频隐藏密码&#xff1f;-CSDN博客 【微实验】妈妈我的MATLAB会识别声音的基频了&#xff01;-CSDN博客 今天用MATLAB把算法封装成函数&#xff0c;然后调用对比结果。 …

开发 npm 包【详细教程】(含发布 npm 包,版本号升级,修改包后重新发布等)

1. 给 npm 包取个【唯一】的名字&#xff01; npm 包命名规范 只能包含小写字母&#xff08;a-z&#xff09;、数字&#xff08;0-9&#xff09;、连字符&#xff08;-&#xff09; 和 下划线&#xff08;_&#xff09;&#xff0c;不能包含空格、大写字母、标点符号&#xff…

Secure 第三天作业

实验需求&#xff1a;1.参考以上拓扑所示&#xff0c;完成以下需求&#xff1a;1&#xff09; 配置各设备 IP 地址2&#xff09; 配置 ZBFW&#xff0c;Inside-1 和 nside-2 属于内部 Zone&#xff0c;Outside-1 属于外部 Zonezone security insidezone security outsidezone-p…

Linux应用层-5.计算机网络(菜鸟学习笔记)

计算机网络的核心是连接与通信&#xff0c;从底层的物理信号到上层的应用服务&#xff0c;各层协议协同工作---------------------------------------------------------------------------------------一.计算机网络分类&#xff08;按范围&#xff09;1•个人区域网&#xff…

[论文阅读] 人工智能 + 软件工程 | 大型语言模型对决传统方法:多语言漏洞修复能力大比拼

大型语言模型对决传统方法&#xff1a;多语言漏洞修复能力大比拼 论文阅读&#xff1a;On the Evaluation of Large Language Models in Multilingual Vulnerability RepairarXiv:2508.03470 On the Evaluation of Large Language Models in Multilingual Vulnerability Repair…

计算机网络2-3:传输方式

目录 串行传输和并行传输 同步传输和异步传输 单工、半双工以及全双工通信 总结 串行传输和并行传输 并行传输的优点是速度为串行传输的n倍&#xff0c;但也存在一个严重的缺点即成本高 同步传输和异步传输 单工、半双工以及全双工通信 总结

文档生成PPT软件哪个好?深度测评8款word转ppt生成工具

在日常办公与教学场景中&#xff0c;如何高效地将Word文档内容转化为专业PPT&#xff0c;一直是职场人士、教育工作者及内容创作者的共同痛点。随着AI技术的普及&#xff0c;一键式转换工具应运而生&#xff0c;它们不仅能精准识别Word中的标题与段落结构&#xff0c;还能自动套…

Azimutt:一款免费开源的多功能数据库工具

Azimutt 是一款支持数据库设计、表结构探索与分析、数据查询以及数据库文档生成功能的全栈工具。 Azimutt 是一个免费开源的项目&#xff0c;源代码托管在 GitHub&#xff1a; https://github.com/azimuttapp/azimutt 功能特性 多数据库支持&#xff1a;包括主流数据库 MySQ…

智算赋能:移动云助力“世界一流数据强港”建设之路

2024年5月&#xff0c;某创新产业园区智算中心正式揭牌成立。台下响起的掌声不仅是对一个项目的祝贺&#xff0c;更是客户对未来的期许—— 推动产业结构优化升级&#xff0c;领跑数字经济转型发展。5家500强企业、8家上市企业、17家独角兽企业……该创新产业园区在成为“世界一…

达梦自定义存储过程实现获取表完整的ddl语句

--导出表的ddl CREATE OR REPLACE PROCEDURE show_create_table( db IN varchar(255), tb IN varchar(255)) ASsql1 text;ret text : ;cmt text :;sql2 text :; BEGINFOR WSX IN (select TABLEDEF(db,tb) as ddl from dual) LOOPret: ret||WSX.DDL;END LOOP;ret : ret||chr(10…

【ARM】keil提示UVISION: Error: Encountered an improper argument

1、 文档目标 解决MDK退出debug模式后&#xff0c;提示UVISION: Error: Encountered an improper argument。 2、 问题场景 在退出Debug模式的时候&#xff0c;弹出提示窗口&#xff0c;提示&#xff1a;UVISION: Error: Encountered an improper argument。&#xff08;如图…

【2025最新版】PDF24 Creator,PDF编辑,合并分割,格式转换全能工具箱,本地离线版本,完全免费!

软件介绍&#xff08;文末获取&#xff09;这款软件于1999年开发&#xff0c;至今已经有26年了&#xff0c;这26年里它都完全免费&#xff01;简洁的操作界面&#xff0c;让用户轻松上手&#xff0c;高效完成 PDF 文件的处理&#xff0c;方便又实用。这次给大家带来的是一个本地…