1. 程式人生 > >java-mybaits-00402-Mapper-動態sql

java-mybaits-00402-Mapper-動態sql

使用 關閉session 校驗 傳遞 靈活 logs sta 添加 參數

1、動態sql(重點)

通過mybatis提供的各種標簽方法實現動態拼接sql。 什麽是動態sql mybatis核心 對sql語句進行靈活操作,通過表達式進行判斷,對sql進行靈活拼接、組裝。 需求 用戶信息綜合查詢列表和用戶信息查詢列表總數這兩個statement的定義使用動態sql。 對查詢條件進行判斷,如果輸入參數不為空才進行查詢條件拼接。

1.1、If

  <!-- 傳遞pojo綜合查詢用戶信息 -->
    <select id="findUserList" parameterType="user" resultType="user"
> select * from user where 1=1 <if test="id!=null and id!=‘‘"> and id=#{id} </if> <if test="username!=null and username!=‘‘"> and username like ‘%${username}%‘ </if> </select>
註意要做不等於空字符串校驗。 註意直接是屬性,不用類名.屬性

1.2、Where

上邊的sql也可以改為:
   <select id="findUserList" parameterType="user" resultType="user">
       select * from user
       <where>
       <if test="id!=null and id!=‘‘">
       and id=#{id}
       </if>
       <if test="username!=null and username!=‘‘">
       and username like ‘%${username}%‘
       
</if> </where> </select>
<where />可以自動處理第一個and。

1.3、foreach

向sql傳遞數組或List,mybatis使用foreach解析,如下:

1.3.1、通過pojo傳遞list

  • 需求
傳入多個id查詢用戶信息,用下邊兩個sql實現: SELECT * FROM USERS WHERE username LIKE ‘%張%‘ AND (id =10 OR id =89 OR id=16) SELECT * FROM USERS WHERE username LIKE ‘%張%‘ id IN (10,89,16)
  • 在pojo中定義list屬性ids存儲多個用戶id,並添加getter/setter方法
  技術分享

  mapper.xml

<if test="ids!=null and ids.size>0">
  <foreach collection="ids" open=" and id in(" close=")" item="id" separator="," >
    #{id}
  </foreach>
</if>

  測試代碼:

List<Integer> ids = new ArrayList<Integer>();
ids.add(1);//查詢id為1的用戶
ids.add(10); //查詢id為10的用戶
queryVo.setIds(ids);
List<User> list = userMapper.findUserList(queryVo);

1.3.2、傳遞單個List

傳遞List類型在編寫mapper.xml沒有區別,唯一不同的是只有一個List參數時它的參數名為list。 如下:mapper.xml
<select id="selectUserByList" parameterType="java.util.List"
        resultType="com.lhx.mybatis.po.User">
        select * from user
        <where>
            <!-- 傳遞List,List中是pojo -->
            <if test="list!=null">
                <foreach collection="list" item="item" open="and id in("
                    separator="," close=")">
                    #{item.id}
                </foreach>
            </if>
        </where>
    </select>

mapper接口

public List<User> selectUserByList(List<User> userlist) throws Exception;

測試類

    public void testselectUserByList() throws Exception {
        // 獲取session
        SqlSession session = sqlSessionFactory.openSession();
        // 獲限mapper接口實例
        UserMapper userMapper = session.getMapper(UserMapper.class);
        // 構造查詢條件List
        List<User> userlist = new ArrayList<User>();
        User user = new User();
        user.setId(1);
        userlist.add(user);
        user = new User();
        user.setId(2);
        userlist.add(user);
        // 傳遞userlist列表查詢用戶列表
        List<User> list = userMapper.selectUserByList(userlist);
        System.out.println(list.size()+"");
        // 關閉session
        session.close();
    }

1.3.3、傳遞單個數組(數組中是pojo):

mapper.xml
    <!-- 傳遞數組綜合查詢用戶信息 -->
    <select id="selectUserByArrayPojo" parameterType="Object[]"
        resultType="com.lhx.mybatis.po.User">
        select * from user
        <where>
            <!-- 傳遞數組 -->
            <if test="array!=null">
                <foreach collection="array" index="index" item="item" open="and id in("
                    separator="," close=")">
                    #{item.id}
                </foreach>
            </if>
        </where>
    </select>

mapper接口

    public List<User> selectUserByArrayPojo(Object[] userlist) throws Exception;

測試代碼

    public void testselectUserByArray() throws Exception {
        // 獲取session
        SqlSession session = sqlSessionFactory.openSession();
        // 獲限mapper接口實例
        UserMapper userMapper = session.getMapper(UserMapper.class);
        // 構造查詢條件List
        Object[] userlist = new Object[2];
        User user = new User();
        user.setId(1);
        userlist[0] = user;
        user = new User();
        user.setId(2);
        userlist[1] = user;
        // 傳遞user對象查詢用戶列表
        List<User> list = userMapper.selectUserByArrayPojo(userlist);
        // 關閉session
        session.close();
    }

1.3.4、傳遞單個數組(數組中是字符串類型):

mapper.xml
    <!-- 傳遞數組綜合查詢用戶信息 -->
    <select id="selectUserByArray" parameterType="Object[]"
        resultType="com.lhx.mybatis.po.User">
        select * from user
        <where>
            <!-- 傳遞數組 -->
            <if test="array!=null">
                <foreach collection="array" index="index" item="item" open="and id in("
                    separator="," close=")">
                    #{item}
                </foreach>
            </if>
        </where>
    </select>

mapper接口

public List<User> selectUserByArray(Object[] userlist) throws Exception;

測試代碼

    public void testselectUserByArray() throws Exception {
        // 獲取session
        SqlSession session = sqlSessionFactory.openSession();
        // 獲限mapper接口實例
        UserMapper userMapper = session.getMapper(UserMapper.class);
        // 構造查詢條件List
        Object[] userlist = new Object[2];
        userlist[0] = "1";
        userlist[1] = "2";
        // 傳遞user對象查詢用戶列表
        List<User> list = userMapper.selectUserByArray(userlist);
        // 關閉session
        session.close();
    }

1.4、Sql片段

Sql中可將重復的sql提取出來,使用時用include引用即可,最終達到sql重用的目的,方便程序員進行開發如下:
<!-- 傳遞pojo綜合查詢用戶信息 -->
    <select id="findUserList" parameterType="user" resultType="user">
       select * from user
       <where>
       <if test="id!=null and id!=‘‘">
       and id=#{id}
       </if>
       <if test="username!=null and username!=‘‘">
       and username like ‘%${username}%‘
       </if>
       </where>
    </select>
將where條件抽取出來
<sql id="query_user_where">
    <if test="id!=null and id!=‘‘">
       and id=#{id}
    </if>
    <if test="username!=null and username!=‘‘">
       and username like ‘%${username}%‘
    </if>
</sql>
使用include引用
<select id="findUserList" parameterType="user" resultType="user">
       select * from user
       <where>
       <include refid="query_user_where"/>
       </where>
    </select>
註意: 1.如果引用其它mapper.xml的sql片段,則在引用時需要加上namespace,如下: <include refid="namespace.sql片段”/> 2.經驗,是基於單表定有的sql片段,這樣sql可重用性高 3.一般不添加where,方便引用多個片段

java-mybaits-00402-Mapper-動態sql