sql语句和动态sql语句

mybatis常用静态sql和动态sql

静态sql

1.select 标签
<select id="selectPeople" parameterType="int" resultType="hashmap">
   SELECT * FROM PERSON WHERE ID = #{id}
 </select>

这个语句被称作 selectPople,接受一个 int(或 Integer)类型的参数,并返回一个 HashMap 类型的对象,其中的键是列名,值便是结果行中的对应值。

注意参数符号:#{id} 这就告诉 MyBatis 创建一个预处理语句参数,在 JDBC 中,这样的一个参数在 SQL 中会由一个“?”来标识,并被传递到一个新的预处理语句中。

属性介绍:

属性描述
id在命名空间中唯一的标识符,可以被用来引用这条语句。
parameterType将会传入这条语句的参数类的完全限定名或别名。
parameterMap这是引用外部 parameterMap 的已经被废弃的方法。请使用内联参数映射和 parameterType 属性。
resultType从这条语句中返回的期望类型的类的完全限定名或别名。 注意如果返回的是集合,那应该设置为集合包含的类型,而不是集合本身。可以使用 resultType 或 resultMap,但不能同时使用。
resultMap外部 resultMap 的命名引用。结果集的映射是 MyBatis 最强大的特性,如果你对其理解透彻,许多复杂映射的情形都能迎刃而解。可以使用 resultMap 或 resultType,但不能同时使用。

只列举了经常常用的,还有其他没有列举的,都可以百度得到…

2.insert, update 和 delete

数据变更语句 insert,update 和 delete 的实现非常接近:

//insert标签
<insert id="insertUser" parameterType="com.hd.beans.User">
    INSERT INTO user VALUES(null,#{username},#{userpassword},#{balance},#{grgisterdate})
</insert>

//delete标签<delete id="deleteUserById" parameterType="Integer">
    DELETE FROM user WHERE id = #{id}
</delete>

//update标签
<update id="updateUser" parameterType="com.hd.beans.User">
    UPDATE user SET username = #{username} WHERE id = #{id}
</update>
属性描述
id命名空间中的唯一标识符,可被用来代表这条语句。
parameterType将要传入语句的参数的完全限定类名或别名。这个属性是可选的,因为 MyBatis 可以通过类型处理器推断出具体传入语句的参数,默认值为未设置(unset)。
parameterMap这是引用外部 parameterMap 的已经被废弃的方法。请使用内联参数映射和 parameterType 属性。

同样的,只是添加一些经常用的比较多的。

3.sql标签

这个元素可以被用来定义可重用的 SQL 代码段,这些 SQL 代码可以被包含在其他语句中。它可以(在加载的时候)被静态地设置参数。 在不同的包含语句中可以设置不同的值到参数占位符上。比如:

<sql id="user"> ${alias}.id,${alias}.username,${alias}.password </sql>
 <select id="selectUsers" resultType="map">
   select
     <include refid="user"><property name="adidas" value="t1"/></include>,
     <include refid="user"><property name="adidas" value="t2"/></include>
   from some_table t1
     cross join some_table t2
 </select>

动态sql

  • Mybatis 动态 SQL ,可以让我们在 XML 映射文件内,以 XML 标签的形式编写动态 SQL ,完成逻辑判断和动态拼接 SQL 的功能。
1.foreach(循环)

主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。

<select id="collectionTest" resultType="User">
  select * from user where id in
  <foreach collection="array" index = "index" item="us" open="(" separator="," close=")" >
    #{us}
  </foreach>
</select>

foreach元素的属性主要有item,index,collection,open,separator,close。

属性描述
item表示在迭代过程中每一个元素的别名
index表示在迭代过程中每次迭代到的位置(下标)
collectioncollection属性的值有三个分别是list、array、map三种,分别对应的参数类型为:List、数组、map集合
open前缀
separator分隔符,表示迭代时每个元素之间以什么分隔
close后缀
2.if标签(逻辑判断)
  • 成立就执行,不成立就不执行
  • 通常用于WHERE语句中,通过判断参数值来决定是否使用某个查询条件, 他也经常用于UPDATE语句中判断是否更新某一个字段,还可以在INSERT语句中用来判断是否插入某个字段的值
<select id="selectbyName" resultType="user">
	select * from user where 1=1
	<if test="accin!=null and accin!=''">
		and name = #{accin}
	</if>
	<if test="accout!=null and accout!=''">
		and sex = #{accout}
	</if>
</select>
3.where标签(SQL判断"where+if")
  • where元素的作用是给SQL语句添加一个条件判断. 如果输出后是and 开头的,MyBatis会把第一个and忽略,当然如果是or开头的,MyBatis也会把它忽略;此外,在where元素中你不需要考虑空格的问题,MyBatis会智能的帮你加上.
  • 如果 中有内容会生成where关键字,如果没有内容不生成where关键字
<select id="selectUser" resultType="user" parameterType="com.hd.pojo.User">
    select * from user
    <where>
        <if test="username != null">
           username=#{username}
        </if> 
        <if test="sex!= null">
           and sex=#{sex}
        </if>
    </where>
</select>
4.choose,when,otherwise(Java中的switch)
  • 只要有一个成立,其他都不执行
  • 这里我们有三个条件,id,username,sex,只能选择一个作为查询条件
<select id="selectUser" resultType="com.hd.pojo.User" parameterType="com.hd.pojo.User">
      select * from user
      <where>
          <choose>
              <when test="id!='' and id!= null">
                  id=#{id}
              </when>
              <when test="username !='' and username != null">
                  and username=#{username}
              </when>
              <otherwise>
                  and sex=#{sex}
              </otherwise>
          </choose>
      </where>
  </select>

如果 id 不为空,那么查询语句为:select * from user where id=?
如果 id 为空,那么看username 是否为空,如果不为空,那么语句为 select * from user where username=?;
如果 username 为空,那么查询语句为 select * from user where sex=?

5.trim 语句
  • trim标记是一个格式化的标记,可以完成set或者是where标记的功能
<select id="selectUser" resultType="user" parameterType="com.hd.pojo.User">
        select * from user
        <trim prefix="where" prefixOverrides="and | or">
            <if test="username != null">
               and username=#{username}
            </if>
            <if test="sex != null">
               and sex=#{sex}
            </if>
        </trim>
    </select>

trim元素的属性主要有prefix ,suffix ,prefixOverrides ,suffixOverrides 。

属性描述
prefix在前面添加内容
suffix在后面添加内容
prefixOverrides去掉前面内容
suffixOverrides去掉后面内容
6.[CDATA[ ]] 标签
  • 在mybatis的xml文件中需要写一些特殊字符 如 > < & 这些字符在xml解析的时候会被转义,但是我们不希望它被转义,这时候就可以使用<![CDATA[ ]]>来解决问题。

<![CDATA[ ]]> 是什么,这是XML语法。在CDATA内部的所有内容都会被解析器忽略。

<select id="fingdById" parameterType="java.util.HashMap" resultMap="user">
<![CDATA[
SELECT Id,name,sex FROM userinfo WHERE 1=1 AND newsday > #{startTime} AND newsday <= #{endTime}
]]>
<if test="username!=''">
AND username=#{username}
</if>
</select>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值