动态JSON请求映射至POJO并适配iBatis查询的实现问询
动态JSON转POJO作为iBatis查询参数的可行方案
核心思路
直接利用Jackson的JSON反序列化能力,将Postman传入的动态JSON绑定到EmployeeRequest POJO上——存在的字段自动赋值,未传入的字段保留默认值(引用类型为null,包装类型如Integer也为null),之后直接将该POJO作为iBatis的查询参数即可,无需转为HashMap。
具体实现步骤&代码示例
1. 确保POJO符合反序列化要求
你的EmployeeRequest需要满足:
- 有无参构造器(Jackson反序列化必须)
- 所有属性提供getter/setter方法
- 建议用包装类型(如
Integer而非int),避免未传字段时出现默认值(比如int默认0)干扰查询
示例POJO代码:
public class EmployeeRequest { private Long id; private String name; private Integer age; private String department; // 无参构造器 public EmployeeRequest() {} // getter & setter public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getDepartment() { return department; } public void setDepartment(String department) { this.department = department; } }
2. Controller层直接接收JSON为POJO
Spring MVC会自动用Jackson完成JSON到POJO的转换,无需额外处理:
@RestController @RequestMapping("/employees") public class EmployeeController { @Autowired private EmployeeMapper employeeMapper; @PostMapping("/query") public List<Employee> queryEmployees(@RequestBody EmployeeRequest request) { // 直接将POJO传给iBatis Mapper return employeeMapper.selectByRequest(request); } }
3. iBatis配置支持POJO参数
iBatis本身支持POJO作为参数,只需在XML映射文件中指定parameterType为POJO的全类名,并用#{属性名}引用POJO的属性:
Mapper接口:
public interface EmployeeMapper { List<Employee> selectByRequest(EmployeeRequest request); }
XML映射文件:
<select id="selectByRequest" parameterType="com.example.EmployeeRequest" resultType="com.example.Employee"> SELECT id, name, age, department FROM employee WHERE 1=1 <if test="id != null"> AND id = #{id} </if> <if test="name != null and name != ''"> AND name LIKE CONCAT('%', #{name}, '%') </if> <if test="age != null"> AND age = #{age} </if> <if test="department != null and department != ''"> AND department = #{department} </if> </select>
关键说明
- 动态字段处理:通过iBatis的
<if>标签判断属性是否非空,仅拼接有值的查询条件,完美适配动态JSON的场景 - 类型安全:相比
HashMap,用POJO作为参数能避免键名拼写错误,IDE也能提供代码提示,降低维护成本 - 默认值控制:如果需要给某些字段设置默认值(而非
null),可以直接在POJO的属性初始化时赋值,或者在setter方法中处理
内容的提问来源于stack exchange,提问作者man123
相关产品推荐
相关产品推荐

