MyBatis基础实战笔记一

MyBatis基础实战笔记一

一、前言

本次练习基于MyBatis框架实现了UserPerson两个实体的CRUD(增删改查)操作,核心围绕MyBatis的核心配置、映射文件、DAO接口设计展开。本文将梳理练习中的核心代码和关键知识点,帮助理解MyBatis的基础使用逻辑。

二、MyBatis核心配置文件(SqlMapConfig.xml)

MyBatis的核心配置文件是整个框架的入口,用于配置环境(数据库连接)、映射器等核心信息,文件名一般约定为SqlMapConfig.xml

1. 核心配置结构

xml 复制代码
<?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>
    <!-- 环境配置:配置数据库连接信息,可配置多环境,default指定默认环境 -->
    <environments default="mysql">
        <environment id="mysql">
            <!-- 事务管理器:JDBC类型(使用JDBC原生事务管理) -->
            <transactionManager type="JDBC"></transactionManager>
            <!-- 数据源:POOLED(使用连接池,性能更优);UNPOOLED(不使用连接池) -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis_demo?useSSL=false&amp;serverTimezone=UTC&amp;allowPublicKeyRetrieval=true"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <!-- 映射器:配置Mapper.xml文件的路径,MyBatis会加载这些映射文件 -->
    <mappers>
        <mapper resource="mapper/UserMapper.xml"></mapper>
        <mapper resource="mapper/PersonMapper.xml"></mapper>
    </mappers>
</configuration>

2. 关键知识点

  • DTD约束 :开头的DOCTYPE声明指定MyBatis配置文件的DTD约束,保证配置格式合法;
  • 环境(environments)
    • default属性指定默认使用的环境ID(如mysql);
    • transactionManager:事务管理器类型,JDBC表示使用JDBC的事务提交/回滚机制;
    • dataSource:数据源类型,POOLED是MyBatis自带的连接池,推荐使用;
  • 映射器(mappers) :通过resource属性指定Mapper.xml文件的类路径(注意路径格式,使用/分隔)。

三、实体类(POJO)编写

实体类对应数据库中的表,字段需与表字段一一对应,同时提供getter/setter方法和toString()方法(方便打印调试)。

1. User实体类示例

java 复制代码
package com.qcby.entity;
import java.util.Date;

public class User  {
    // 字段与user表列名对应
    private Integer id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;

    // getter/setter方法(必须提供,MyBatis通过反射赋值)
    public Integer getId() { return id; }
    public void setId(Integer id) { this.id = id; }
    // 其他字段的getter/setter省略...

    // toString():方便控制台打印对象信息
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", birthday=" + birthday +
                ", sex='" + sex + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}

2. 关键知识点

  • 实体类字段名建议与数据库表列名一致(若不一致需配置结果映射);
  • 必须提供getter/setter方法:MyBatis通过反射封装数据时需要;
  • toString()方法:非必需,但便于调试时查看对象内容;
  • 字段类型建议使用包装类(如Integer),避免基本类型默认值问题(如int默认0,可能与业务冲突)。

四、DAO层接口设计

DAO(Data Access Object)接口定义数据操作的方法,MyBatis通过「接口+映射文件」的方式实现接口,无需编写实现类。

1. UserDao接口示例

java 复制代码
package com.qcby.dao;

import com.qcby.entity.User;
import java.util.List;

public interface UserDao {
    // 查询所有用户
    public List<User> findAll();
    // 根据ID查询单个用户
    public User findById(Integer id);
    // 根据用户名模糊查询
    public List<User> findByUsername(String username);
    // 新增用户
    int insert(User user);
    // 修改用户
    int update(User user);
    // 删除用户
    int delete(Integer id);
}

2. 关键知识点

  • 接口方法名需与Mapper.xml中标签的id属性一致;
  • 返回值类型:
    • 查询单个对象返回实体类(如findById返回User);
    • 查询多个对象返回List<实体类>(如findAll);
    • 增/删/改返回int:表示受影响的行数;
  • 参数类型:方法参数需与Mapper.xml中标签的parameterType属性对应。

五、Mapper映射文件编写

Mapper.xml是MyBatis的核心,用于编写SQL语句,建立接口方法与SQL的映射关系,文件名一般与DAO接口对应(如UserDao对应UserMapper.xml)。

