IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 四、动态sql -> 正文阅读

[大数据]四、动态sql

四、动态sql

1、动态sql概述
  • 动态 SQL 是 MyBatis 的强大特性之一
  • 使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦
2、if和where标签
  • StudentMapper.java

        /**
         * 携带那个条件就根据那个条件查询
         */
        public List<Student> getStudentByCondition(Student stu);
    
  • StudentMapper.xml

        <select id="getStudentByCondition" resultType="day01.domain.Student">
            select
                id,studentName name,gender
            from
                tbl_student
            <where>
                <if test="id != null">
                    and id = #{id}
                </if>
                <if test="name != null &amp;&amp; name != ''">
                    and studentName like #{name}
                </if>
                <if test="gender != null &amp;&amp; gender != ''">
                    and gender like #{gender}
                </if>
            </where>
        </select>
    
3、trim标签
  • StudentMapper.java

        /**
         * 使用trim标签查询学生信息
         */
        public List<Student> getStudentByTrim(Student stu);
    
  • StudentMapper.xml

    <!--    trim : 用来自定义where标签或set标签的功能-->
    <!--        prefix : 会在拼接完成的sql语句前面加上某一字段-->
    <!--        prefixOverrides : 会在拼接完成的sql语句前面去掉某一字段-->
    <!--        suffix : 会在拼接完成的sql语句后面加上某一字段-->
    <!--        suffixOverrides : 会在拼接完成的sql语句后面删除某一字段-->
        <select id="getStudentByTrim" resultType="day01.domain.Student">
            select id,studentName name,gender from tbl_student
            <trim prefix="where" suffixOverrides="and">
                <if test="id != null">
                     id = #{id} and
                </if>
                <if test="name != null &amp;&amp; name != ''">
                     studentName like #{name} and
                </if>
                <if test="gender != null &amp;&amp; gender != ''">
                     gender like #{gender} and
                </if>
            </trim>
        </select>
    
4、choose标签
  • StudentMapper.java

        /**
         * 测试choose标签,类似于加上break关键字的switch-case语句
         */
        public List<Student> getStudentByChoose(Student stu);
    
  • StudentMapper.xml

        <select id="getStudentByChoose" resultType="day01.domain.Student">
            select id,studentName name,gender from tbl_student
            <where>
                <choose>
                    <when test="id != null">
                        and id = #{id}
                    </when>
                    <when test="name != null">
                        and studentName like #{name}
                    </when>
                    <when test="gender != null">
                        and gender like #{gender}
                    </when>
                    <otherwise>
                        1 = 1
                    </otherwise>
                </choose>
            </where>
        </select>
    
5、set标签
  • StudentMapper.java

        /**
         * 测试set标签
         */
        public void setStudentBySet(Student stu);
    
  • StudentMapper.xml

        <update id="setStudentBySet">
            update tbl_student
            <set>
                <if test="name != null">
                    studentName = #{name},
                </if>
                <if test="gender != null">
                    gender = #{gender}
                </if>
            </set>
            <where>
                id = #{id}
            </where>
        </update>
    
6、foreach标签
  • StudentMapper.java

        /**
         * 测试foreach标签
         */
        public List<Student> getStudentByForeach(@Param("ids") List<Integer> ids);
    
        /**
         * 使用foreach标签完成批量添加
         */
        public Integer insertStudentByForeach(@Param("stus") List<Student> stus);
    
  • StudentMapper.xml

        <select id="getStudentByForeach" resultType="day01.domain.Student">
            select id,studentName name,gender from tbl_student where id in
            <foreach collection="ids" item="id" separator="," open="(" close=")">
                #{id}
            </foreach>
        </select>
    
    <!--    public Integer insertStudentByForeach(@Param("stus") List<Student> stus);-->
    <!--    方式一: MySql支持 insert into table() values(),()-->
        <insert id="insertStudentByForeach">
            insert into tbl_student(studentName,gender,classId)
            values
            <foreach collection="stus" item="stu" separator=",">
                (#{stu.name},#{stu.gender},#{stu.clazz.id})
            </foreach>
        </insert>
    <!--    方式二: 需要开启Mysql的一个数据库连接属性allowMultiQueries 看 jdbc.properties文件 -->
    <!--        这种使用;分割的不仅可以使用批量添加,同样也可以使用其他批量操作(删除,修改)-->
    <!--    <insert id="insertStudentByForeach">-->
    <!--        <foreach collection="stus" item="stu" separator=";">-->
    <!--            insert into tbl_student(studentName,gender,classId)-->
    <!--            values(#{stu.name},#{stu.gender},#{stu.clazz.id})-->
    <!--        </foreach>-->
    <!--    </insert>-->
    
7、bind标签
  • StudentMapper.java

        /**
         * 测试bind标签,用来转换属性,具体看案例
         */
        public List<Student> getStudentBind(Student stu);
    
  • StudetnMapper.xml

        <select id="getStudentBind" resultType="day01.domain.Student">
            <bind name="_name" value="'_'+name+'%'"/>
            select id,studentName name,gender from tbl_student where studentName like #{_name}
        </select>
    
8、sql标签
  • sql标签示例

    	  <!-- 
    	  	抽取可重用的sql片段。方便后面引用 
    	  	1、sql抽取:经常将要查询的列名,或者插入用的列名抽取出来方便引用
    	  	2、include来引用已经抽取的sql:
    	  	3、include还可以自定义一些property,sql标签内部就能使用自定义的属性
    	  			include-property:取值的正确方式${prop},
    	  			#{不能使用这种方式}
    	  -->
    	  <sql id="insertColumn">
    	  		<if test="_databaseId=='oracle'">
    	  			employee_id,last_name,email
    	  		</if>
    	  		<if test="_databaseId=='mysql'">
    	  			last_name,email,gender,d_id
    	  		</if>
    	  </sql>
    
  • 引用sql标签示例 include标签

    		<!-- 引用外部定义的sql -->
    	 		<include refid="insertColumn">
                    <!--可以自定义一个列,弥补sql标签不足的列-->
    	 			<property name="testColomn" value="abc"/>
    	 		</include>
    
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-10-16 19:42:31  更:2021-10-16 19:43:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:39:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码