深圳正规网站建设公司,学雷锋做美德少年网站,wordpress 排除置顶文章,建设网站具体步骤MyBatis 是一个优秀的持久层框架#xff0c;它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的工作。本文将深入探讨 MyBatis 中的增删改查操作#xff0c;重点讲解静态与动态 SQL 语句的拼接#xff0c;并分析 S…MyBatis 是一个优秀的持久层框架它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的工作。本文将深入探讨 MyBatis 中的增删改查操作重点讲解静态与动态 SQL 语句的拼接并分析 SQL 注入问题及其防范措施。
1. MyBatis 基础配置
在开始之前我们需要配置 MyBatis 的基本环境。以下是一个简单的 pom.xml 配置文件包含了 MyBatis 的核心依赖和 MySQL 驱动依赖
dependencies!-- MyBatis 核心包 --dependencygroupIdorg.mybatis/groupIdartifactIdmybatis/artifactIdversion3.4.5/version/dependency!-- MySQL 驱动包 --dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion5.1.6/version/dependency!-- 单元测试 --dependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.10/version/dependency!-- 日志 --dependencygroupIdlog4j/groupIdartifactIdlog4j/artifactIdversion1.2.17/version/dependency
/dependencies
2. 静态 SQL 语句
静态 SQL 语句是指在编写 SQL 时SQL 语句的结构和内容是固定的不会根据条件的变化而变化。以下是一个简单的静态 SQL 查询示例
!--id:方法名--!--resultType:定义数据的返回--
!-- select idfindAll resultTypecom.qcby.entity.User--
!-- select *from user;--
!-- /select--!-- select idfindById resultTypecom.qcby.entity.User parameterTypejava.lang.Integer--
!-- select * from user where id#{id}--
!-- /select--!-- select idselectByUserName resultTypecom.qcby.entity.User parameterTypejava.lang.String--
!-- select *from user where username#{username}--
!-- /select--!-- insert idinsert parameterTypecom.qcby.entity.User--
!-- insert into user (username,birthday,sex,address) value (#{username},#{birthday},#{sex},#{address});--
!-- /insert--!-- update idupdate parameterTypecom.qcby.entity.User--
!-- update user set username#{username},birthday#{birthday},sex#{sex},address#{address}--
!-- where id#{id}--
!-- /update--!-- delete iddelete parameterTypejava.lang.Integer--
!-- delete from user where id#{id}--
!-- /delete--
!-- select idlikeByName resultTypecom.qcby.entity.User parameterTypejava.lang.String--
!-- select * from user where username like %${value}%;--
!-- /select--
!-- select idlikeByName1 resultTypecom.qcby.entity.User parameterTypejava.lang.String--
!-- select * from user where username like #{username};--
!-- /select--
在这个例子中findAll 方法会返回 user 表中的所有记录。静态 SQL 语句适用于简单的查询场景但在复杂的业务逻辑中静态 SQL 往往无法满足需求。
3. 动态 SQL 语句
动态 SQL 是 MyBatis 的强大特性之一它允许我们根据不同的条件动态生成 SQL 语句。MyBatis 提供了多种标签来实现动态 SQL如 if、choose、when、otherwise、trim、where、set 和 foreach。
3.1 if 标签
if 标签用于根据条件判断是否包含某段 SQL 语句。以下是一个使用 if 标签的动态 SQL 示例 !--动态sql:能够在不同的条件下拼接出不同的sql语句--!--where 标签的功能能够去掉where 后边的 and 或 or--select idselectUser parameterTypecom.qcby.entity.User resultTypecom.qcby.entity.Userselect * from userwhereif testusername!null and username!username#{username}/ifif testbirthday!nulland birthday#{birthday}/ifif testsex!null and sex!and sex#{sex}/ifif testaddress!null and address!and address#{address}/if/where/select
在这个例子中selectUser 方法会根据传入的 User 对象的 username 和 sex 属性动态生成 SQL 语句。如果 username 或 sex 为空则不会包含对应的条件。
3.2 choose、when 和 otherwise 标签
choose 标签类似于 Java 中的 switch 语句它可以根据不同的条件选择不同的 SQL 片段。以下是一个使用 choose 标签的示例
select idselectUserByChoose resultTypecom.qcby.entity.User parameterTypecom.qcby.entity.UserSELECT * FROM userwherechoosewhen testusername ! null and username ! username #{username}/whenwhen testsex ! null and sex ! sex #{sex}/whenotherwiseid #{id}/otherwise/choose/where
/select
在这个例子中selectUserByChoose 方法会根据 username、sex 和 id 的不同值动态生成 SQL 语句。
3.3 foreach 标签
foreach 标签用于遍历集合或数组并生成相应的 SQL 语句。以下是一个使用 foreach 标签的批量删除示例
!--foreach循环--!--批量删除--!-- 批量删除的sql语句:delete from user where id in (6,7,8); --delete iddeleteMoreByArray delete from user where id inforeach collectionids itemid separator, open( close)#{id}/foreach/delete!-- collection:当前要循环的数组或者集合 --!-- item: 我们指定要循环的数组的每一个元素 --!-- separator:每一个元素应该用什么来做分割 --!-- open:当前循环是以什么开始 --!-- close:当前循环是以什么结束 --!--批量添加--!--insert into user(username,birthday,sex,address) values (#{user.username},#{user.birthday},#{user.sex},#{user.address}), (#{user.username},#{user.birthday},#{user.sex},#{user.address}), (#{user.username},#{user.birthday},#{user.sex},#{user.address}), (#{user.username},#{user.birthday},#{user.sex},#{user.address}) --update idinsertMoreByList parameterTypecom.qcby.entity.Userinsert into user(username,birthday,sex,address) valuesforeach collectionusers itemuser separator,(#{user.username},#{user.birthday},#{user.sex},#{user.address})/foreach/update
在这个例子中deleteMoreByArray 方法会根据传入的 ids 数组动态生成批量删除的 SQL 语句。
4. SQL 注入问题及防范
SQL 注入是一种常见的安全漏洞攻击者可以通过在输入中插入恶意 SQL 代码来操纵数据库查询。MyBatis 通过使用 #{} 占位符来防止 SQL 注入。
4.1 #{} 与 ${} 的区别 #{}MyBatis 会使用预编译语句PreparedStatement来处理参数参数会被安全地转义从而防止 SQL 注入。 ${}MyBatis 会直接将参数拼接到 SQL 语句中存在 SQL 注入的风险。
以下是一个使用 #{} 的示例
select idfindById resultTypecom.qcby.entity.User parameterTypejava.lang.IntegerSELECT * FROM user WHERE id #{id}
/select
在这个例子中#{} 会确保 id 参数被安全地处理防止 SQL 注入。
4.2 防范 SQL 注入的最佳实践 始终使用 #{}在大多数情况下应使用 #{} 来处理参数避免使用 ${}。 避免动态拼接 SQL尽量避免在 SQL 语句中动态拼接用户输入的内容。 使用 MyBatis 的动态 SQL 标签通过使用 if、choose 等标签可以安全地构建动态 SQL 语句。
5. 总结
MyBatis 提供了强大的动态 SQL 功能使得我们可以根据不同的条件灵活地生成 SQL 语句。同时MyBatis 通过 #{} 占位符有效地防止了 SQL 注入问题。在实际开发中我们应充分利用 MyBatis 的动态 SQL 特性并遵循最佳实践来确保应用的安全性。
通过本文你应该对 MyBatis 的增删改查操作、动态 SQL 语句拼接以及 SQL 注入问题有了更深入的理解。希望这些内容能帮助你在实际项目中更好地使用 MyBatis。 参考文献 MyBatis 官方文档 SQL 注入攻击与防御
文章转载自: http://www.morning.twfdm.cn.gov.cn.twfdm.cn http://www.morning.kmwbq.cn.gov.cn.kmwbq.cn http://www.morning.lfsmf.cn.gov.cn.lfsmf.cn http://www.morning.mdjzydr.com.gov.cn.mdjzydr.com http://www.morning.rbylq.cn.gov.cn.rbylq.cn http://www.morning.hhxpl.cn.gov.cn.hhxpl.cn http://www.morning.stxg.cn.gov.cn.stxg.cn http://www.morning.tpchy.cn.gov.cn.tpchy.cn http://www.morning.xqltq.cn.gov.cn.xqltq.cn http://www.morning.ntzfl.cn.gov.cn.ntzfl.cn http://www.morning.ktmbr.cn.gov.cn.ktmbr.cn http://www.morning.gjmbk.cn.gov.cn.gjmbk.cn http://www.morning.mdgpp.cn.gov.cn.mdgpp.cn http://www.morning.gppqf.cn.gov.cn.gppqf.cn http://www.morning.ndfwh.cn.gov.cn.ndfwh.cn http://www.morning.saletj.com.gov.cn.saletj.com http://www.morning.qbzdj.cn.gov.cn.qbzdj.cn http://www.morning.fnpyk.cn.gov.cn.fnpyk.cn http://www.morning.nrcbx.cn.gov.cn.nrcbx.cn http://www.morning.wbxbj.cn.gov.cn.wbxbj.cn http://www.morning.xqtqm.cn.gov.cn.xqtqm.cn http://www.morning.mtbsd.cn.gov.cn.mtbsd.cn http://www.morning.nmngg.cn.gov.cn.nmngg.cn http://www.morning.xdttq.cn.gov.cn.xdttq.cn http://www.morning.xinxianzhi005.com.gov.cn.xinxianzhi005.com http://www.morning.tjcgl.cn.gov.cn.tjcgl.cn http://www.morning.cjqqj.cn.gov.cn.cjqqj.cn http://www.morning.ttrdr.cn.gov.cn.ttrdr.cn http://www.morning.zjqwr.cn.gov.cn.zjqwr.cn http://www.morning.fxxmj.cn.gov.cn.fxxmj.cn http://www.morning.clxpp.cn.gov.cn.clxpp.cn http://www.morning.sgpnz.cn.gov.cn.sgpnz.cn http://www.morning.yymlk.cn.gov.cn.yymlk.cn http://www.morning.xcbnc.cn.gov.cn.xcbnc.cn http://www.morning.qqzdr.cn.gov.cn.qqzdr.cn http://www.morning.wpmlp.cn.gov.cn.wpmlp.cn http://www.morning.nwzcf.cn.gov.cn.nwzcf.cn http://www.morning.hgfxg.cn.gov.cn.hgfxg.cn http://www.morning.wnnfh.cn.gov.cn.wnnfh.cn http://www.morning.bklhx.cn.gov.cn.bklhx.cn http://www.morning.mqfhy.cn.gov.cn.mqfhy.cn http://www.morning.nwnbq.cn.gov.cn.nwnbq.cn http://www.morning.rpjyl.cn.gov.cn.rpjyl.cn http://www.morning.cpljq.cn.gov.cn.cpljq.cn http://www.morning.qbccg.cn.gov.cn.qbccg.cn http://www.morning.pqkrh.cn.gov.cn.pqkrh.cn http://www.morning.addai.cn.gov.cn.addai.cn http://www.morning.gswfs.cn.gov.cn.gswfs.cn http://www.morning.krswn.cn.gov.cn.krswn.cn http://www.morning.ryxgk.cn.gov.cn.ryxgk.cn http://www.morning.cftkz.cn.gov.cn.cftkz.cn http://www.morning.bnbzd.cn.gov.cn.bnbzd.cn http://www.morning.hgscb.cn.gov.cn.hgscb.cn http://www.morning.fypgl.cn.gov.cn.fypgl.cn http://www.morning.gdpai.com.cn.gov.cn.gdpai.com.cn http://www.morning.qdxkn.cn.gov.cn.qdxkn.cn http://www.morning.htbbp.cn.gov.cn.htbbp.cn http://www.morning.jcyrs.cn.gov.cn.jcyrs.cn http://www.morning.lqrpk.cn.gov.cn.lqrpk.cn http://www.morning.duqianw.com.gov.cn.duqianw.com http://www.morning.btblm.cn.gov.cn.btblm.cn http://www.morning.bbgn.cn.gov.cn.bbgn.cn http://www.morning.ljsxg.cn.gov.cn.ljsxg.cn http://www.morning.hrtwt.cn.gov.cn.hrtwt.cn http://www.morning.gxqpm.cn.gov.cn.gxqpm.cn http://www.morning.knlgk.cn.gov.cn.knlgk.cn http://www.morning.jrslj.cn.gov.cn.jrslj.cn http://www.morning.rpjr.cn.gov.cn.rpjr.cn http://www.morning.knscf.cn.gov.cn.knscf.cn http://www.morning.wdjcr.cn.gov.cn.wdjcr.cn http://www.morning.hcsqznn.cn.gov.cn.hcsqznn.cn http://www.morning.rmxwm.cn.gov.cn.rmxwm.cn http://www.morning.xknmn.cn.gov.cn.xknmn.cn http://www.morning.c7500.cn.gov.cn.c7500.cn http://www.morning.dcccl.cn.gov.cn.dcccl.cn http://www.morning.yqfdl.cn.gov.cn.yqfdl.cn http://www.morning.wgqtj.cn.gov.cn.wgqtj.cn http://www.morning.nlhcb.cn.gov.cn.nlhcb.cn http://www.morning.tqpds.cn.gov.cn.tqpds.cn http://www.morning.kflpf.cn.gov.cn.kflpf.cn