零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等)的速查表吗?

相关推荐
怕浪猫1 小时前
构建你自己的 AI Agent 发行版:从 Profile 定制到生产部署全流程
前端·后端·面试
小王师傅661 小时前
【设计模式】装饰模式(四):框架源码实战——从 Java I/O 到 Spring 到 MyBatis
java·设计模式
深圳市益普科技有限公司1 小时前
半导体CIM数据底座:四步把多厂数据拉通
前端
nvvas2 小时前
Spring AI 2.0正式GA:Token砍掉64%,Java的AI反击战打响了
java·人工智能
程序员阿鹏2 小时前
双亲委派机制
java·jvm·数据结构·后端
步行cgn2 小时前
Spring Bean 的生命周期详解
java·后端·spring
ps酷教程2 小时前
数据权限DataPersmission
java·学习
郝学胜-神的一滴2 小时前
C++20模板元编程 04:变量模板 别名模板与模板Lambda实战
服务器·开发语言·数据结构·c++·程序人生
乐迪绘防伪油墨技术分享2 小时前
特种功能油墨选型指南:温变 / 遇水 / 荧光 / UV LED 技术对比与供应商参考
前端·html·uv