当前位置: 首页 > news >正文

平面设计类的网站北京手机网站制作公司

平面设计类的网站,北京手机网站制作公司,网站查外链,wordpress 文章商品动态SQL—SSM框架的学习与应用(Spring Spring MVC MyBatis)-Java EE企业级应用开发学习记录#xff08;第三天#xff09;Mybatis的动态SQL操作 昨天我们深入学习了Mybatis的核心对象SqlSessionFactoryBuilder#xff0c;掌握MyBatis核心配置文件以及元素的使用,也掌握My…动态SQL—SSM框架的学习与应用(Spring Spring MVC MyBatis)-Java EE企业级应用开发学习记录第三天Mybatis的动态SQL操作 昨天我们深入学习了Mybatis的核心对象SqlSessionFactoryBuilder掌握MyBatis核心配置文件以及元素的使用,也掌握MyBatis映射文件及其元素的使用。那么今天我们需要掌握的是更加复杂的查询操作。 学会编写MyBatis中动态SQL学会MyBatis的条件查询操作学会MyBatis的更新操作学会MyBatis的复杂查询操作 一、什么是动态SQL? ​ MyBatis 中的动态 SQL 是一种在 SQL 查询语句中根据不同的条件来动态生成不同的 SQL 片段的技术。它允许你根据不同的情况来构建查询条件避免写大量重复的 SQL 语句。 动态SQL常用元素 元素说明 if 判断语句用于单条件判断 choose when 、 otherwise 相当于Java中的switch…case…default语句用于多条件判断 where 简化SQL语句中where的条件判断 trim 可以灵活地去除多余的关键字 set 用于SQL语句的动态更新 foreach 循环语句常用于in语句等列举条件中 动态 SQL 通常用于构建复杂的查询条件例如 根据不同的条件组合进行查询比如根据姓名、性别、年龄等多个条件进行筛选。根据不同的条件来动态排序查询结果。在更新操作中根据传入的参数来选择性地更新某些字段。在插入操作中根据不同的参数情况来选择性地插入某些字段。 MyBatis 提供了以下方式来实现动态 SQL: 使用 if 元素 可以根据条件来动态生成 SQL 片段。例如 select idfindByCondition parameterTypemap resultTypeUserSELECT * FROM userswhereif testname ! nullAND name #{name}/ifif testage ! nullAND age #{age}/if/where /select代码解释如下 select 标签定义了一个查询语句并指定了它的唯一标识符id、输入参数类型parameterType和结果类型resultType。 SELECT * FROM users 是实际的 SQL 查询语句表示从名为 “users” 的表中选取所有列的数据。 where 标签是 MyBatis 提供的一个用于构建动态 SQL 的元素它会在生成的 SQL 语句中添加 “WHERE” 关键字并且只会在至少有一个条件满足时添加。 if 标签是 where 标签中的子元素用于判断某个条件是否成立。它的 “test” 属性用于指定一个条件表达式。 如果 testname ! null 成立那么会在生成的 SQL 语句中添加一个 “AND name #{name}” 的条件。 如果 testage ! null 成立那么会在生成的 SQL 语句中添加一个 “AND age #{age}” 的条件。 这样在实际执行查询时如果传入的参数中有 “name”那么会根据 “name” 的值添加相应的查询条件同样地如果传入的参数中有 “age”那么会根据 “age” 的值添加相应的查询条件。 使用 choose 元素 类似于 switch 语句根据条件选择一个分支进行处理。 select idfindByCondition parameterTypemap resultTypeUserSELECT * FROM userswherechoosewhen testname ! nullAND name #{name}/whenwhen testage ! nullAND age #{age}/whenotherwiseAND 11/otherwise/choose/where /select代码解释 这段代码使用了 MyBatis 中的动态 SQL 元素 choose 元素也称为 choose/when/otherwise 构造。这样的构造允许你在 SQL 查询中根据条件动态地生成不同的部分。 choose 包含了多个 when 元素每个 when 元素对应一个条件判断如果条件满足就会生成相应的 SQL 查询条件。如果所有条件都不满足就会执行 otherwise 部分。 简单来说这个查询语句的意思是 如果传入的参数 name 不为 null则添加条件 AND name #{name} 到查询语句中。如果传入的参数 age 不为 null则添加条件 AND age #{age} 到查询语句中。如果以上条件都不满足即都为 null则添加条件 AND 11 到查询语句中。这个条件相当于一个恒为真的条件因此不会影响查询结果。 使用 trim 元素 可以根据条件来剪切 SQL 片段的开始或结尾以防止出现多余的关键字。 select idfindByCondition parameterTypemap resultTypeUserSELECT * FROM userswheretrim prefixAND ( suffix) prefixOverridesORif testname ! nullOR name #{name}/ifif testage ! nullOR age #{age}/if/trim/where /select上述代码使用了 MyBatis 的动态 SQL 元素中的 trim 元素用于构建更复杂的条件语句。trim 元素用于构建一个以 AND 为前缀和 ) 为后缀的条件片段同时在生成条件语句时去除可能多余的 OR。 简单来说这个查询语句的意思是 如果传入的参数 name 不为 null则将 OR name #{name} 添加到条件片段中。如果传入的参数 age 不为 null则将 OR age #{age} 添加到条件片段中。 trim 元素的 prefix 属性指定前缀suffix 属性指定后缀prefixOverrides 属性指定需要去除的前缀。在这个例子中prefix 是 AND (suffix 是 )prefixOverrides 是 OR。这样如果有至少一个条件满足就会生成类似 AND ( condition1 OR condition2 ) 的查询语句。如果没有条件满足就会生成 AND ()这不会影响查询结果。 使用 foreach 元素 可以用来遍历集合或数组参数生成多个相同的 SQL 片段。 select idfindByIds parameterTypelist resultTypeUserSELECT * FROM usersWHERE id INforeach itemid collectionlist open( separator, close)#{id}/foreach /select这段代码是一个 MyBatis 的动态 SQL 查询语句用于根据传入的一组 id 值查询对应的用户信息。这个查询语句利用了 foreach 元素允许在 SQL 查询中动态地生成 IN 子句。 具体来说这个查询语句的意思是 查询 users 表中的所有列SELECT *。使用 WHERE 子句进行过滤条件是 id 值在传入的 list 参数中。foreach 元素用于循环遍历传入的 list 参数将每个 id 值包装在 ( 和 ) 之间并使用 , 作为分隔符。 在这个查询语句中foreach 元素的属性含义如下 item指定在每次循环中使用的变量名这里是 id。collection指定要遍历的集合参数的名字这里是 list。open指定循环的开始字符这里是 (。separator指定循环每个元素之间的分隔符这里是 ,。close指定循环的结束字符这里是 )。 这样如果传入一个列表参数 list比如 [1, 2, 3]就会生成类似 SELECT * FROM users WHERE id IN (1, 2, 3) 的查询语句从而查询对应的用户信息。 这些动态 SQL 的特性使得 MyBatis 在构建灵活和动态的查询条件时非常方便避免了硬编码大量重复的 SQL 语句。 二、MyBatis的条件查询操作 ​ 在学习了上面的几个动态SQL的常用元素现在我们来尝试一下编写一下我们自己项目的动态SQL。 1.编写一个使用if的动态SQl查询语句若有账号名称Account则按账号名称Account查询若有网站名WebsiteName则用WebsiteName查询若俩个都有则俩个都匹配的才查询。 PasswordMSMapper.xml中编写动态sql语句 ①首先进行单条件查询测试若Account不为空 ②也是单条件查询测试若WebsiteName不为空 ③若是俩个条件都满足呢Account和WebsiteName都不为空 ④若是俩个条件都不满足呢Account和WebsiteName都为空 ​ 可以看到Mybatis是会根据我们输入的查询条件进行拼接生成动态的SQL。 2.那么我们继续尝试编写choose的动态sql语句情景时若有账号名Account则优先使用账号名进行查询。若无账户名有网站名WebsiteName那么就按网站名搜索。若账号名网站名都无那么就采用默认查询passwordms表中的所有信息。 ​ 在使用if元素时只要test属性中的表达式为true就会执行元素中的条件语句但是在实际应用中有时只需要从多个选项中选择一个去执行。这时候使用choose就是非常合适的如果使用if则是不合适的。 PasswordMSMapper.xml中编写动态sql语句 那么去编写我们的测试类根据不同的输入情况查看是否满足我们的需求 ①Account不为空WebsiteName为空的情况 ②Account不为空WebsiteName不为空的情况结果和上面的一样 ③Account为空WebsiteName不为空的情况 ④Account为空WebsiteName也为空的情况 ​ 可以看到Mybatis是会根据我们输入的查询条件进行拼接生成动态的SQL。 3.那么我们继续尝试编写where、trim的动态sql语句情景时在sql中where 后面直接跟and 或者 or之类的关键字都是错误的会导致我们的SQL语句运行不成功 在这个示例中我们写了个 trim prefixAND ( suffix) prefixOverrideAND, 在if条件中Account满足时程序会自动在AND Account#{Account}前面、后面添加上前后缀生成新的语句 AND (AND Account#{Account}) 若是WebsiteName也满足的话新的sql语句为 AND (AND Account#{Account} AND WebsiteName #{WebsiteName} ) 我们写的prefixOverrides“AND”会自动将()里面的多余的前缀AND去除即生成 AND ( Account#{Account} AND WebsiteName #{WebsiteName} ) 看到这里是不是觉得那外面还有一个where呢where AND (Account#{Account} AND WebsiteName #{WebsiteName})也是错的对不实际上where 会自动帮我们去除()外多余的AND和OR防止SQL语句出错。 因此这个流程下来我们的语句就变成了 where ( Account#{Account} AND WebsiteName #{WebsiteName} ) 我们去输入测试类看看就知道是不是了 ①Account不为空WebsiteName也不为空 ②Account为空WebsiteName不为空 根据我们上面讲的流程那么推测生成的动态sql语句应该是 where ( WebsiteName#{WebsiteName} ) ③Account、WebsiteName都为空 根据我们上面讲的流程那么推测生成的动态sql语句应该是 Select * from passwordms因为if里面的条件每一个成立所以where也不会添加进去但是会自动删除语句中多余的AND或OR 可以看到Mybatis是会根据我们输入的查询条件进行拼接生成动态的SQL并且正确无误。 三、Mybatis的更新操作 4.那么我们继续尝试编写set、trim的动态sql语句情景时如果想要更新某一个对象就需要发送所有的字段给持久化对象然而在实际应用中大多数情况下都是更新某一个或几个字段。如果更新的每一条数据都要将其所有的属性都更新一遍那么执行效率是非常差的。为了解决更新数据的效率问题MyBatis提供了set元素。 ​ 除了可以用trim元素来进行更新操作外也使用set元素来进行更新操作 在映射文件中使用set元素和if元素组合进行update语句动态SQL组装时如果set元素内包含的内容都为空则会出现SQL语法错误。因此在使用set元素进行字段信息更新时要确保传入的更新字段不能都为空。 ​ 除此以外还可以跟前面的trim元素联合起来一起使用。其中 trim元素suffixOverrides属性指定去除的trim元素所包含内容的后缀为逗号 。 好那么我们来编写我们的Mapper文件 接下来进行测试类测试 ①更新多个字段的情况 ​ 可以看到嗷正常数据更新了但是呢其实是有问题的不管数据是不是更原来的一样都会对数据库进行一次更新的操作。 因此我们还需要再改改还需要加一个数据库对比的判断详细代码如下 isDataEqual()方法如下 // 判断两个对象的数据是否相等private boolean isDataEqual(PasswordMS oldData, PasswordMS newData) {return Objects.equals(oldData.getAccount(), newData.getAccount()) Objects.equals(oldData.getWebsiteName(), newData.getWebsiteName());}那么保持参数条件不变的情况下继续进行测试 可以看到测试成功正确提示 ②尝试看看单参数字段修改的情况 ③若是无参数那么就会报错所以一定要确保更新的参数必须要有不能全为空。 好的那么更新操作就学到这里了。 四、使用Mybatis的动态SQL进行复杂操作 使用 foreach 元素可以在 MyBatis 中对集合进行迭代操作通常用于构建 IN 条件的查询语句。 foreach元素的属性 属性说明item表示集合中每一个元素进行迭代时的别名。该属性为必选。index在List和数组中index是元素的序号在Map中index是元素的key。该属性可选。open表示foreach语句代码的开始符号一般和close“)”合用。常用在in条件语句中。该属性可选。separator表示元素之间的分隔符例如在条件语句中separator“,”会自动在元素中间用“,”隔开避免手动输入逗号导致SQL错误错误示例如in(1,2,)。该属性可选。close表示foreach语句代码的关闭符号一般和open(合用。常用在in条件语句中。该属性可选。collection用于指定遍历参数的类型。注意该属性必须指定不同情况下该属性的值是不一样的。 collection属性的取值 ​ 在遍历参数时collection属性的值是必须指定的。不同情况下该属性的取值也是不一样的主要有以下三种情况List类型、数值类型、Map类型。 若入参为单参数且参数类型是一个Listcollection属性值为list。若入参为单参数且参数类型是一个数组collection属性值为array。若传入参数为多参数就需要把参数封装为一个Map进行处理collection属性值为Map。若传入参数为多参数就需要把参数封装为一个Map进行处理collection属性值为Map。 5.那么我们继续尝试编写foreach的动态sql语句情景时要从数据表passwordms中查询出id为1、2、3的账号信息就可以利用数组作为参数存储id的属性值1、2、3并通过foreach元素迭代数组完成账号信息的批量查询操作。 好那么我们来编写我们的Mapper文件 select idfindByIds parameterTypelist resultTypePasswordMSSELECT * FROM passwordmsWHERE id INforeach itemid collectionlist open( separator, close)#{id}/foreach/select在我们的代码中findByIds 是查询的 IDparameterType 设置为 list 表示传入的参数是一个 ListresultType 设置为 PasswordMS 表示返回结果是 PasswordMS 类型的对象。 编写测试类 输入的参数类型为同一种查询1-3的账号信息 Test void findByIds() {SqlSession session MyBatisUtil.createSqlSession();ListInteger idList Arrays.asList(1, 2, 3); // 要查询的 id 列表// 传入参数查询返回结果ListPasswordMS passwordMSList session.selectList(findByIds, idList);for (PasswordMS s : passwordMSList) {logger.info(id: s.getId() ,账号: s.getAccount() ,密码 s.getPassword() ,网站名: s.getWebsiteName() ,网站网址: s.getWebsiteURL() ,网站缩略图: s.getWebsiteImage() ,账号描述: s.getAccountDescription());}// 关闭 sessionsession.close(); }可以看出通过使用 foreach 元素就能够方便地在 MyBatis 中对集合进行迭代操作构建需要的查询条件。 总结 这是第三天对SSM框架的学习深入学习了MyBatis的动态SQL它允许我们根据不同的条件在 SQL 查询中动态地构建、拼接和执行 SQL 语句。动态 SQL 可以帮助你编写更加灵活、可复用和动态的数据库查询语句适用于各种复杂的业务场景。 ​ 想要跟着学习的可以去我的资源里面找对应的文件下载我的md文件也会发上去项目文件会上传可以自己跟着学习一下。 PSsql语句自己编写┗|O′|┛ 嗷~~ 作者Stevedash 发表于2023年8月23日 16点28分 注本文内容基于个人学习理解如有错误或疏漏欢迎指正。感谢阅读如果觉得有帮助请点赞和分享。
http://www.tj-hxxt.cn/news/233890.html

