MyBatis XML配置从零开始:高效处理数据库映射与查询!!!

目录

  • 一、前言
  • [二、MyBatis XML 方式实现增删改查](#二、MyBatis XML 方式实现增删改查)
    • [2.1 配置连接字符串和MyBatis](#2.1 配置连接字符串和MyBatis)
    • [2.2 持久层代码](#2.2 持久层代码)
    • [2.3 单元测试](#2.3 单元测试)
    • [2.4 增(insert)](#2.4 增(insert))
    • [2.5 删(delete)](#2.5 删(delete))
    • 2.6改(update)
    • [2.7 查(select)](#2.7 查(select))
    • [2.8 总结](#2.8 总结)

一、前言

在上一篇博客中,我们详细探讨了 MyBatis 注解方式 的使用,并通过实际案例展示了如何快速实现数据库的增删改查操作。MyBatis 作为一款功能强大的 ORM 框架,不仅支持通过注解配置数据库操作,还支持通过 XML 文件进行配置。两种配置方式各有优劣,适用于不同的场景。

对于小型项目或快速开发,注解方式的确非常简洁高效。但在实际开发中,尤其是需要处理复杂 SQL 逻辑或希望代码与数据库操作分离的场景中,XML 方式 的优势会更加明显。XML 方式通过将 SQL 语句独立到 XML 文件中,不仅提高了代码的可维护性,还为动态 SQL、复杂查询等场景提供了更大的灵活性。
本文将围绕 MyBatis XML 方式 展开 ,详细讲解如何通过 XML 文件实现增删改查操作,并探讨其与注解方式的区别和优劣。通过本文,你将能够掌握 MyBatis 的两种核心配置方式,并根据实际需求灵活选择适合的实现方案。

上一篇博客文章:
MyBatis注解方式:从CRUD到数据映射的全面解析

二、MyBatis XML 方式实现增删改查

2.1 配置连接字符串和MyBatis

此步骤需要进行两项设置,数据库连接字符串设置和 MyBatis 的 XML 文件配置。这篇文章以.yml文件来进行配置

java 复制代码
# 数据库连接配置
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=false
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
  # 配置mybatis xml 的文件路径,在 resources/mapper 创建所有表的 xml 文件
  mapper-locations: classpath:mapper/**Mapper.xml
  configuration:
    # 配置打印 MyBatis日志
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    map-underscore-to-camel-case: true    #配置驼峰⾃动转换

2.2 持久层代码

添加mapper接口

数据持久层接口定义(UserInfoMapperXML)

java 复制代码
import com.sliqvers.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;
@Mapper
public interface UserInfoMapperXML {
    List<UserInfo> selectAll();
}

定义一个实体类(UserInfo)

java 复制代码
@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;
}

创建数据库和表

sql 复制代码
-- 创建数据库
DROP DATABASE IF EXISTS mybatis_test;

CREATE DATABASE mybatis_test DEFAULT CHARACTER SET utf8mb4;

-- 使用数据数据
USE mybatis_test;

-- 创建表[用户表]
DROP TABLE IF EXISTS user_info;
CREATE TABLE `user_info` (
        `id` INT ( 11 ) NOT NULL AUTO_INCREMENT,
        `username` VARCHAR ( 127 ) NOT NULL,
        `password` VARCHAR ( 127 ) NOT NULL,
        `age` TINYINT ( 4 ) NOT NULL,
        `gender` TINYINT ( 4 ) DEFAULT '0' COMMENT '1-男 2-女 0-默认',
        `phone` VARCHAR ( 15 ) DEFAULT NULL,
        `delete_flag` TINYINT ( 4 ) 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; 

-- 添加用户信息
INSERT INTO mybatis_test.user_info( username, `password`, age, gender, phone )
VALUES ( 'admin', 'admin', 18, 1, '18612340001' );
INSERT INTO mybatis_test.user_info( username, `password`, age, gender, phone )
VALUES ( 'zhangsan', 'zhangsan', 18, 1, '18612340002' );
INSERT INTO mybatis_test.user_info( username, `password`, age, gender, phone )
VALUES ( 'lisi', 'lisi', 18, 1, '18612340003' );
INSERT INTO mybatis_test.user_info( username, `password`, age, gender, phone )
VALUES ( 'wangwu', 'wangwu', 18, 1, '18612340004' );

创建UserInfoXMLMapper.xml, 路径参考yml中的配置



添加UserIndoXMLMapper.xml

java 复制代码
<?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">
<mapper namespace="com.sliqvers.mapper.UserInfoMapperXML">
    <select id="selectAll" resultType="com.sliqvers.model.UserInfo">

    </select>
</mapper>

安装一个插件:

安装一个插件MyBatisX,这个插件的作用可以减少代码的繁琐,可以直接在配置了文件之间进行跳转。


2.3 单元测试

这里使用快捷键生成测试代码。具体怎么操作的上一篇文章有写,这里就不再重复写了。

java 复制代码
@SpringBootTest
class UserInfoMapperXMLTest {
    @Autowired
    private UserInfoMapperXML userInfoMapperXML;
    @Test
    void selectAll() {
       userInfoMapperXML.selectAll().stream().forEach(x-> System.out.println(x));
    }
}

2.4 增(insert)

增加之前


UserInfoMapper.xml 代码:

java 复制代码
 <insert id="insertUser">
        insert into user_info(username,'password',age) values(#{username},#{password},#{age})
    </insert>

UserInfoMapperXML.java 代码

java 复制代码
@Mapper
public interface UserInfoMapperXML {
    List<UserInfo> selectAll();
    Integer insertUser(UserInfo userInfo);
}

测试代码

java 复制代码
 @Test
    void insertUser() {
        UserInfo userInfo=new UserInfo();
        userInfo.setUsername("Alice");
        userInfo.setPassword("123456");
        userInfo.setAge(45);
        Integer result = userInfoMapperXML.insertUser(userInfo);
        System.out.println("插入成功");
        System.out.println("影响行数:"+ result + ", id:"+ userInfo.getId());
    }

运行结果:

查看数据库是否插入数据成功:

可以看到成功了。

然后可以看到在控制台没有获取数据的id,那么我们怎么获取呢?

我们把UserInfoMapper.xml 代码改一下稍微:

java 复制代码
 <insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
        insert into user_info (username, `password`, age) VALUES (#{username}, #{password}, #{age})
    </insert>

再运行一下测试类:

可以看到id获取成功了。

再观察数据库是否数据插入成功:

2.5 删(delete)

UserInfoMapper 接口:

java 复制代码
  Integer deleteUser(Integer id);

UserInfoMapper.xml 实现:

java 复制代码
 <delete id="deleteUser">
        delete from user_info where id=#{id}
    </delete>

测试类:

java 复制代码
    @Test
    void deleteUser() {
        userInfoMapperXML.deleteUser(9);
        System.out.println("删除成功");
    }

运行结果:

删除之前:

删除之后:

2.6改(update)

UserInfoMapper 接口:

java 复制代码
 Integer updateByConfition(UserInfo userInfo);

UserInfoMapper.xml 实现:

java 复制代码
 <update id="updateByConfition">
        update user_info set username=#{username} where id=#{id}
    </update>

测试类:

java 复制代码
    @Test
    void updateByConfition() {
        UserInfo userInfo=new UserInfo();
        userInfo.setUsername("Bob");
        userInfo.setId(3);
        userInfoMapperXML.updateByConfition(userInfo);
    }

运行结果:


更新之前:

更新之后:


2.7 查(select)

UserInfoMapper 接口:

java 复制代码
List<UserInfo> selectAll();

UserInfoMapper.xml 实现:

java 复制代码
  <select id="selectAll" resultType="com.sliqvers.model.UserInfo">
    select * from user_info
    </select>

测试类:

java 复制代码
  @Test
    void selectAll() {
       userInfoMapperXML.selectAll().stream().forEach(x-> System.out.println(x));
    }

运行结果:

但是这里会有一个问题:我们先把Mybatis的日志配置取消掉为了便于观察:

启动项目:

我们可以看到这个这里这个没有获取到数据库表的数据。

这个原因是什么呢?

这是数据库表里的字段名字

再看java代码当中的字段名字:

可以看到他们是有区别的。当自动映射查询结果时,MyBatis 会获取结果中返回的列名并在 Java 类中查找相同名字的属性(忽略大小写)。 这意味着如果发现了 ID 列和 id 属性,MyBatis 会将列 ID 的值赋给 id 属性那么怎么解决这个问题呢?
三种方法

1.起别名:

java 复制代码
   @Select("select id, username,`password`, age, gender,  phone, " +
            "delete_flag as deleteFlag, create_time as createTime, update_time as updateTime" +
            " from user_info")

2.结果映射:

java 复制代码
     @Results(id = "BaseMap", value = {
            @Result(column = "delete_flag", property = "deleteFlag"),
            @Result(column = "create_time", property = "createTime"),
            @Result(column = "update_time", property = "updateTime")
    })

3.驼峰命名(推荐):

java 复制代码
mybatis:
  configuration: # 配置打印 MyBatis日志
    map-underscore-to-camel-case: true #配置驼峰⾃动转换
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

2.8 总结

篇博客详细介绍了如何通过MyBatis的XML配置实现增删改查操作,特别是在查询功能的实现上,着重讲解了三种高效的数据映射方法:驼峰转换、结果映射和起别名。文章从基础知识入手,逐步展开,帮助读者深入理解MyBatis的核心配置技巧,提升数据库操作的效率和代码的可维护性。

相关推荐
潘多编程16 分钟前
SpringBoot分布式项目中MyBatis实战技巧:从配置到性能优化
spring boot·分布式·mybatis
路在脚下@18 分钟前
MySQL中的Redo Log、Undo Log和Binary Log
数据库·mysql
码农老起32 分钟前
从Oracle到OceanBase数据库迁移:全方位技术解析
数据库·oracle·oceanbase
Linux运维老纪35 分钟前
Linux之 权限提升(Linux Privilege Escalation)
linux·服务器·数据库·mysql·云计算·运维开发
阿里云大数据AI技术1 小时前
Hologres诊断与优化快速入门
大数据·数据库·sql
vivo互联网技术2 小时前
深度剖析 StarRocks 读取 ORC 加密文件背后的技术
大数据·数据库
猫咪-95272 小时前
Mysql复合查询
数据库
我最厉害。,。2 小时前
ASP 应用&HTTP.SYS&短文件&文件解析&Access 注入&数据库泄漏
数据库·网络协议·http
木西2 小时前
Redis安装以及常用指令汇总
数据库·redis·后端
mqiqe3 小时前
Nginx 解决具有不安全、不正确或缺少 SameSite 属性的 Cookie方案
数据库·nginx·安全