MyBatis核心概念 + 环境搭建 + CRUD实战详解

 更新时间:2026年05月21日 10:18:43   作者:MandalaO_O  
文章主要介绍了MyBatis的核心知识,从JDBC痛点开始,阐述了MyBatis的优势,包括连接池管理、SQL与Java代码解耦、自动结果集映射、参数自动映射等,感兴趣的朋友跟随小编一起看看吧

一、简介

本文适合 Java 开发初学者,从零梳理 MyBatis 核心知识,包含环境搭建、配置详解、CRUD 实战、常见避坑,可直接用于学习、复习与项目开发。

二、MyBatis 基础概念与环境搭建

1. JDBC 痛点与 MyBatis 优势

在学习 MyBatis 之前,我们先回顾传统JDBC 开发的缺陷,这也是 MyBatis 诞生的核心原因。

JDBC 操作缺陷

  1. 资源频繁创建与释放,严重影响性能每次操作数据库都需要创建 Connection、Statement,用完直接关闭,频繁 IO 造成资源浪费。
  2. SQL 硬编码,维护成本极高SQL 语句直接写在 Java 代码中,修改 SQL 必须重新编译、打包、部署,无法灵活配置。
  3. 结果集解析繁琐,手动封装冗余查询返回 ResultSet 后,需要手动getXxx()取值、手动 set 到实体类,代码量大且易出错。
  4. 代码冗余,开发效率低下连接、参数设置、结果解析大量重复代码,不符合开发规范。

典型 JDBC 冗余代码:

// 1. 加载驱动、建立连接
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(url, user, pwd);
// 2. 编写SQL(硬编码)
String sql = "select * from user where id = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
// 3. 设置参数
pstmt.setInt(1, id);
// 4. 执行查询
ResultSet rs = pstmt.executeQuery();
// 5. 手动封装结果集
User user = null;
if(rs.next()){
    user = new User();
    user.setId(rs.getInt("id"));
    user.setUsername(rs.getString("username"));
}

MyBatis 优势与解决方案

MyBatis 是一款优秀的持久层框架,底层依然基于 JDBC,但做了高度封装:

  1. 连接池管理:避免频繁创建 / 释放连接,大幅提升性能;
  2. SQL 与 Java 代码解耦:SQL 统一写在 XML 配置文件中,修改无需编译 Java;
  3. 自动结果集映射:自动将 ResultSet 封装为实体对象,无需手动解析;
  4. 参数自动映射:支持简单类型、实体类参数,直接使用#{}占位符;
  5. 轻量级、学习成本低:相比 Hibernate,MyBatis 更灵活、可控性更强。

2. 项目环境配置

我们以Maven 项目为例,搭建标准 MyBatis 开发环境。

(1)Maven 依赖导入

pom.xml中导入核心依赖:MyBatis 核心包、MySQL 驱动、日志包、Junit 测试

<dependencies>
    <!-- MyBatis核心依赖 -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.9</version>
    </dependency>
    <!-- MySQL驱动 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.49</version>
    </dependency>
    <!-- 日志包 -->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
    <!-- 测试包 -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13.2</version>
        <scope>test</scope>
    </dependency>
</dependencies>

