零sql和xml写接口,的区别是什么,过程是什么,举例一下下,用mybatis-plus+ spring-boot

"零SQL"与"XML写接口"的核心区别在于开发效率与灵活性的权衡:前者由框架自动生成SQL,适合单表CRUD;后者需手写SQL,适合复杂查询。 具体对比与开发流程如下:

一、核心区别对比

维度 零SQL(BaseMapper) XML写接口
核心定位 解决重复SQL,主打单表操作 解决复杂SQL,提供绝对控制权
适用场景 单表基础增删改查、后台管理列表页 多表JOIN、复杂统计报表、深度SQL优化、大批量数据操作
优点 开发快、代码少、无需维护SQL 灵活性高、可读性强、便于DBA审核
缺点 多表关联时代码难读,无法深度优化 需要额外XML文件,开发成本稍高

企业级开发建议 :通常遵循 "70% 通用 CRUD + 30% 自定义 SQL" 的混合模式,即简单单表操作用零SQL,复杂业务用XML。

二、开发流程与代码示例

假设数据库有一张 user 表(字段:id, name, age, email)。

1. 零SQL方式(BaseMapper)

流程:建表 → 写实体类 → Mapper继承BaseMapper → Service/Controller直接调用内置方法。

java 复制代码
// 1. 实体类
@Data
@TableName("user")
public class User {
    @TableId(type = IdType.AUTO)
    private Integer id;
    private String name;
    private Integer age;
    private String email;
}

// 2. Mapper(一行代码都不用写)
@Mapper
public interface UserMapper extends BaseMapper<User> {}

// 3. Service直接调用(无需写SQL)
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {}

// 4. Controller使用
@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired private UserService userService;

    @GetMapping("/list")
    public List<User> list() {
        return userService.list(); // 自动查全部
    }

    @GetMapping("/get/{id}")
    public User getById(@PathVariable Integer id) {
        return userService.getById(id); // 自动按ID查
    }
}
2. XML方式(自定义SQL)

流程:建表 → 写实体类 → Mapper定义方法 → 编写XML映射SQL → Service/Controller调用。

java 复制代码
// 1. Mapper接口(定义方法,不写实现)
@Mapper
public interface UserMapper extends BaseMapper<User> {
    // 自定义方法:查询年龄大于某值且名字包含关键字的用户
    List<User> selectByCondition(@Param("minAge") Integer minAge, @Param("name") String name);
}
xml 复制代码
<!-- 2. UserMapper.xml(放在 resources/mapper/ 目录下) -->
<?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.example.mapper.UserMapper">
    <select id="selectByCondition" resultType="com.example.entity.User">
        SELECT * FROM user
        <where>
            <if test="minAge != null">
                AND age > #{minAge}
            </if>
            <if test="name != null and name != ''">
                AND name LIKE CONCAT('%', #{name}, '%')
            </if>
        </where>
    </select>
</mapper>
java 复制代码
// 3. Controller调用自定义方法
@GetMapping("/search")
public List<User> search(@RequestParam Integer minAge, @RequestParam String name) {
    return userMapper.selectByCondition(minAge, name);
}

三、判断标准

实际开发中有一个非常实用的判断标准:如果这个SQL你愿意直接在数据库客户端里单独执行、调试、优化,那就手写XML;如果这个SQL只是单表CRUD的一种表达,那就用Mapper自带的方法 + Wrapper。


需要我整理一份 LambdaQueryWrapper 常用条件拼接(eq、like、between等)的速查表吗?

相关推荐
资料库015 小时前
Linux 8个常见运维故障排查
java·linux·运维
要开心吖ZSH5 小时前
MySQL 慢 SQL 排查操作手册-个人笔记版
java·笔记·sql·mysql·慢查询
u0111026755 小时前
图片处理接口如何统一错误信息 前端提示与后端错误码设计
前端·状态模式
福兮说5 小时前
浏览器里把 iPhone 的 HEIC 转成 JPG:Chrome 解不开、转完大了七成、拍摄时间全丢,六个坑实测
前端·javascript·图像处理·chrome·ios·iphone·heic
libokaifa6 小时前
把语音模型塞进手机:sherpa-onnx 在 Android 上的 ASR / TTS
前端
Android系统攻城狮6 小时前
Linux Gstreamer深度解析之gst_audio_sink_get_type调用流程与实战(六十五)
linux·运维·服务器·音视频·gstreamer音视频·音视频进阶·gstreamer音视频进阶
Joy T6 小时前
Spring AI 接入已有 Java 项目的三种架构设计
java·人工智能·springai·ai入门·chatclient·ai service·ai能力接入
deli0076 小时前
DLA 枝晶生长实测:5000 个粒子集体停摆之后,分形维数收敛到 1.70
前端
杨运交6 小时前
[076][核心模块]构建优雅的Java异常处理框架:从错误码到全局异常处理
java·开发语言
IT_陈寒6 小时前
Redis卡顿的锅,这次真不是大key的错
前端·人工智能·后端