MyBatis的sql常用语句

前言

    好久没写了,之前的一些心得都是写在自己的笔记上,但是有交流才有提升嘛,所以决定以后有心得的话还是多写在博客上好一些。本人在公司实习的时候需要使用SSM框架,有时会写一些sql映射语句,之前虽然写过一些,但都是零零散散的,所以决定系统地书写一些常用的语句,留作总结。

常用的sql语句写法

    sql映射语句的传入参数可以是基本数据类型,也可以是一个对象类型,当然也可以是数组或者容器类型。
    (1)当输入参数是单个基本数据类型时
<delete id="statement1" parameterClass="long" returnClass="long">
    <![CDATA[
        delecte * from table1 where column1=#value#
    ]]>
</delete>

    注:如果直接使用><的话,必须使用转义的字符(&lt;和&gt;),否则会被当做“尖括号”而不是“大于小于”,或者使用<![CDATA[xxx]]>的形式,也可以使><是大于小于。

    (2)当输入是一个对象的时候(假设这里有一个javaBean,里面包含一些字段,以及getter和setter,以及已经搭建好mybatis环境)

<select id="statement2" parameterClass="testBean">
        <![CDATA[
            SELECT column1,column2
                FROM table1
                WHERE column1=#field1#
        ]]>
        <isNotEmpty prepend="AND" property="field2">
            <![CDATA[
                column2=#field2#
            ]]>
        </isNotEmpty>
    </select>

    (3)当输入参数中包含数组时(如果输入中包含数组,需要使用循环标签)

<select id="statement3" parameterClass="testBean" returnClass="testBean">
        <![CDATA[
            SELECT column1,column2
                FROM table1
                WHERE column1=#field1#
        ]]>
        <isNotEmpty prepend="AND" property="field2">
            <![CDATA[
                column2=#field2#
            ]]>
        </isNotEmpty>
            <![CDATA[
                AND value in
            ]]>
        <isNotNull property="cycle">
            <iterate property="cycle" open="(" close=")" conjunction=",">
                #cycle[]#
            </iterate>
        </isNotNull>
    </select>

字段说明:isNotNull标签可以防止数组是null的时候导致出错,而cycle则是传入的数组参数的名字。

    (4)当传入参数只有一个数组时(没有其他参数)

<select id="statement4" returnClass="testBean">
        <![CDATA[
            SELECT column1,column2
                FROM table1
        ]]>
        <dynamic prepend="where value in">
            <iterate open="(" close=")" conjunction=",">
                #[]#
            </iterate>
        </dynamic>
    </select>

字段说明:dynamic可以确保,当数组为空时,where语句不必存在,因此不会出错。

    (5)当传入的参数是一个Map时(这里以最常用的HashMap为例)

<select id="statement5" parameterClass="hashMap" returnMap="getTheReturnMap">
        <![CDATA[
            SELECT column1,column2
                FROM table1
                WHERE column1=#field1#
        ]]>
        <isNotEmpty prepend="AND" property="startTime">
            <![CDATA[
                start_time >= #startTime#
            ]]>
        </isNotEmpty>
    </select>

    ibatis可以自动处理取数据的过程。

    (6)当使用到in进行数据的筛选时,有可能使用到数组(如之前的参数包含数组),也可能是String的字符串(普通的sql查询语句如:select * from table where column1 in (str1,str2,str3,....)),此写法可以解决传入参数是字符串的情况。

<select id="statement6" parameterClass="testBean" returnClass="testBean">
        <![CDATA[
            SELECT column1,column2
                FROM table1
                WHERE column1=#field1#
        ]]>
        <isNotEmpty prepend="AND" property="timeStr">
            <![CDATA[
                start_time in $timeStr$
            ]]>
        </isNotEmpty>
    </select>

    注意:这里需要使用$$而不是##,但是这种写法可能会导致sql注入。

    (7)调用MySQL函数的方法(使用函数,是含有返回值的)

<select id="statement7" parameterClass="testBean" returnClass="testBean">
        <![CDATA[
            SELECT column1,count(*)
                FROM table1
                WHERE column1=#field1#
        ]]>
    </select>

    (8)调用存储过程的方法(存储过程可以减少sql语句的网络传入,好处多多,存储过程不像函数一样具有返回值,只能通过out参数来得到返回的需要的值

我们需要先创建存储过程,简单创建一个

DELIMITER //
CREATE PROCEDURE table1_init(field1 VARCHAR(20), OUT field2 VARCHAR(20))
BEGIN
	SELECT column1 INTO field2 FROM table1 WHERE table1.column1=field1;
END//
DELIMITER;

在mysql中调用一下,看看效果(@代表定义了局部变量,如果不加@,则表示列名)

CALL table1_init('255', @field2);
SELECT @field2;

如果使用ibatis,则需要如下写法:

<parameterMap id="data_init_Map" class="hashMap">
        <parameter property="field1" javaType="java.lang.String" jdbcType="VARCHAR" mode="IN" />
        <parameter property="field2" javaType="java.lang.String" jdbcType="VARCHAR" mode="OUT" />
    </parameterMap>
    <procedure id="data_init" parameterMap="data_init_Map">
        {call data_init(?,?)}
    </procedure>

注意:我们实际调用的时候,需要把数据put到map中,然后以map为参数进行调用存储过程。

    (9)MyBatis分页查询(这种使用limit的是mysql,如果是oracle需要使用游标)

<select id="statement9" parameterClass="hashMap" returnClass="testBean" returnMap="entityMap">
        <![CDATA[
            SELECT column1,column2
                FROM table1
        ]]>
        <dynamic prepend="WHERE">
            <isNotEmpty property="field1">
                <![CDATA[
                    column1=#field1#
                ]]>
            </isNotEmpty>
            <isNotEmpty prepend="AND" property="field2">
                <![CDATA[
                    column2=#field2#
                ]]>
            </isNotEmpty>
        </dynamic>
        <dynamic prepend="OFFSET">
            <isNotEmpty property="offset">
                <![CDATA[
                    #offset:INTEGER#
                ]]>
            </isNotEmpty>
        </dynamic>
        <dynamic prepend="LIMIT">
            <isNotEmpty property="limit">
                <![CDATA[
                    #limit:INTEGER#
                ]]>
            </isNotEmpty>
        </dynamic>

    暂时先写这么多,还有很多常用的可能没写完,等以后再用到会再补充,下一篇是MyBatis的常用标签总结,有需要的可以看一看。

猜你喜欢

转载自blog.csdn.net/kevindyzs/article/details/80901712