mybatis_user_guide(7) SQL语句构建器类

【0】README
1)本文全文总结于  http://www.mybatis.org/mybatis-3/zh/statement-builders.html

【1】在Java代码中来动态生成SQL代码就是一场噩梦
1)problem+solutions:
1.1)problem:Java程序员面对的最痛苦的事情之一就是在Java代码中嵌入SQL语句。这么来做通常是由于SQL语句需要动态来生成-否则可以将它们放到外部文件或者存储过程中。正如你已经看到的那样,MyBatis在它的XML映射特性中有一个强大的动态SQL生成方案。但有时在Java代码内部创建SQL语句也是必要的。(干货——事实上,在Java代码中来动态生成SQL代码就是一场噩梦)
<pre name="code" class="java">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";
 
1.2)solutions)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();
}

【2】SQL类
1)这里给出一些示例:
// Anonymous inner class
public String deletePersonSql() {return new SQL() {{DELETE_FROM("PERSON");WHERE("ID = #{id}");}}.toString();
}// Builder / Fluent style
public String insertPersonSql() {String sql = new SQL().INSERT_INTO("PERSON").VALUES("ID, FIRST_NAME", "#{id}, #{firstName}").VALUES("LAST_NAME", "#{lastName}").toString();return sql;
}// With conditionals (note the final parameters, required for the anonymous inner class to access them)
public String selectPersonLike(final String id, final String firstName, final String lastName) {return new SQL() {{SELECT("P.ID, P.USERNAME, P.PASSWORD, P.FIRST_NAME, P.LAST_NAME");FROM("PERSON P");if (id != null) {WHERE("P.ID like #{id}");}if (firstName != null) {WHERE("P.FIRST_NAME like #{firstName}");}if (lastName != null) {WHERE("P.LAST_NAME like #{lastName}");}ORDER_BY("P.LAST_NAME");}}.toString();
}public String deletePersonSql() {return new SQL() {{DELETE_FROM("PERSON");WHERE("ID = #{id}");}}.toString();
}public String insertPersonSql() {return new SQL() {{INSERT_INTO("PERSON");VALUES("ID, FIRST_NAME", "#{id}, #{firstName}");VALUES("LAST_NAME", "#{lastName}");}}.toString();
}public String updatePersonSql() {return new SQL() {{UPDATE("PERSON");SET("FIRST_NAME = #{firstName}");WHERE("ID = #{id}");}}.toString();
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331073.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

datagrid获取页面总记录数的方法,datagrid获取页面总记录数为0的解决方法

1 在网上查了一大堆博客&#xff0c;都只有下面这一段&#xff0c;也不知道这些人有没有测试 var data$(#tt).datagrid(getData); alert(总数据量:data.total)//注意你的数据源一定要定义了total&#xff0c;要不会为undefined&#xff0c;datagrid分页就是靠这个total定义 al…

1分钟了解协同过滤,pm都懂了

转载自 1分钟了解协同过滤&#xff0c;pm都懂了工程架构方向的程序员&#xff0c;看到推荐/搜索/广告等和算法相关的技术&#xff0c;心中或多或少有一丝胆怯。但认真研究之后&#xff0c;发现其实没有这么难。今天的1分钟系列&#xff0c;给大家介绍下推荐系统中的“协同过滤”…

mybatis_user_guide(8) 日志

【0】README 1&#xff09;本文全文总结于 http://www.mybatis.org/mybatis-3/zh/logging.html 2&#xff09;Mybatis内置的日志工厂提供日志功能&#xff0c;具体的日志实现有以下几种工具&#xff1a; SLF4JApache Commons LoggingLog4j 2Log4jJDK logging 3&#xff09;具体…

hibernate在saveOrUpdate时,update报错:a different object with the same identifier value was already assoc

1 原因&#xff1a;网上说是&#xff0c;在hibernate中同一个session里面有了两个相同标识但是是不同实体。 2 我找出的解决方法是&#xff1a; getSession().clear(); //在dao层把session清理一下 3 网上查找出还有其他解决方法&#xff0c;其中 getSession().merge(arg0…

1分钟了解区块链的本质

转载自 1分钟了解区块链的本质区块链&#xff0c;比特币这些概念最近都很火&#xff0c;但很多人搞不清楚它究竟是啥&#xff0c;准备从技术的角度&#xff0c;从架构的角度&#xff0c;用通俗的语言谈谈楼主的理解。究竟啥是区块链&#xff1f;答&#xff1a;一句话&#xff0…

maven(7)生命周期和插件

【0】README1&#xff09;本文部分文字转自 “maven实战”&#xff0c;旨在 review “maven(7)生命周期和插件” 的相关知识&#xff1b;2&#xff09;maven 另外两个核心概念是生命周期和插件&#xff1a;maven的生命周期是抽象的&#xff0c;其实际行为都由插件来完成&#…

datagrid的文字换行与连续字符串换行处理,字符串三种截取方式

1 文字自动换行&#xff1a;nowrap:false 2 当时字符串&#xff0c;比如email这样的字段时&#xff0c;就需要用到字符串的拼接&#xff0c;首先&#xff0c;先贴出我解决问题的方法&#xff0c;再介绍字符串的三种拼接方式&#xff1a; 我解决问题的方法&#xff1a; {titl…

1分钟了解“区块链分叉”的本质

转载自 1分钟了解“区块链分叉”的本质 有不少朋友问&#xff0c;全球每个区块链节点都包含全部数据&#xff0c;都在最新的区块链数据上挖符合条件的区块&#xff0c;如何两个节点同时挖到新区块&#xff0c;出现数据不一致&#xff0c;该怎么办呢&#xff1f; 今天&#xff0…

sql server数据库:创建数据库、建立数据库用户、为用户赋予权限

1 使用sql创建数据库 use test go create database test2 on primary (nametest2_data, -- 主文件逻辑名filenameD:\DataSqlserver\test2_data.mdf,--物理路径size5MB,filegrowth15% ) log on (nametest2_log,filenameD:\DataSqlserver\test2_log.ldf, --日志物理文件名size…

review_core_basic_java(1)java程序设计概述

【0】README1&#xff09;本文部分文字描述转自 “core java volume 1” 旨在review “review_core_basic_java(1)java程序设计概述” 的相关知识&#xff1b;【1】 java 程序设计平台 【2】 java 白皮书的关键术语0&#xff09;intro&#xff1a;java的设计者编写了颇有影响力…

全球如何保证区块生成是匀速的?

转载自 全球如何保证区块生成是匀速的&#xff1f; 区块链有个特点&#xff1a;虽然大家都在采矿&#xff0c;但挖到矿的速度是均匀的。以承载比特币的区块链为例&#xff0c;平均每10分钟产出一个区块&#xff0c;这个速度基本是不变的。 有朋友就有疑问了&#xff0c;计算能力…

hibernate关联映射:多对一、一对一

配置对象关联关系 - 单向一对多关系 - 例如&#xff1a;班级与学生 Grade类中 public class Grade{private int gid;private String gname;private String gdesc;private Set student new HashSet();//set实现班级与学生的一对多关系 } Grade.hbm.xml中 <hibernate-m…

dom4j-cookbook

【0】README1&#xff09;本文译自http://dom4j.sourceforge.net/dom4j-1.6.1/cookbook.html 2&#xff09;intro&#xff1a; 2.1&#xff09;dom4j 是一个对象模型&#xff0c;在内存中表示一颗XML 树。dom4j 提供了易于使用的API以提供强大的处理特性&#xff0c;操纵或控制…

Spring 整合 Quartz 分布式调度

转载自 Spring 整合 Quartz 分布式调度本文旨在对 SpringQuartz 分布式调度有一个直观的了解&#xff0c;通过实际的使用来解决问题。前言为了保证应用的高可用和高并发性&#xff0c;一般都会部署多个节点&#xff1b;对于定时任务&#xff0c;如果每个节点都执行自己的定时任…

使用vo注释做一个poi导出功能

1 jsp中&#xff1a; <a href"${basePath}/manage/bulletinAction.do?methodexportMainProduct&is18th1">导出公司主营产品</a> 2 action中&#xff1a; /*** 导出主营产品*/public void exportMainProduct(ActionMapping mapping, ActionForm fo…

java_basic_review(5) java继承

【0】README1&#xff09;本文主要对 java 继承的一些 重点知识进行复习&#xff1b;2&#xff09;for source code&#xff0c; please visit java_basic_review(5)源代码3&#xff09; proj dir tree【1】super 和 this 的比较1&#xff09;this的用途&#xff1a;一是引用隐…

无监督学习的魅力

转载自 无监督学习的魅力 如果你的一大坨数据没。有。标。签&#xff0c;怎么办&#xff1f; 无监督学习是机器学习算法里非常扑朔迷离的一个类别&#xff0c;负责解决这些“没有真实值 (no-ground-truth) ”的数据。 本文会讲到&#xff0c;无监督学习到底是什么&#xff0c;和…

log4j入门实例

http://www.codeceo.com/article/log4j-usage.html

java_basic_review(5)java反射荔枝

【0】README 1&#xff09;本文旨在 review java反射荔枝&#xff1b; 【1】荔枝如下 【2】实例化Class类对象 Test // 实例化Class类对象public void testInitializeClassObject() {Class c1;Class c2;Class c3;try {c1 Demo.class; // way1.c2 new Demo().getClass(); //…

Java单链表反转

转载自 Java单链表反转 详细过程 &#xff08;一&#xff09;单链表的结点结构:  data域&#xff1a;存储数据元素信息的域称为数据域&#xff1b;  next域&#xff1a;存储直接后继位置的域称为指针域&#xff0c;它是存放结点的直接后继的地址&#xff08;位置&…