(2)MyBatis 核心配置文件(sqlMapConfig.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>
    <!-- 环境配置:默认使用development -->
    <environments default="development">
        <environment id="development">
            <!-- 事务管理:JDBC事务 -->
            <transactionManager type="JDBC"/>
            <!-- 数据源:POOLED连接池 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis_demo?serverTimezone=Asia/Shanghai&useSSL=false&characterEncoding=utf8"/>
                <property name="username" value="root"/>
                <property name="password" value="abc123"/>
            </dataSource>
        </environment>
    </environments>
    <!-- 加载Mapper映射文件 -->
    <mappers>
        <mapper resource="mapper/UserMapper.xml"/>
    </mappers>
</configuration>

(3)项目标准结构

src/main/java
  com.qcby
    ├── dao/          DAO接口层
    ├── entity/       实体类
src/main/resources
  ├── mapper/         Mapper XML映射文件
  ├── sqlMapConfig.xml  MyBatis核心配置

三、核心配置与映射关系

1. 实体类与 Mapper 映射

MyBatis 实现自动封装的前提:数据库表 ↔ 实体类 严格映射

(1)实体类编写规范

  1. 类属性名 与 数据库表字段名完全一致
  2. 必须提供无参构造
  3. 必须生成getter/setter
  4. 必须重写toString() 方便测试打印。

User 实体类示例:

public class User {
    private Integer id;
    private String username;
    private String sex;
    private Date birthday;
    private String address;
    // 无参构造
    public User(){}
    // getter/setter
    // toString()
}

(2)DAO 接口与 XML 绑定规则

MyBatis 采用接口代理模式开发,无需编写实现类:

  1. 创建 DAO 接口(如UserDao.java);
  2. XML 文件通过namespace绑定接口全类名
  3. XML 中 SQL 标签的id 必须与 接口方法名完全一致
  4. parameterType/resultType 与方法参数、返回值匹配。

接口示例:

public interface UserDao {
    List<User> findAll();
    User findUserById(Integer id);
}

XML 绑定示例:

<!-- namespace:绑定接口全限定名 -->
<mapper namespace="com.qcby.dao.UserDao">
    <!-- id:与接口方法名一致 -->
    <select id="findAll" resultType="com.qcby.entity.User">
        select * from user order by id desc
    </select>
</mapper>

2. 参数与结果映射

(1)参数传递(parameterType)

用于指定 SQL 入参类型,支持:

  • 基本类型:IntegerString
  • 实体类型:com.qcby.entity.User
  • 取值语法:#{属性名} 安全占位符,防 SQL 注入

xml

<select id="findUserById" parameterType="Integer" resultType="com.qcby.entity.User">
    select * from user where id = #{id}
</select>

(2)结果集封装(resultType)

指定 SQL 返回值类型:

  • 查询单条数据:直接写实体类全类名
  • 查询多条数据:依然写实体类,MyBatis 自动封装为List<实体>

示例:查询所有用户xml

<select id="findAll" resultType="com.qcby.entity.User">
    select * from user
</select>

四、增删改查(CRUD)实战

1. 查询操作(Select)

查询是 MyBatis 最常用操作,分为全量查询、精确查询、模糊查询

(1)全量查询 findAll

<select id="findAll" resultType="com.qcby.entity.User">
    select * from user order by id desc;
</select>

接口方法:

List<User> findAll();

(2)条件查询:根据 ID 查询(单条结果)

<select id="findUserById" parameterType="Integer" resultType="com.qcby.entity.User">
    select * from user where id = #{id};
</select>

接口方法:

User findUserById(Integer id);

(3)模糊查询:根据用户名模糊匹配

重点:like 必须使用 concat 拼接,避免 SQL 注入

xml

<select id="findUserByUserName" parameterType="String" resultType="com.qcby.entity.User">
    select * from user where username like concat('%', #{username}, '%');
</select>

接口方法:

List<User> findUserByUserName(String username);

(4)字段映射异常处理

常见问题:查询结果部分字段为null根本原因:实体类属性名 ≠ 数据库列名解决方案

  1. 统一名称(推荐)
  2. 使用resultMap手动映射

2. 增删改操作(Insert/Update/Delete)

增删改属于写操作,必须注意:必须手动提交事务session.commit()

(1)插入数据 insert

<insert id="insert" parameterType="com.qcby.entity.User">
    insert into user(username,sex,birthday,address)
    values(#{username},#{sex},#{birthday},#{address});
</insert>

接口方法:

int insert(User user);

(2)修改数据 update

必须传入包含 id的实体对象

<update id="update" parameterType="com.qcby.entity.User">
    update user 
    set username=#{username},sex=#{sex},birthday=#{birthday},address=#{address}
    where id=#{id};
</update>

(3)删除数据 delete

<delete id="delete" parameterType="Integer">
    delete from user where id=#{id};
</delete>

(4)事务提交机制

查询不需要提交事务;增删改必须提交!

@Test
public void addUser(){
    User user = new User();
    user.setUsername("张三");
    user.setSex("男");
    // 执行插入
    userDao.insert(user);
    // 必须提交事务
    session.commit();
}

五、测试工具类(通用版)

为了简化测试,可封装 MyBatis 工具类:

public class MyBatisUtil {
    private static SqlSessionFactory sqlSessionFactory;
    static{
        try {
            String resource = "sqlMapConfig.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    // 获取SqlSession
    public static SqlSession getSession(){
        return sqlSessionFactory.openSession(true); // 自动提交事务
    }
}

到此这篇关于MyBatis核心概念 + 环境搭建 + CRUD实战详解的文章就介绍到这了,更多相关mybatis环境搭建和crud内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 在java8中使用流区分质数与非质数详解

    在java8中使用流区分质数与非质数详解

    这篇文章主要介绍了在java8中使用流区分质数与非质数详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • SpringCloud2020 bootstrap 配置文件失效的解决方法

    SpringCloud2020 bootstrap 配置文件失效的解决方法

    这篇文章主要介绍了SpringCloud2020 bootstrap 配置文件失效的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • spring boot 部署为jar包的方法示例

    spring boot 部署为jar包的方法示例

    本篇文章主要介绍了spring boot 部署为jar的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • Java直接输出对象变成@.....的问题及解决

    Java直接输出对象变成@.....的问题及解决

    这篇文章主要介绍了Java直接输出对象变成@.....的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • 关于Java整合RocketMQ实现生产消费详解

    关于Java整合RocketMQ实现生产消费详解

    这篇文章主要介绍了关于Java整合RocketMQ实现生产消费详解,RocketMQ作为一款纯java、分布式、队列模型的开源消息中间件,支持事务消息、顺序消息、批量消息、定时消息、消息回溯等,需要的朋友可以参考下
    2023-05-05
  • Servlet中/和/*的区别详解

    Servlet中/和/*的区别详解

    本文将分析/和/*的区别这个老生常谈的问题,但是很多时候看完就忘了,关于此问题这一篇文章就够了,它将成为你的永久记忆,感兴趣的可以了解一下
    2021-07-07
  • MyEclipse 2016 CI 4新增BootStrap模板

    MyEclipse 2016 CI 4新增BootStrap模板

    MyEclipse2016是一款全球使用最为广泛的企业级开发环境程序,这篇文章主要介绍了MyEclipse 2016 CI 4新增BootStrap模板的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-06-06
  • Spring为什么要用三级缓存解决循环依赖呢

    Spring为什么要用三级缓存解决循环依赖呢

    本文主要介绍了Spring如何使用三级缓存解决循环依赖问题,本文为了方便说明,先设置两个业务层对象,命名为AService和BService,结合示例给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2025-01-01
  • MyBatis基础支持DataSource实现源码解析

    MyBatis基础支持DataSource实现源码解析

    这篇文章主要为大家介绍了MyBatis基础支持DataSource实现源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • JVM性能调优实战:让你的IntelliJ Idea纵享丝滑

    JVM性能调优实战:让你的IntelliJ Idea纵享丝滑

    这篇文章主要介绍了JVM性能调优实战:让你的IntelliJ Idea纵享丝滑的相关资料,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01

最新评论