相关文章:

  • 青岛团购网站建设网络营销策略有哪些方法
  • 做网站业务的怎么寻找客户wordpress 3d
  • 莞城区小程序app网站开发建工论坛网
  • 西宁哪家公司做网站王野天 葛优
  • 建设银行网站怎么查自己账号吗泰安服装网站建设
  • 免费自助建站工具曲阜网站建设百度开户
  • 网站开发收费标准文档手机微信网页版登录
  • 怎么把网站和域名绑定做百度移动网站点击软
  • 丰南建设网站四川手机网站建设公司
  • 做公司网站开发的公司wordpress 修改配置文件
  • 成都网站建设 网络公司网站开发小结
  • 企业网站建设费怎么入账北京移动网站建设公司排名
  • 郑州市网站建设专业的网站制作正规公司
  • 扶余手机网站开发拐个娇妻做晚餐在哪个网站连载呢
  • ui设计师是做网站吗响应式外贸营销网站
  • 成都网站建设与网站推广培训企业邮箱域名注册
  • 怡清源企业网站建设可行性分析重庆有哪些建设公司
  • 网站制作布局中小企业网站营销
  • 自创字 网站广州营销推广公司
  • 可信网站验证服务中心如何给网站续费
  • 怎么用ftp修改网站图片做网站买过域名之后
  • 鲜花培训网站建设商城网站的seo优化改怎么做
  • 做一个商务平台网站的费用内蒙古建设厅安全资料网站
  • 安卓网站开发金华婺城建设局网站
  • 建设银行公积金网站提示udun公司变更地址流程
  • 企业建设企业网站的好处网站建设促销活动
  • 网页制作与网站建设策划书案例专业加速器产业园
  • 做网站送400电话石家庄seo网站优化
  • 四川整站优化专业的机构wordpress博客打开慢
  • 校园网站建设的必要性论文江都住房和建设局网站