`

mybatis 学习笔记(三)动态SQL

 
阅读更多
MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑。主要标签有


if
choose(when,otherwise)
trim
where
set
foreach



(一)if就是简单的条件判断语句 例如下代码


<select id="queryIFTest"  parameterType="com.lql.study.model.Person" resultMap="resultListPerson">
      select * from  person where 1=1
      <if test="name!=null">
         and name=#{name}
      </if>
       <if test="sex!=null">
         and sex=#{sex}
      </if>
      <if test="age!=null">
         and age>=#{age}
      </if>
    </select>



(二)上面这段代码发现 因为要拼接 条件 所在加上了1=1这样子的条件,其实可以换一个标签更灵活的使用,where语句的作用主要是简化SQL语句中where中的条件判断 它可以智能的去掉条件里的 and或者or 例如下代码

<select id="queryWhereTest"  parameterType="com.lql.study.model.Person" resultMap="resultListPerson">
      select * from  person 
      
      <where>
      <if test="name!=null">
          name=#{name}
      </if>
       <if test="sex!=null">
         and sex=#{sex}
      </if>
      <if test="age!=null">
         and age>=#{age}
      </if>
      
      </where>
    </select>



(三)
choose元素的作用就相当于JAVA中的switch语句,基本上跟JSTL中的choose的作用和用法是一样的只选择其中一个条件执行,通常都是与when和otherwise搭配的。看如下一个例子:

<select id="queryChooseTest"  parameterType="com.lql.study.model.Person" resultMap="resultListPerson">
      select * from  person where 1=1
      
      <choose>
      <when test="name!=null">
         and name=#{name}
      </when>
       <when test="sex!=null">
         and sex=#{sex}
      </when>
      <when test="age!=null">
         and age=#{age}
      </when>
      
      </choose>
    </select>



(四)trim标识为格式化标识,可以更灵活的去处多余关键字的标签,以及与其他标识完成where和set的功能

prefix  当前缀有 
suffix  当后缀有  
prefixOverrides 自动判断前置  
suffixOverrides 自动判断后置
看例子吧比较清楚一些

 <select id="queryTrimTest"  parameterType="com.lql.study.model.Person" resultMap="resultListPerson">
      select * from  person 
      
      <trim prefix="where" prefixOverrides="and |or">
      <if test="name!=null">
          name=#{name}
      </if>
       <if test="sex!=null">
         or sex=#{sex}
      </if>
      <if test="age!=null">
         and age>=#{age}
      </if>
      
      </trim>
    </select>



上面这段代码的意思是:当WHERE后紧随AND或则OR的时候,就去除AND或者OR。 除了WHERE以外, 其实还有一个比较经典的实现,那就是SET。




(五)
set元素主要是用在更新操作的时候,它的主要功能和where元素其实是差不多的,主要是在包含的语句前输出一个set,然后如果包含的语句是以逗号结束的话将会把该逗号忽略,如果set包含的内容为空的话则会出错。有了set元素我们就可以动态的更新那些修改了的字段。下面是一段示例代码:


 <update id="testSetPerson" parameterType="com.lql.study.model.Person" >
        update person 
        <set>
        <if test="name!=null">
          name=#{name},
       </if>
       <if test="sex!=null">
         sex=#{sex},
      </if>
      <if test="age!=null">
         age>=#{age},
       </if>
       <if test="remark!=null">
         remark>=#{remark},
       </if>
        </set>
        
        where pid=#{pid}
        
    </update>
    




(六)
foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有item,index,collection,open,separator,close。item表示集合中每一个元素进行迭代时的别名,index指定一个名字,用于表示在迭代过程中,每次迭代到的位置,open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔符,close表示以什么结束,在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的,主要有一下3种情况:
如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在MyBatis里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key。

看下面两个例子一个是单参数,一个是多参数例子

1.单参数
 <select id="queryForeachTest"  parameterType="com.lql.study.model.Person" resultMap="resultListPerson">
      select * from  person where age in
      <foreach collection="list" index="index" item="item" open="(" separator="," close=")">  
        #{item}  
    </foreach>  
    </select>


public void queryForeachTest(List<Integer>ages) 
	{
		SqlSession session = sessionFactory.openSession();
		 IPersonOption op=session.getMapper(IPersonOption.class);
		 List<Person> ps=op.queryForeachTest(ages);
		 if(ps.size()>0)
		 {
			 for(int i=0;i<ps.size();i++)
			 {
				 System.out.println(ps.get(i).getName()+","+ps.get(i).getSex()+" ,"+ps.get(i).getAge());
			 }
		 }
		 session.close();
	}

2.多参数
 <select id="queryForeachTest2"  parameterType="com.lql.study.model.Person" resultMap="resultListPerson">
      select * from  person where sex=#{sex} and age in
      <foreach collection="ages" index="index" item="item" open="(" separator="," close=")">  
        #{item}  
    </foreach>  
    </select>



1)实现方法


public void queryForeachTest2(Map<String, Object> params) 
	{
		SqlSession session = sessionFactory.openSession();
		 IPersonOption op=session.getMapper(IPersonOption.class);
		 
		 List<Person> ps=op.queryForeachTest2(params);
		 if(ps.size()>0)
		 {
			 for(int i=0;i<ps.size();i++)
			 {
				 System.out.println(ps.get(i).getName()+","+ps.get(i).getSex()+" ,"+ps.get(i).getAge());
			 }
		 }
		 session.close();
	}


2)调用代码
ArrayList<Integer> ages=new ArrayList <Integer>();
			ages.add(35);
			ages.add(18);
			 Map<String, Object> params = new HashMap<String, Object>();
			 params.put("ages", ages);
			 params.put("sex", "女");
			 test.queryForeachTest2(params);
			 

分享到:
评论

相关推荐

    Mybatis学习笔记之动态SQL揭秘

    主要给大家介绍了关于Mybatis学习笔记之动态SQL的相关资料,小编觉得挺不错的,对大家学习或者使用Mybatis会有一定的帮助,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    Mybatis学习笔记整合架构

    Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将...

    Mybatis 学习笔记——原生DAO实现数据增删改查SQL

    Mybatis 学习笔记——原生DAO实现数据增删改查SQL:https://blog.csdn.net/qq_24598601/article/details/83037252

    MyBatis学习笔记

    介绍MyBatis框架的搭建,增删改查、动态SQL的使用,MyBatis与Spring的整合

    mybatis学习笔记资料

    MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 ...

    Mybatis学习笔记大全.docx

    MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了google code,并且改名为MyBatis。2013年11月迁移到Github。 iBATIS一词来源于“internet”和“abatis”的组合,是一个...

    MyBatis3学习笔记.pdf

    所传资源为实训的Mybatis零基础入门笔记,非常适合现学现用的开发者。 MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎 所有的 JDBC 代码以及设置参数和获取结果集的...

    mybatis学习笔记

    4.4 动态sql(重点) 37 4.4.1 If 37 4.4.2 Where 38 4.4.3 foreach 38 4.4.4 Sql片段 43 5 关联查询 44 5.1 商品订单数据模型 45 5.2 一对一查询 45 5.2.1 方法一: 46 5.2.2 方法二: 48 5.3 一对多查询 50 5.3.1 ...

    Mybatis(学习笔记):入门项目创建流程

    MyBatis 是一款优秀的持久层框架:它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 ...

    javaMybatis个人整理(印象笔记导入即可)

    Mybatis 通过 xml 或注解的方式将要执行的各种 statement 配置起来,并通过 java对象和 statement 中 sql 的动态参数进行映射生成最终执行的 sql 语句,最后由 Mybatis框架执行 sql 并将结果映射为 java 对象并返回...

    mybatis-md笔记.zip

    MyBatis-MD笔记是一种结合了MyBatis和Markdown技术的学习和记录方式,旨在帮助开发者更有效地学习和理解MyBatis框架,并将所学知识以文档形式记录下来。这种学习方法将技术和文档相结合,具有极大的灵活性和可读性,...

    Mybatis笔记.zip

    MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。... 本文档包含了Mybatis的基础学习课件与笔记标注。

    MyBatis学习导图和资源

    有关Mybaits的学习路线与知识点,压缩包中有相关word文档(尚硅谷的学习笔记),含有相关的源代码(模块使用了父子关系),使用了maven工程的创建方式,mysql数据库,idea开发工具。 含有Mybaits官网中的使用手则。 ...

    MyBatis框架学习笔记

    在学习MyBatis时自己记的笔记,内容涉及环境搭建、操作数据库、核心配置文件、获取参数的方式、各种查询功能、以及特殊的SQL如何执行、怎么自定义ResultMap、动态SQL、MyBatis的缓存机制、逆向工程、以及分页插件等...

    Spring整合Mybatis与SpringBoot整合Mybatis原理分析

    一个完整而简单SSM项目,包含SQL脚本、代码与学习笔记。内容Spring如何整合SpringMVC与Mybatis以及整合原理的源码分析。

    MyBatis第一天课堂笔记.docx

    1 Mybatis第一天课堂笔记 学习过的持久层框架:DBUtils , Hibernate Mybatis就是类似于hibernate的orm持久层框架。 为什么学Mybatis? 1. 目前最主流的持久层框架为hibernate与mybatis,而且国内目前情况使用...

    mybatis-learnling

    不定时进行调整和补充,需要关注更新的请 Watch、Star、Fork如果你只是单纯要阅读的话,建议移步 CSDN 或者 oschina 上观看,访问速度快很多:CSDN:oschina:目录mybatis学习笔记(8)-动态sql.mdmybatis学习笔记(9)-...

    day01_eesy_01mybatis.zip

    学习笔记——mybatis的起步(1) 1.什么是框架? 他是我们软件开发中的一套解决方案,不同的框架解决的是不同的问题。 使用框架的好处: 框架封装了很多的细节,使开发者可以使用极简的方式实现功能。大大提高...

Global site tag (gtag.js) - Google Analytics