java-mybaits-00402-Mapper-動態sql
阿新 • • 發佈:2017-05-12
使用 關閉session 校驗 傳遞 靈活 logs sta 添加 參數
上邊的sql也可以改為:
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
<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}%‘<where />可以自動處理第一個and。</if> </where> </select>
1.3、foreach
向sql傳遞數組或List,mybatis使用foreach解析,如下:1.3.1、通過pojo傳遞list
- 需求
- 在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