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

Mybatis SQL构建器类 - 问题答案

问题

Java开发人员可能会碰到的最棘手的事情之一就是在Java代码中嵌入SQL语句。通常情况下,这是因为需要动态生成SQL语句 - 否则可以将其外部化到文件或存储过程中。正如你已经了解到的,MyBatis在其XML映射功能中有一个强大的解决方案来生成动态SQL。然而,有时候在Java代码中构建SQL语句字符串是必要的。在这种情况下,MyBatis还有一个特性可以帮助您,避免陷入典型的加号、引号、换行、格式化问题和嵌套条件语句处理额外逗号或AND连接符的混乱中。实际上,在Java中动态生成SQL代码可能会成为一场真正的噩梦。例如:

String sql = "SELECT P.ID, P.USERNAME, P.PASSWORD, P.FULL_NAME, "
"P.LAST_NAME,P.CREATED_ON, P.UPDATED_ON " +
"FROM PERSON P, ACCOUNT A " +
"INNER JOIN DEPARTMENT D on D.ID = P.DEPARTMENT_ID " +
"INNER JOIN COMPANY C on D.COMPANY_ID = C.ID " +
"WHERE (P.ID = A.ID AND P.FIRST_NAME like ?) " +
"OR (P.LAST_NAME like ?) " +
"GROUP BY P.ID " +
"HAVING (P.LAST_NAME like ?) " +
"OR (P.FIRST_NAME like ?) " +
"ORDER BY P.ID, P.FULL_NAME";
答案

MyBatis 3提供了一个便利的工具类来帮助解决这个问题。通过使用SQL类,您只需创建一个实例,然后可以调用其方法逐步构建SQL语句。重写上面的示例问题时,可以使用SQL类来实现如下:

private String selectPersonSql() {return new SQL() {{SELECT("P.ID, P.USERNAME, P.PASSWORD, P.FULL_NAME");SELECT("P.LAST_NAME, P.CREATED_ON, P.UPDATED_ON");FROM("PERSON P");FROM("ACCOUNT A");INNER_JOIN("DEPARTMENT D on D.ID = P.DEPARTMENT_ID");INNER_JOIN("COMPANY C on D.COMPANY_ID = C.ID");WHERE("P.ID = A.ID");WHERE("P.FIRST_NAME like ?");OR();WHERE("P.LAST_NAME like ?");GROUP_BY("P.ID");HAVING("P.LAST_NAME like ?");OR();HAVING("P.FIRST_NAME like ?");ORDER_BY("P.ID");ORDER_BY("P.FULL_NAME");}}.toString();
}

这个示例有什么特别之处?嗯,如果你仔细看的话,它不必担心意外重复出现“AND”关键字,也不需要在“WHERE”和“AND”之间进行选择或者两者都不需要。SQL类会处理好理解何时需要插入“WHERE”,何时使用“AND”以及所有的字符串拼接工作。

http://www.lryc.cn/news/272522.html

相关文章:

  • React 是什么?有什么特性?有哪些优势?
  • 瑞吉外卖项目详细总结
  • Cytoscape 3.10安装包下载及安装教程
  • data.TensorDataset解析
  • 贝锐花生壳全新功能:浏览器一键远程访问SSHRDP远程桌面
  • 2024 年度 AAAI Fellows 揭晓!清华大学朱军教授入选!
  • Linux(openssl):用CA证书签名具有SAN的CSR
  • 从零开始了解大数据(七):总结
  • 增量预训练经验积累(3)
  • R语言【CoordinateCleaner】——cc_dupl():根据物种名称和坐标以及用户定义的附加列删除或标记重复的记录
  • Hadoop安装笔记1单机/伪分布式配置_Hadoop3.1.3——备赛笔记——2024全国职业院校技能大赛“大数据应用开发”赛项——任务2:离线数据处理
  • python数据分析之交叉验证
  • 机器人技能学习--数据集剖析
  • Jenkins的Transfers路径怎么配置,解决Transfers配置不生效的问题
  • php安装扩展event 提示 No package ‘openssl‘ found 解决方法
  • 基于SpringBoot的动物领养平台的设计与实现
  • 计算机网络期末复习——计算大题(一)
  • 2024年深度学习、计算机视觉与大模型面试题综述,六大专题数百道题目
  • 解读 $mash 通证 “Fair Launch” 规则,将公平发挥极致
  • 06、docker 安装mysql8
  • 魔改Stable Diffusion,开源创新“单目深度估计”模型
  • 使用JAVA Zookeeper构建分布式键值存储
  • 2023-12-19 LeetCode每日一题(寻找峰值 II)
  • gin框架使用系列之五——表单校验
  • HackTheBox - Medium - Linux - Interface
  • C++ 字符串操作说明 续
  • [情商-7]:如何回答没有标准答案的两难问题
  • 对偶问题的基本性质
  • Google Chrome 现在会在后台扫描泄露的密码
  • 【Matlab】PSO-BP 基于粒子群算法优化BP神经网络的数据时序预测(附代码)