mybatis常用静态sql和动态sql

文章目录

  • mybatis常用静态sql和动态sql
    • 静态sql
      • 1.select 标签
      • 2.insert, update 和 delete
      • 3.sql标签
    • 动态sql
      • 1.foreach(循环)
      • 2.if标签(逻辑判断)
      • 3.where标签(SQL判断"where+if")
      • 4.choose,when,otherwise(Java中的switch)
      • 5.trim 语句
      • 6.[CDATA[ ]] 标签

静态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 t1cross 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 表示在迭代过程中每次迭代到的位置(下标)
collection collection属性的值有三个分别是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>

sql语句和动态sql语句相关推荐

  1. Mybatis中XML的文件SQL语句与动态sql标签(trim|where|set|foreach|if|choose|when|otherwise|bind)

    在xml中写sql语句有很多的规范.标准,有时候想要找对应的例子还得翻一翻以前的代码,这里干脆对遇到的情况做个记录. 一,新建XML文件 <?xml version="1.0" ...

  2. 哈工大数据库系统(上):嵌入式SQL语言之动态SQL(十)课后测验与作业

    文章目录 前引 第十章课后习题 前引 关于这部分 我的JDBC基本上没怎么听 都跳过了 - - 因为真的记不住 不是叫记不住吧 是因为我现在连基本的连接 数据库操作都没有怎么练 就开始到嵌入式的语言 ...

  3. MyBatis 一个动态sql的问题(动态SQL基于OGNL表达式)<if test=“state == ‘0‘“>单个的字符要使用双引号,改为<if test=‘state == “1“‘>或

    MyBatis 一个动态sql的问题(动态SQL基于OGNL表达式) <if test="state == '0'"> 单个的字符要使用双引号,改为<if tes ...

  4. oracle 带有变量的语句_Oracle 动态SQL语句(2)之含变量的WHERE语句与日期变量

    在 Oracle 动态SQL语句(1)中提到基本动态SQL语句书写,但在写动态SQL语句时特别要注意日期型变量和WHERE语句的编写. 如下代码: 1.注意在执行动态SQL语句时,execute im ...

  5. oracle怎么优化动态sql语句,oracle动态sql语句处理

    动态SQL语句处理:根据要处理的sql语句的作用不同,可以使用三种不同类型的动态sql方法:使用execute immediate语句可以处理包括ddl(create.alter和drop).DCL( ...

  6. 嵌入式sql语句oracle,第十讲 嵌入式SQL语言之动态SQL

    动态SQL的概念 静态SQL特点:SQL语句在程序中已经按要求写好,只需要把一些参数通过变量(高级语言程序语句中不带冒号) 传送给嵌入式SQL语句即可(嵌入式SQL语句中带冒号) 例如: SpecNa ...

  7. oracle 执行带参数的sql语句_Oracle动态SQL语句的简单执行

    在使用ODP.NET进行Oracle编程时,有时候SQL语句非常复杂,需要采用动态构造查询语句的情况,有两种方法可以构造动态的SQL语句,并执行返回结果集. 1.在数据访问层构造SQL语句 例如下面的 ...

  8. Mysql动态sql之mybatis动态sql

    mysql动态sql想必大家都了解了 举个列子:现在有如下sql语句 select id,name from animals where id = 1 and name ="老虎" ...

  9. java回顾:MyBatis参数、sql片段、动态sql、高级查询

    目录 一.MyBatis参数 SqlSessiong工具类 1.映射文件配置-入参 1.1 parameterType入参 1.2 单个入参,变量名任意定义: 1.3 多个入参,解决方案: 1.4 p ...

最新文章

  1. 主席树 ---- CF 1422F. Boring Queries(由离线推出在线如何求的 ,求解多次询问的区间LCM)
  2. Java I/O系统学习系列二:输入和输出
  3. python opencv 界面按钮_PyAutoGUI:自动化键鼠操作的Python类库
  4. qt 背景和控件布局_Qt控件背景图片设置总结
  5. 九阴真经 第十五层--node.js 第1天
  6. python处理xml文件_Python解析并修改XML文件
  7. thinkphp 模板 php函数调用,thinkphp模版调用函数方法
  8. mac 使用 pf 做端口转发
  9. [HDU4585]Shaolin
  10. ubuntu tftp服务器搭建
  11. TCP和UDP以及IP报文格式
  12. app测试比相比web测试需要注意的点
  13. 如何进行网站流量分析?你需要知道这些指标
  14. 如何利用VSCode书写Latex并进行编译
  15. mysql插入数据的时候出错_毕设问题小记——Mysql插入数据时出错
  16. 微信小程序实现旋转动画效果
  17. Android#studio@快捷键
  18. 课程设计:简单计算器的实现
  19. java中BitSet详解
  20. 存储过程 输入输出参数

热门文章

  1. 再也不要相信你的眼睛:步步逼近的AI换脸术
  2. dxc 1.0 多线程详解
  3. 软件工程工程伦理案例分析_案例工具及其范围| 软件工程
  4. 【NRF51822】百度手环开源源码分析--底层通讯部分
  5. [Unity优化]减少顶点数目
  6. 如何将不同情况下的List带到SQL中进行判断操作
  7. vue按钮点击事件不传递到父控件
  8. MOS逻辑门(反相器/与门/或门/或非门/与非门)
  9. JavaScript知识点 总结二:
  10. 登录一粒云客户端时,登录提示“用户名错误”是什么原因?