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