- 浏览: 961772 次
- 性别:
- 来自: 江西上饶
文章分类
- 全部博客 (460)
- p.spring (56)
- p.maven (20)
- p.ant (17)
- p.jee (18)
- p.jse (33)
- p.ofbiz (31)
- p.软件工程 (8)
- p.struts2 (5)
- p.hibernate (5)
- linux (25)
- 设计模式 (2)
- p.javascript (11)
- 硬件 (1)
- p.jsp (2)
- p.windows批处理 (1)
- 操作系统问题 (5)
- 算法 (1)
- p.mysql (7)
- p.sql (5)
- p.c (1)
- google产品 (0)
- 内存 (1)
- p.struts (1)
- p.freemarker (7)
- p.css (4)
- p.log4j (10)
- p.html (3)
- 淘宝产品 (0)
- 其他 (3)
- 编译器 (0)
- svn (4)
- p.spring.security (11)
- 图形 (0)
- p.xml (1)
- p.ssh (0)
- p.jquery (4)
- p.jdbc (3)
- p.flex (0)
- p.c++ (0)
- p.c#Net (0)
- p.assembly (0)
- p.sqlserver (0)
- p.其他 (3)
- p.webwork (21)
- p.wap (12)
- p.cglib (1)
- p.jee服务器 (11)
- windows (2)
- p.iphone (1)
- p.java.分布式与集群 (2)
- p.ibatis (16)
- p.eclipse (5)
- 架构 (2)
- http协议 (5)
- 我的个人标准 (2)
- 多线程 (1)
- 奇怪问题 (5)
- p.jira (13)
- p.httpclient (1)
- 服务器.apache (11)
- 安全防范 (1)
- p.PODAM (1)
- p.junit (16)
- fop (2)
- 硬盘安装 (1)
- powerdesigner (0)
- 单元测试 (1)
- apache commons (4)
- tomcat+apache集群 (10)
- 各类诡辩 (1)
- 安卓 (8)
- qvod (1)
- java编程基础知识考试考点及答案 (0)
- 工作总结 (4)
- oracle (0)
- spring的util工具 (3)
- json (2)
- maven (3)
- jms (19)
- p.bat (3)
- hadoop (2)
- git (3)
- nginx (1)
- p.移动开发 (1)
- shiro (3)
- 游戏破解 (1)
- react-native (7)
- ios开发 (1)
- webmagic (6)
- socks5 (1)
最新评论
-
weituotian:
说的不好,没人看的
公司系统中的菜单功能和权限功能 -
石不易:
非常详细的注解~
绑定端口和IP,Listen 与VirtualHost指令 -
spring_springmvc:
spring mvc demo教程源代码下载,地址:http: ...
spring mvc -
liyixing1:
PandaDONG 写道谢谢你啊,我已经下下来了,只是还有很多 ...
jira war安装 -
liyixing1:
PandaDONG 写道谢谢你啊,我已经下下来了,只是还有很多 ...
jira war安装
ibatis支持动态的组合sql。
包括动态元素
if
choose(when,otherwise)
trim(where,set)
foreach
ognl表达式
if
<select id=”findActiveBlogWithTitleLike”
parameterType=”Blog” resultType=”Blog”>
SELECT * FROM BLOG
WHERE state = „ACTIVE‟
<if test=”title != null”>
AND title like #{title}
</if>
</select>
<select id=”findActiveBlogLike”
parameterType=”Blog” resultType=”Blog”>
SELECT * FROM BLOG WHERE state = „ACTIVE‟
<if test=”title != null”>
AND title like #{title}
</if>
<if test=”author != null and author.name != null”>
AND title like #{author.name}
</if>
</select>
choose, when, otherwise
。和Java中的switch语句相似
<select id=”findActiveBlogLike”
parameterType=”Blog” resultType=”Blog”>
SELECT * FROM BLOG WHERE state = „ACTIVE‟
<choose>
<when test=”title != null”>
AND title like #{title}
</when>
<when test=”author != null and author.name != null”>
AND title like #{author.name}
</when>
<otherwise>
AND featured = 1
</otherwise>
</choose>
</select>
trim, where, set
看这个语句
<select id=”findActiveBlogLike”
parameterType=”Blog” resultType=”Blog”>
SELECT * FROM BLOG
WHERE
<if test=”state != null”>
state = #{state}
</if>
<if test=”title != null”>
AND title like #{title}
</if>
<if test=”author != null and author.name != null”>
AND title like #{author.name}
</if>
</select>
但是如果所有的if都不满足,那么sql就是
SELECT * FROM BLOG
WHERE
MyBatis有一个简单的处理,这在90%的情况下都会有用。而在不能使用的地方,你可以自定义处理方式。
<select id=”findActiveBlogLike”
parameterType=”Blog” resultType=”Blog”>
SELECT * FROM BLOG
<where>
<if test=”state != null”>
state = #{state}
</if>
<if test=”title != null”>
AND title like #{title}
</if>
<if test=”author != null and author.name != null”>
AND title like #{author.name}
</if>
</where>
</select>
where元素根据包含的内容来决定sql需不需要带where 如果以“AND”或“OR”开头的内容,那么就会跳过WHERE不插入。其实WHERE是trim的子类
初始化的时候,实际上等于配置了
<trim prefix="WHERE" prefixOverrides="AND |OR ">
…
trim>
<trim prefix="WHERE" prefixOverrides="AND |OR ">
…
trim>
这里trim标签文档上叙述的很模糊,大概意思是如果trim内的字符带有前缀“AND ”或者“OR ”那么去掉trim整段字符前面的where,否则添加where。
看了有吗,trim标签分为前置和后置替换,两个类似。
前置替换大概是
prefixOverrides="AND |OR "会被解析成一个List,,里面存了AND和OR
当调用前置替换时,会
。set元素可以被用于动态包含更新的列,而不包含不需更新的。比如:
<update id="updateAuthorIfNecessary"
parameterType="domain.blog.Author">
update Author
<set>
<if test="username != null">username=#{username},</if>
<if test="password != null">password=#{password},</if>
<if test="email != null">email=#{email},</if>
<if test="bio != null">bio=#{bio}</if>
</set>
where id=#{id}
</update>这里,set元素会动态前置SET关键字,而且也会消除任意无关的逗号,那也许在应用条件之后来跟踪定义的值。
foreach
另外一个动态SQL通用的必要操作是迭代一个集合,通常是构建在IN条件中的。比如:
<select id="selectPostIn" resultType="domain.blog.Post">
SELECT *
FROM POST P
WHERE ID in
<foreach item="item" index="index" collection="list"
open="(" separator="," close=")">
#{item}
</foreach>
</select>
<foreach item="item" index="index" collection="list"
open="(" separator="," close=")">
#{item}这里的item指定迭代后的对象的变量名。collection指定要迭代的对象。index指定从哪个索引开始。open是在第一个元素之前添加一个字符,separator是只在每一次迭代的时候,投会添加这个字符,close是指迭代完成后添加一个字符。
注意:当我们把一个list对象或数组对象作为参数传递的时候。batis会把他们放到一个Map中。如果是list对象,key就是字符串"list",如果是数组的话,那么key就是"array"
</foreach>
<select id="getAccounts" resultType="com.liyixing.ibatis.model.Account">
SELECT *
FROM account WHERE
<foreach collection="list" separator=" OR " item="id">ID = #{id}</foreach>
</select>
因为传入的是list集合,所以在这里,我传的集合是Integer元素集合,collection设置为list。
另外item必须要设一个,我没有设置,就报错了。
如果传入的是一个对象集合。
public List<Account> getAccounts(List<Account> ids);
<select id="getAccounts" resultType="com.liyixing.ibatis.model.Account">
SELECT *
FROM account WHERE
<foreach collection="list" separator=" OR " item="account">ID = #{account.id}</foreach>
</select>
这里的item的值我改成了account是为了符合编程规范。
ID = #{account.id}这里就是item的值.属性方式了。
包括动态元素
if
choose(when,otherwise)
trim(where,set)
foreach
ognl表达式
if
<select id=”findActiveBlogWithTitleLike”
parameterType=”Blog” resultType=”Blog”>
SELECT * FROM BLOG
WHERE state = „ACTIVE‟
<if test=”title != null”>
AND title like #{title}
</if>
</select>
<select id=”findActiveBlogLike”
parameterType=”Blog” resultType=”Blog”>
SELECT * FROM BLOG WHERE state = „ACTIVE‟
<if test=”title != null”>
AND title like #{title}
</if>
<if test=”author != null and author.name != null”>
AND title like #{author.name}
</if>
</select>
choose, when, otherwise
。和Java中的switch语句相似
<select id=”findActiveBlogLike”
parameterType=”Blog” resultType=”Blog”>
SELECT * FROM BLOG WHERE state = „ACTIVE‟
<choose>
<when test=”title != null”>
AND title like #{title}
</when>
<when test=”author != null and author.name != null”>
AND title like #{author.name}
</when>
<otherwise>
AND featured = 1
</otherwise>
</choose>
</select>
trim, where, set
看这个语句
<select id=”findActiveBlogLike”
parameterType=”Blog” resultType=”Blog”>
SELECT * FROM BLOG
WHERE
<if test=”state != null”>
state = #{state}
</if>
<if test=”title != null”>
AND title like #{title}
</if>
<if test=”author != null and author.name != null”>
AND title like #{author.name}
</if>
</select>
但是如果所有的if都不满足,那么sql就是
SELECT * FROM BLOG
WHERE
MyBatis有一个简单的处理,这在90%的情况下都会有用。而在不能使用的地方,你可以自定义处理方式。
<select id=”findActiveBlogLike”
parameterType=”Blog” resultType=”Blog”>
SELECT * FROM BLOG
<where>
<if test=”state != null”>
state = #{state}
</if>
<if test=”title != null”>
AND title like #{title}
</if>
<if test=”author != null and author.name != null”>
AND title like #{author.name}
</if>
</where>
</select>
where元素根据包含的内容来决定sql需不需要带where 如果以“AND”或“OR”开头的内容,那么就会跳过WHERE不插入。其实WHERE是trim的子类
public WhereSqlNode(Configuration configuration, SqlNode contents) { super(configuration, contents, "WHERE", "AND |OR ", null, null); }
初始化的时候,实际上等于配置了
<trim prefix="WHERE" prefixOverrides="AND |OR ">
…
trim>
<trim prefix="WHERE" prefixOverrides="AND |OR ">
…
trim>
这里trim标签文档上叙述的很模糊,大概意思是如果trim内的字符带有前缀“AND ”或者“OR ”那么去掉trim整段字符前面的where,否则添加where。
看了有吗,trim标签分为前置和后置替换,两个类似。
前置替换大概是
prefixOverrides="AND |OR "会被解析成一个List,,里面存了AND和OR
当调用前置替换时,会
//trimmedUppercaseSql是调用过String.trim和toUpperCase方法之后的字符串。 private void applyPrefix(StringBuilder sql, String trimmedUppercaseSql) { if (!prefixApplied) { prefixApplied = true; //prefixesToOverride就是解析出来的List for (String toRemove : prefixesToOverride) { //把 if (trimmedUppercaseSql.startsWith(toRemove) || trimmedUppercaseSql.startsWith(toRemove.trim())) { sql.delete(0, toRemove.trim().length()); break; } } //用前置内容替换掉开头部分 if (prefix != null) { sql.insert(0, " "); sql.insert(0, prefix); } } } private void applySuffix(StringBuilder sql, String trimmedUppercaseSql) { if (!suffixApplied) { suffixApplied = true; for (String toRemove : suffixesToOverride) { if (trimmedUppercaseSql.endsWith(toRemove) || trimmedUppercaseSql.endsWith(toRemove.trim())) { int start = sql.length() - toRemove.trim().length(); int end = sql.length(); sql.delete(start, end); break; } } if (suffix != null) { sql.append(" "); sql.append(suffix); } } }
。set元素可以被用于动态包含更新的列,而不包含不需更新的。比如:
<update id="updateAuthorIfNecessary"
parameterType="domain.blog.Author">
update Author
<set>
<if test="username != null">username=#{username},</if>
<if test="password != null">password=#{password},</if>
<if test="email != null">email=#{email},</if>
<if test="bio != null">bio=#{bio}</if>
</set>
where id=#{id}
</update>这里,set元素会动态前置SET关键字,而且也会消除任意无关的逗号,那也许在应用条件之后来跟踪定义的值。
foreach
另外一个动态SQL通用的必要操作是迭代一个集合,通常是构建在IN条件中的。比如:
<select id="selectPostIn" resultType="domain.blog.Post">
SELECT *
FROM POST P
WHERE ID in
<foreach item="item" index="index" collection="list"
open="(" separator="," close=")">
#{item}
</foreach>
</select>
<foreach item="item" index="index" collection="list"
open="(" separator="," close=")">
#{item}这里的item指定迭代后的对象的变量名。collection指定要迭代的对象。index指定从哪个索引开始。open是在第一个元素之前添加一个字符,separator是只在每一次迭代的时候,投会添加这个字符,close是指迭代完成后添加一个字符。
注意:当我们把一个list对象或数组对象作为参数传递的时候。batis会把他们放到一个Map中。如果是list对象,key就是字符串"list",如果是数组的话,那么key就是"array"
</foreach>
<select id="getAccounts" resultType="com.liyixing.ibatis.model.Account">
SELECT *
FROM account WHERE
<foreach collection="list" separator=" OR " item="id">ID = #{id}</foreach>
</select>
因为传入的是list集合,所以在这里,我传的集合是Integer元素集合,collection设置为list。
另外item必须要设一个,我没有设置,就报错了。
如果传入的是一个对象集合。
public List<Account> getAccounts(List<Account> ids);
<select id="getAccounts" resultType="com.liyixing.ibatis.model.Account">
SELECT *
FROM account WHERE
<foreach collection="list" separator=" OR " item="account">ID = #{account.id}</foreach>
</select>
这里的item的值我改成了account是为了符合编程规范。
ID = #{account.id}这里就是item的值.属性方式了。
发表评论
-
深入了解MyBatis参数
2017-05-04 21:12 396深入了解MyBatis参数 http://blog.csdn ... -
MyBatis Generator 详解
2015-08-03 14:00 767http://blog.csdn.net/isea533/ar ... -
ibatis的动态sql
2014-10-23 13:33 944位于包 com.ibatis.sqlmap.engine.ma ... -
枚举 enum
2013-12-13 17:28 2597当使用枚举时,需要使用EnumTypeHandler或者Enu ... -
mybatis generator tools配置文件解析
2012-12-20 23:28 25418这是mybatis3 generator 配 ... -
问题解决方案
2011-08-22 00:25 24261.Mapped Statements collection ... -
mybatis的参数
2011-06-16 12:36 6436在类DynamicSqlSource 方法 public Bo ... -
与spring结合
2011-05-20 21:58 1244实体省略 maping文件省略 dao接口省略 mybatis ... -
ibatis缓存
2011-05-05 16:38 4515ibatis的session缓存。做了一个测试 <?xm ... -
ibatis官方推荐目录结构
2011-05-05 13:24 1065src/com.liyixing.application.da ... -
sql映射文件
2011-04-30 22:09 2562<?xml version="1.0" ... -
配置文件
2011-04-30 20:17 1809mybatis的配置文件结构 顶级是configuration ... -
session的getMapper方法解析
2011-04-30 17:22 9648跟踪: DefaultSqlSession类 public & ... -
一个简单例子,以及基于接口,class对象调用
2011-04-30 16:59 1332应用结构: IbatisConfiguration.xm ... -
范围和声明周期(对象声明周期)
2011-04-29 23:19 1353先看mybatis用户手册中的一段代码 DataSource ...
相关推荐
本篇文章主要探讨如何利用Hibernate实现动态SQL查询,结合XML配置和FREEMARKER模板引擎来生成执行的SQL语句。 一、Hibernate简介 Hibernate作为一款强大的持久层框架,它简化了Java应用程序与数据库之间的交互。...
标题中的“Kettle循环执行动态SQL”指的是使用Pentaho Data Integration(Kettle)工具来设计数据集成工作流,其中包含动态生成并执行SQL语句的步骤。在数据处理和ETL(Extract, Transform, Load)过程中,动态SQL是...
### 动态SQL 并且把返回的值赋给变量 在SQL Server中,动态SQL是一种强大而灵活的工具,允许开发人员根据运行时条件构建并执行SQL查询。本文将详细介绍如何利用`sp_executesql`来执行动态SQL,并重点讨论如何将执行...
静态、动态SQL及各种游标 静态SQL和动态SQL是两种不同的SQL语句执行方式,分别应用于不同的场景中。静态SQL是指在PL/SQL中直接运行的SQL语句,没有什么特别之处。动态SQL则是指利用EXECUTE IMMEDIATE语句执行的SQL...
Gbase8s 动态 SQL 介绍 Gbase8s 动态 SQL 介绍 在 Gbase8s 中,动态 SQL 是一种特殊的 SQL 语句形式,它可以在执行时动态改变 SQL 语句的内容,不需要预先知道每个 SQL 语句的确切内容。与静态 SQL 不同,静态 SQL...
在实际开发过程中,我们往往需要编写复杂的SQL语句,拼接稍有不注意就会导致错误,Mybatis给开发者提供了动态SQL,大大降低了拼接SQL导致的错误。 动态标签 if标签 if标签通常用那个胡where语句,update语句,insert...
### 本地动态SQL的开发 #### 一、动态SQL的概念 动态SQL是在程序运行时构建并执行的SQL语句,其内容无法在编译时完全确定。与静态SQL(如常见的`UPDATE`语句)不同,动态SQL允许开发者在运行时根据实际情况构建...
SQL Server 动态 SQL 语句的用法 SQL Server 中的动态 SQL 语句是一种灵活的查询方式,它可以根据不同的情况生成不同的 SQL 语句。动态 SQL 语句可以用来实现复杂的业务逻辑,提高查询效率和灵活性。 普通 SQL ...
动态 SQL 是 MyBatis 的一大特色,它允许我们在运行时根据条件构建 SQL 语句,极大地提高了代码的可维护性和灵活性。 动态 SQL 在 MyBatis 中主要通过 XML 映射文件或者注解来实现。在 XML 映射文件中,我们可以...
### DB2游标及动态SQL详解 #### 一、DB2游标概念与使用 **1.1 游标简介** 在DB2中,游标是一种用于遍历查询结果集的强大工具。它允许用户一行一行地处理数据,这对于需要逐行处理数据的应用场景非常有用。游标通常...
iBatis动态SQL标签用法 iBatis是Java持久层框架,提供了动态SQL标签来实现动态查询。动态SQL标签可以根据不同的条件生成不同的SQL语句,从而提高查询效率和灵活性。 动态SQL片段 iBatis提供了动态SQL片段的功能,...
动态SQL与绑定变量是数据库编程中的重要概念,尤其在Oracle数据库中被广泛应用。动态SQL允许在运行时构建和执行SQL语句,而绑定变量则是在动态SQL中用于替代具体值的占位符,使得SQL语句更为灵活和高效。 ### 1. ...
本文将深入探讨如何在Kettle中实现动态SQL查询,这对于处理复杂的数据库操作和数据迁移至关重要。我们将讨论问号占位符和命名参数这两种方法,并分析它们的区别。 首先,让我们理解什么是动态SQL查询。在传统的SQL...
mybatis动态sql 1.什么是动态SQL? Mabits是一个Java持久化框架,它提供了动态SQL的功能。动态SQL是一种根据不同条件动态生成SQL语句的技术。在Mabits中,动态SQL通常是通过使用一组特殊的标签和代码块来实现的,...
SQL(Structured Query Language)是用于管理和操作...综上所述,掌握SQL语句和动态SQL的基本语法对于任何IT从业者来说都至关重要,无论是数据库管理员还是开发者,都需要熟练运用这些技能来高效地操作和管理数据库。
在SQL世界中,动态SQL(Dynamic SQL)是一种强大的技术,特别是在复杂的数据库操作和程序设计中。在Microsoft SQL Server(MSSQL)环境下,掌握动态SQL的基本语法是提升SQL编程能力的关键。下面,我们将深入探讨动态...
本篇将详细讲解如何利用这些技术来生成动态SQL。 首先,SpringBoot是Spring框架的一个轻量级版本,它简化了配置,提供了一种快速开发全新Spring应用的方式。SpringBoot集成了大量的常用库,如数据访问、安全、缓存...
### Oracle中动态SQL详解 #### 一、动态SQL概述与特点 在Oracle数据库中,动态SQL是一种非常重要的技术,尤其对于开发人员来说更是必不可少的一部分。动态SQL是指在运行时构建并执行的SQL语句,与静态SQL(在编译...
“hibernate增删改查和动态sql”这个标题涵盖了两个主要的Hibernate使用场景。首先,"增删改查"(CRUD操作)是任何数据库操作的基础,包括创建(Create)、读取(Read)、更新(Update)和删除(Delete)。在...