CREATE TABLE `t_pdm_cbom_material` ( `id` bigint(20) unsigned NOT NULL COMMENT '物理主键', `tenant_id` varchar(8) NOT NULL COMMENT '租户ID', `cbom_id` bigint(20) DEFAULT NULL, `material_no` varchar(255) DEFAULT NULL COMMENT '物料编码', `material_name` varchar(255) DEFAULT NULL COMMENT '物料名称', `material_description` varchar(255) DEFAULT NULL COMMENT '物料描述', `unit_group` varchar(255) DEFAULT NULL COMMENT '单元组', `unit_code` varchar(255) DEFAULT NULL COMMENT '计量单位', `material_category` varchar(255) DEFAULT NULL COMMENT '物料分类', `material_subcategory` varchar(255) DEFAULT NULL COMMENT '物料子类别', `link_type` int(11) NOT NULL DEFAULT '0' COMMENT '物料模板连接状态0:无连接;1:已连接', `template_id` bigint(20) unsigned DEFAULT NULL COMMENT '外键,模板物料ID', `version` bigint(20) unsigned NOT NULL DEFAULT '0', `created_by` char(32) NOT NULL, `created_date` datetime NOT NULL, `last_modified_by` char(32) NOT NULL, `last_modified_date` datetime NOT NULL, PRIMARY KEY (`id`) USING BTREE, KEY `cbom_id` (`cbom_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='参数化BOM库物料表'; 根据这个表写一个mybatis 的sql语句 参数为material_no 要对入参有标签判断
时间: 2025-04-11 20:33:00 浏览: 39
<think>嗯,我现在需要根据用户提供的SQL表结构,写一个MyBatis的SQL语句,参数是material_no,并且要对入参进行标签判断。首先,我需要理解这个表的结构和各字段的含义。表名是t_pdm_cbom_material,主要存储物料相关的信息,包括物料编码、名称、描述等。用户要求根据material_no查询,并且要对输入的参数做判断,可能是指非空判断或者格式校验?
首先,我应该确定使用MyBatis的动态SQL标签来处理参数判断。MyBatis常用的动态标签有<if>, <choose>, <where>等。这里应该用<if>来判断material_no是否为空,如果不为空则加入查询条件。
然后,考虑SQL语句的结构。因为是查询,所以使用SELECT语句,选择需要的字段。用户可能希望查询所有字段,所以用*或者列出所有字段。不过,通常推荐列出具体字段,但这里可能为了方便,暂时用*。
接下来,WHERE子句需要根据material_no参数是否存在来动态添加。如果参数不为空,则添加material_no = #{materialNo};如果为空,可能需要返回所有记录或者有其他处理?不过用户没特别说明,可能只是当参数存在时才过滤。
需要注意SQL注入的问题,因此参数应该使用#{}来预编译,而不是拼接。另外,字段名material_no在表中是material_no,而MyBatis中参数名可能是materialNo,所以要注意命名是否正确。
另外,用户提到参数为material_no,要对入参有标签判断,可能是指使用<if>标签来判断参数是否存在。例如:
<select id="selectByMaterialNo" resultType="...">
SELECT * FROM t_pdm_cbom_material
<where>
<if test="materialNo != null and materialNo != ''">
material_no = #{materialNo}
</if>
</where>
</select>
这样,当materialNo参数不为空且非空字符串时,才会添加条件。如果参数为空,则查询所有记录。但用户是否希望当参数为空时返回所有,还是必须要有参数?可能需要进一步确认,但根据问题描述,应该处理参数存在的情况。
另外,可能需要考虑大小写的问题,表中material_no是varchar,所以传入参数是否需要模糊查询?但用户没说明,应该默认精确匹配。
还要注意数据库的字符集和排序规则,但SQL语句中可能不需要特别处理,只要参数正确传递即可。
最后,确保SQL语句中的表名和字段名正确,例如是否有反引号,但MyBatis中通常不需要,除非是保留字。原表定义中使用反引号,但在MyBatis的XML中可以直接写字段名。
总结步骤:
1. 编写SELECT语句,选择所需字段。
2. 使用<where>标签包裹条件,避免WHERE关键字多余。
3. 使用<if>标签判断materialNo是否非空,非空则添加条件。
4. 参数使用#{}防止注入。
5. 确定resultType,应该是对应的实体类全限定名。
可能的疑问:是否需要添加其他条件,比如租户ID?表中有一个tenant_id字段,是否在查询时需要?用户没提到,可能不需要,但实际业务中可能需要。但根据当前问题,只按material_no查询,所以暂不考虑。
现在写出最终的MyBatis SQL映射语句。</think>根据表结构和需求,使用MyBatis动态SQL实现带参数校验的查询语句如下:
```xml
<!-- XML映射文件中编写 -->
<select id="selectByMaterialNo" resultMap="BaseResultMap">
SELECT
id, tenant_id, cbom_id, material_no, material_name,
material_description, unit_group, unit_code, material_category,
material_subcategory, link_type, template_id, version,
created_by, created_date, last_modified_by, last_modified_date
FROM t_pdm_cbom_material
<where>
<!-- 多租户隔离条件(根据业务需要决定是否添加) -->
<!-- <if test="tenantId != null and tenantId != ''">
AND tenant_id = #{tenantId}
</if> -->
<!-- 动态判断物料编码参数 -->
<if test="materialNo != null and materialNo != ''">
AND material_no = #{materialNo}
</if>
</where>
</select>
```
**代码说明**(使用有序列表呈现步骤):
1. **字段显式声明**
- 避免使用`SELECT *`,明确列出所有字段,增强可维护性
- 字段顺序与表结构定义保持一致
2. **动态条件构造**
- 使用`<where>`标签自动处理`WHERE`关键字:
- 当内部有条件成立时自动添加`WHERE`
- 自动去除首个条件的`AND`/`OR`
3. **参数校验逻辑**
- `<if test="materialNo != null and materialNo != ''">` 双层校验:
- `null`检查:防止传入空指针
- 空字符串检查:避免无效空值查询
- 使用`AND`连接条件(`<where>`标签会自动处理首个子句的`AND`)
4. **扩展性设计**
- 注释中展示了多租户隔离的典型实现(根据实际需求启用)
- `resultMap`建议使用预定义的`BaseResultMap`映射结果集
**配套Java接口建议**:
```java
// 查询接口定义示例
List<CbomMaterial> selectByMaterialNo(
@Param("materialNo") String materialNo
// ,@Param("tenantId") String tenantId // 如需多租户隔离可添加
);
```
**注意事项**:
1. 参数传递应使用`#{}`防止SQL注入
2. 建议为`material_no`
阅读全文
相关推荐