1. 核心结构(以UserMapper.xml为例)

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">
<!-- namespace:绑定对应的DAO接口全类名 -->
<mapper namespace="com.qcby.dao.UserDao">
    <!-- 查询所有:id对应接口方法名,resultType指定返回值类型(实体类全类名) -->
    <select id="findAll" resultType="com.qcby.entity.User">
        select * from user order by id desc
    </select>

    <!-- 根据ID查询:parameterType指定参数类型 -->
    <select id="findById" resultType="com.qcby.entity.User" parameterType="java.lang.Integer">
        select * from user where id = #{id};
    </select>

    <!-- 模糊查询:concat拼接%实现模糊匹配 -->
    <select id="findByUsername" resultType="com.qcby.entity.User" parameterType="java.lang.String">
        select * from user where username like concat('%',#{username},'%');
    </select>

    <!-- 新增:parameterType指定入参为User实体 -->
    <insert id="insert" parameterType="com.qcby.entity.User">
        insert into user(username, birthday, sex, address)
        values(#{username}, #{birthday}, #{sex}, #{address});
    </insert>

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

    <!-- 删除 -->
    <delete id="delete" parameterType="java.lang.Integer">
        delete from user where id = #{id};
    </delete>
</mapper>

2. 关键知识点

  • namespace:必须是对应DAO接口的全类名,MyBatis通过该属性绑定接口与映射文件;
  • 标签类型
    • <select>:查询语句,必须指定resultType(返回值类型);
    • <insert>/<update>/<delete>:增/改/删语句,可选parameterType(参数类型);
  • 参数占位符#{参数名}:MyBatis会自动处理参数类型,防止SQL注入;
  • 模糊查询 :MySQL中使用concat('%', #{参数}, '%')拼接通配符(避免直接写%#{参数}%,可能引发SQL注入);
  • 参数类型(parameterType)
    • 基本类型/字符串:可写全类名(如java.lang.Integer)或别名(如int);
    • 实体类:写实体类全类名,MyBatis会通过getter方法获取属性值;
  • 返回类型(resultType):查询语句必须指定,值为实体类全类名,MyBatis会自动将查询结果封装为实体对象。

六、常见问题与注意事项

  1. Mapper.xml文件路径 :SqlMapConfig.xml中mapper resource的路径是类路径(resources下),如mapper/UserMapper.xml表示resources/mapper/UserMapper.xml;
  2. 字段名与实体类属性名不一致 :需使用<resultMap>配置结果映射(本次练习未涉及,后续可补充);
  3. 数据库连接参数 :注意MySQL驱动版本(8.x版本驱动类是com.mysql.cj.jdbc.Driver,5.x是com.mysql.jdbc.Driver),URL需指定serverTimezone(时区);
  4. 方法名与id不一致:MyBatis会抛出「绑定异常」,需保证接口方法名 = Mapper标签id;
  5. 模糊查询的写法 :不要直接写like '%${username}%'${}是字符串拼接,有SQL注入风险,优先使用concat

七、总结

本次练习通过UserPerson两个实体的CRUD实现,覆盖了MyBatis的核心使用流程:

  1. 编写核心配置文件(数据库连接、映射器);
  2. 定义实体类(与数据库表对应);
  3. 设计DAO接口(定义数据操作方法);
  4. 编写Mapper.xml(绑定接口、编写SQL)。

MyBatis的核心思想是「ORM(对象关系映射)」+「SQL解耦」,通过映射文件将SQL与Java代码分离,既保留了SQL的灵活性,又简化了数据操作的代码编写。后续可进一步学习结果映射、动态SQL、分页、注解开发等进阶知识点。

相关推荐
Oll Correct8 小时前
实验二十五:从IPv4向IPv6过渡所使用的隧道技术
网络·笔记
噢,我明白了9 小时前
MyBatis-Plus的引入和配置
java·tomcat·mybatis
U盘失踪了9 小时前
【笔记】pycharm 安装Jupyter失败
笔记·python
Hua-Jay9 小时前
OpenCV联合C++/Qt 学习笔记(二十二)----相机模型与投影及单目相机标定
c++·笔记·qt·opencv·学习·计算机视觉
咸甜适中9 小时前
rust语言学习笔记Trait(七) IntoIterator(由集合创建迭代器)
笔记·学习·rust
阿阳微客10 小时前
网易Buff游戏搬砖,长期可做!
笔记·学习·游戏
Upsy-Daisy10 小时前
AI Agent 项目学习笔记(一):项目总体介绍与智能体链路概览
人工智能·笔记·学习
June bug10 小时前
【AI赋能测试笔记】5基于文档用例生成系统及skills
笔记·功能测试·职场和发展·测试用例·学习方法
nnsix10 小时前
设计模式 - 原型模式 笔记
笔记·设计模式·原型模式