动态sql

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的子类

  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。
[b]另外item必须要设一个,我没有设置,就报错了。[/b]
如果传入的是一个对象集合。
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的值.属性方式了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以来的短板,有效的提升管理的效率和业务水平。传统的管理模式,时间越久管理的内容越多,也需要更多的人来对数据进行整理,并且数据的汇总查询方面效率也是极其的低下,并且数据安全方面永远不会保证安全性能。结合数据内容管理的种种缺点,在互联网时代都可以得到有效的补充。结合先进的互联网技术,开发符合需求的软件,让数据内容管理不管是从录入的及时性,查看的及时性还是汇总分析的及时性,都能让正确率达到最高,管理更加的科学和便捷。本次开发的医院后台管理系统实现了病房管理、病例管理、处方管理、字典管理、公告信息管理、患者管理、药品管理、医生管理、预约医生管理、住院管理、管理员管理等功能。系统用到了关系型数据库中王者MySql作为系统的数据库,有效的对数据进行安全的存储,有效的备份,对数据可靠性方面得到了保证。并且程序也具备程序需求的所有功能,使得操作性还是安全性都大大提高,让医院后台管理系统更能从理念走到现实,确确实实的让人们提升信息处理效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值