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

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

目录

  • 一、前言
  • 二、MyBatis XML 方式实现增删改查
    • 2.1 配置连接字符串和MyBatis
    • 2.2 持久层代码
    • 2.3 单元测试
    • 2.4 增(insert)
    • 2.5 删(delete)
    • 2.6改(update)
    • 2.7 查(select)
    • 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文件来进行配置

# 数据库连接配置
  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)

import com.sliqvers.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;

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

定义一个实体类(UserInfo)

@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;
}

创建数据库和表

-- 创建数据库
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

<?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 单元测试

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

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

在这里插入图片描述


2.4 增(insert)

增加之前
在这里插入图片描述


UserInfoMapper.xml 代码:

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

UserInfoMapperXML.java 代码

@Mapper
public interface UserInfoMapperXML {
    List<UserInfo> selectAll();
    Integer insertUser(UserInfo userInfo);
}

测试代码

 @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 代码改一下稍微:

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

再运行一下测试类:
在这里插入图片描述
可以看到id获取成功了。
再观察数据库是否数据插入成功:
在这里插入图片描述

2.5 删(delete)

UserInfoMapper 接口:

  Integer deleteUser(Integer id);

UserInfoMapper.xml 实现:

 <delete id="deleteUser">
        delete from user_info where id=#{id}
    </delete>

测试类:

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

运行结果:
在这里插入图片描述

删除之前:
在这里插入图片描述
删除之后:
在这里插入图片描述

2.6改(update)

UserInfoMapper 接口:

 Integer updateByConfition(UserInfo userInfo);

UserInfoMapper.xml 实现:

 <update id="updateByConfition">
        update user_info set username=#{username} where id=#{id}
    </update>

测试类:

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

运行结果:
在这里插入图片描述


更新之前:
在这里插入图片描述
更新之后:
在这里插入图片描述


2.7 查(select)

UserInfoMapper 接口:

List<UserInfo> selectAll();

UserInfoMapper.xml 实现:

  <select id="selectAll" resultType="com.sliqvers.model.UserInfo">
    select * from user_info
    </select>

测试类:

  @Test
    void selectAll() {
       userInfoMapperXML.selectAll().stream().forEach(x-> System.out.println(x));
    }

运行结果:
在这里插入图片描述

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

启动项目:
在这里插入图片描述
我们可以看到这个这里这个没有获取到数据库表的数据。
这个原因是什么呢?
这是数据库表里的字段名字
在这里插入图片描述
再看java代码当中的字段名字:
在这里插入图片描述
可以看到他们是有区别的。当自动映射查询结果时,MyBatis 会获取结果中返回的列名并在 Java 类中查找相同名字的属性(忽略大小写)。 这意味着如果发现了 ID 列和 id 属性,MyBatis 会将列 ID 的值赋给 id 属性那么怎么解决这个问题呢?

三种方法

1.起别名:

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

2.结果映射:

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

3.驼峰命名(推荐):

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

2.8 总结

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


http://www.kler.cn/a/597030.html

相关文章:

  • C#基础学习(二)C#数组生存手册:从入门到“血压拉满“的奇妙旅程
  • 人工智能将使勒索软件更加危险
  • 【信息系统项目管理师】【论文分享】【历年真题】​论信息系统项目的成本管理
  • 数字电子技术(三十二)——组合逻辑电路的特点和基本设计方法
  • ubuntu22.04安装搜狗输入法保姆教程~
  • 考研课程安排(自用)
  • Flutter TextFormField 完全手册与设计最佳实践
  • 【MySQL报错】:Column count doesn’t match value count at row 1
  • 只是“更轻更薄”?不!遨游三防平板还选择“更强更韧”
  • 为什么 Redis 选择单线程模型?
  • 基于区块链的 Web3 数据保护技术探索
  • 现代前端开发框架对比:React、Vue 和 Svelte 的选择指南
  • Linux进程信号(下:补充)
  • 数字证书 与 数字签名 介绍
  • Beyond Compare 4注册激活方法
  • 使用HTML5和CSS3实现3D旋转相册效果
  • IoTDB 常见问题 QA 第六期
  • 一条不太简单的TEX学习之路
  • tryhackme——The Lay of the Land
  • 从报错到成功:Mermaid 流程图语法避坑指南✨