网站上线注意wordpress wpyou
2026/4/17 20:26:20 网站建设 项目流程
网站上线注意,wordpress wpyou,加盟店排行榜加盟项目排行榜,网站建设都需要哪些工具或软件适合零基础到进阶#xff1a;解释每个动态标签的作用、使用场景、常见坑#xff0c;并给出基于本项目的示例#xff08;User/Student/Teacher#xff09;。代码含详尽注释#xff0c;便于直接参考。1. 为什么需要动态 SQL#xff1f; 业务条件多且可选#xff08;多条件…适合零基础到进阶解释每个动态标签的作用、使用场景、常见坑并给出基于本项目的示例User/Student/Teacher。代码含详尽注释便于直接参考。1. 为什么需要动态 SQL业务条件多且可选多条件查询、可选更新字段。需要批量操作批量插入/删除。避免手写字符串拼接和 if/else 造成的代码混乱同时提升安全性使用#{}预编译占位符防 SQL 注入。2. 动态 SQL 的核心标签概览if条件成立则拼接片段。where自动处理首个条件前的AND/OR并在无条件时去掉WHERE。set更新语句中自动去掉末尾逗号。trim自定义前缀/后缀及多余字符的裁剪prefixOverrides、suffixOverrides。choose/when/otherwise相当于 SQL 里的 if/else if/else。foreach循环常用于IN (...)、批量插入。bind定义局部变量构造更灵活的条件本文示例主要用前几个标签。3. 项目结构与前置实体entity.User/Student/Teacher字段id, name, age, birthday, gender, phone。Mapper 接口UserDao、StudentDao、TeacherDao。Mapper XMLUserMapper.xml、StudentMapper.xml、TeacherMapper.xml。测试UserTest、StudentTest、TeacherTest。4. 基础示例多条件查询where if示例UserselectiddtFindUserparameterTypeentity.UserresultTypeentity.Userselect * from userwhere!-- 有条件时自动加 WHERE 并去掉首个 AND/OR --iftestname ! nulland name like concat(%, #{name}, %)!-- 仅当 name 非空才拼 --/ififtestgender ! nulland gender #{gender}/ififtestphone ! nulland phone like concat(%, #{phone}, %)/if/where/select要点where会在有条件时自动加上WHERE自动去掉首个条件前多余的AND/OR#{}是预编译占位符安全防注入。传入一个User对象非 null 的字段才会生效。扩展到 Student/Teacher 只需改表名和类型已在StudentMapper.xml/TeacherMapper.xml中实现。5. 动态更新set if示例UserupdateiddtUpdateparameterTypeentity.Userupdate userset!-- 自动去掉最后一个逗号避免 SQL 语法错误 --iftestname ! nullname #{name},/ififtestgender ! nullgender #{gender},/ififtestphone ! nullphone #{phone},/ififtestage ! nullage #{age},/ififtestbirthday ! nullbirth_date #{birthday},/if/setwhere id #{id}!-- 必填防止全表更新 --/update要点set自动去掉最后一个逗号避免语法错误。仅更新非空字段常用于“部分字段更新”。Student/Teacher 对应方法dtUpdateStudent、dtUpdateTeacher。6. 灵活裁剪trim6.1 动态 where trimselectidtrFindUserparameterTypeentity.UserresultTypeentity.Userselect * from usertrimprefixwhereprefixOverridesand | or!-- 自定义 where裁掉首个 AND/OR --iftestname ! nulland name like concat(%, #{name}, %)/ififtestgender ! nulland gender #{gender}/ififtestphone ! nulland phone like concat(%, #{phone}, %)/if/trim/select要点prefixwhere有条件时自动加WHERE。prefixOverridesand | or去掉首个多余的AND/OR。6.2 动态 set trimupdateidtrUpdateUserparameterTypeentity.Userupdate usertrimprefixsetsuffixOverrides,!-- 功能类似 set但可自定义裁剪 --iftestname ! nullname #{name},/ififtestgender ! nullgender #{gender},/ififtestphone ! nullphone #{phone},/ififtestage ! nullage #{age},/ififtestbirthday ! nullbirth_date #{birthday},/if/trimwhere id #{id}/updatesuffixOverrides,去掉最后的逗号等效于set但更自由可自定义前后缀。Student/Teacher 已有同名的trFind*/trUpdate*版本。7. 选择分支choose/when/otherwise示例UserselectidselectUserByChooseresultTypeentity.UserparameterTypeentity.Userselect * from userwherechoose!-- 命中第一个 when 后就停止适合按优先级选条件 --whentestname ! nullname #{name}/whenwhentestgender ! nullgender #{gender}/whenwhentestphone ! nullphone #{phone}/whenotherwiseid #{id}/otherwise/choose/where/select要点类似 if / else if / else。一旦命中某个when后续不会再执行。常用于“优先级条件”场景例如先按 name没 name 再按 gender 等。Student/Teacher 中有对应的selectStudentByChoose/selectTeacherByChoose。8. 批量操作foreach8.1 批量删除deleteiddeleteMoredelete from user where id inforeachitemidcollectionidsindexindexopen(close)separator,#{id}!-- 逐个绑定防注入 --/foreach/delete要点collectionids对应接口参数名Param(ids) ListInteger ids。open/close/separator控制括号与分隔符。8.2 批量插入insertidinsertMoreinsert into user (name, gender, phone, age, birth_date) valuesforeachitemusercollectionusersindexindexseparator,(#{user.name}, #{user.gender}, #{user.phone}, #{user.age}, #{user.birthday})!-- 拼成多行 values --/foreach/insert要点collectionusers对应接口参数名Param(users) ListUser users。每个元素生成一组(...)用逗号分隔。Student/Teacher 有同名的批量方法deleteMore、insertMore。9. 模糊查询与防注入安全写法selectidlikeByName2resultTypeentity.UserparameterTypejava.lang.Stringselect * from user where name like concat(%, #{value}, %)/select#{}预编译占位符安全。避免${}直接拼接除非做白名单校验的动态表/列名。本项目中likeByName使用${value}的写法仅作对比示例实际推荐likeByName2。10. 回填主键selectKeyinsertidinsertGetIdparameterTypeentity.Userinsert into user (name, gender, phone, age, birth_date) values(#{name}, #{gender}, #{phone}, #{age}, #{birthday})selectKeykeyPropertyidresultTypejava.lang.IntegerorderAFTERselect last_insert_id()/selectKey/insert要点orderAFTER先插入再查自增主键。keyPropertyid把生成的主键回填到入参对象的id字段。Student/Teacher 也有insertGetId。11. Java 测试用例示例以 User 为例Student/Teacher 类似TestpublicvoiddtFindUser(){UserusernewUser();user.setName(张);// 只给 name动态 where 会生成 name like %张%ListUserusersmapper.dtFindUser(user);users.forEach(System.out::println);}TestpublicvoiddtUpdate(){UserusernewUser();user.setId(13);user.setName(张三);// 只更新 nameintcountmapper.dtUpdate(user);System.out.println(count);}TestpublicvoiddeleteMore(){ListIntegeridsnewArrayList();ids.add(1);ids.add(2);intcountmapper.deleteMore(ids);System.out.println(count);}TestpublicvoidinsertMore(){ListUserusersnewArrayList();users.add(newUser(批量1,18,newDate(),男,1111));users.add(newUser(批量2,19,newDate(),女,2222));intcountmapper.insertMore(users);System.out.println(count);}运行说明确保SqlMapConfig.xml已注册对应 Mapper。用 JUnit 运行测试控制台可看到 STDOUT_LOGGING 打印的 SQL。事务在After里session.commit()写操作会提交。12. 常见坑与规避参数名不一致接口参数名、XML 中的占位符/集合名必须一致多个参数时可用Param。${}注入风险优先用#{}若必须用${}动态列/表先做白名单校验。空条件导致全表更新/删除动态 SQL 条件为空时要谨慎可在 Java 侧校验或在 XML 中加兜底如otherwise限制。末尾逗号set或suffixOverrides,处理不要手写逗号。choose 优先级命中第一个when后不会再看其他条件顺序要慎重。13. 常见面试题与简答#{} 和 ${}区别#{}预编译占位防注入${}字符串直拼易注入仅在动态表/列名等必须场景使用且要白名单。where和trim prefixwhere有何不同where自动加WHERE并去掉首个 AND/ORtrim更灵活可自定义前后缀与裁剪规则。set与trim prefixset suffixOverrides,的区别效果类似trim可自定义更复杂的裁剪逻辑set更简洁专用于 UPDATE。choose适用场景有优先级的条件选择类似 if/else if/else一次只命中一个分支。批量操作用什么标签foreach常见用于IN (...)和批量插入。如何防止动态更新把所有字段清空在 Java 侧校验至少有一个可更新字段或在 XML 用set包裹if确保where id ...必填。selectKey的作用获取插入后的主键并回填到对象属性order可选 BEFORE/AFTER。动态 SQL 是否影响性能MyBatis 会生成最终 SQL 并预编译性能主要取决于 SQL 本身和索引关键是保持条件有索引、避免全表扫描。14. 实践清单照着做按需挑选标签多条件用where if优先级用choose动态更新用set/trim批量用foreach。参数命名对齐接口参数名 XML 占位符一致多个参数用Param。防注入能用#{}不用${}动态表/列名必须白名单。提交事务写操作后记得commit()或openSession(true)。打日志setting namelogImpl valueSTDOUT_LOGGING/便于排查。15. 结语掌握动态 SQL 的几个标签组合就能写出可维护、可扩展的查询和更新语句。建议多练习将你的条件从 1 个扩展到 N 个看 SQL 是否按预期生成尝试批量插入/删除观察生成的 SQL用choose做优先级控制避免多重 if 嵌套。祝学习顺利面试稳稳拿下

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询