当前位置: 首页 > news >正文

MyBatis 核心入门:从概念到实战,一篇掌握简单增删改查

目录

一、什么是 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.dtcms.com/a/324971.html

相关文章:

  • 【东枫科技】FR3 可扩展测试平台,适用于 6G 研究与卫星通信,高达 1.6 GHz 的带宽
  • 【自动化运维神器Ansible】playbook案例解析:Tags组件实现任务选择性执行
  • 【01】华勤技术股份有限公司——华勤C++笔试,题目记录及解析
  • Java基础-使用反射做一个简易框架
  • Python 实例属性和类属性
  • 【PyTorch】单目标检测项目
  • vulnhub-Drippingblues靶机
  • Typora结合PicGo + 使用Gitee搭建个人免费图床
  • 计算机网络---IP(互联网协议)
  • 2025年6月电子学会全国青少年软件编程等级考试(Python六级)真题及答案
  • 二叉树进阶 之 【二叉搜索树的简介与模拟实现的前提准备】
  • 【杂谈】-智能代理+可观察性:构建下一代复杂系统监控体系
  • UE5多人MOBA+GAS 41、制作一个飞弹,添加准心索敌
  • JS实现数组扁平化
  • 计算二分类误差时的常见错误及解决方案
  • ubuntu22.04+samba
  • VMware 使用 Ubuntu 一段时间后逐渐卡顿、甚至卡死的问题
  • sqli-labs-master/Less-51~Less-61
  • 解读 GPT-5:从“博士级 AI 专家”能力到 OpenAI API Key 获取与实践(提示工程→性能调优全流程)
  • MySQL自增ID与UUID的区别及其在索引分裂中的表现与优化
  • W3D引擎游戏开发----从入门到精通【23】
  • 2013年考研数学(二)真题
  • A#语言详解
  • 相比于传统的全波分析,特征模分析具有哪些优点
  • vue如何监听localstorage
  • 博览会(树形DP)
  • 机器学习——标准化、归一化
  • Spring Boot 事务详解:原理与实操指南
  • AQS(AbstractQueuedSynchronizer)底层源码实现与设计思想
  • 第三章-提示词:从0到1,提示词实训全攻略,解锁大语言模型无限潜能(14/36)