Mybatis动态sql的使用
通過mybatis提供的各種標簽方法實現動態拼接sql。
為什么用if標簽?
UserMapper.xml配置sql,如下:
<!-- 根據條件查詢用戶 --> <select id="queryUserByWhere" parameterType="user" resultType="user">SELECT id, username, birthday, sex, address FROM `user`WHERE sex = #{sex} AND username LIKE'%${username}%' </select>Mapper接口
List<User> queryUserByWhere(User user);測試方法
測試方法:
此時的測試結果是正常的,如果注釋掉 user.setSex(“1”),那么輸出的結果為空,因為我們的where中必須同時去匹配sex與username如果我們想通過其中任意一個查詢數據庫結果,那么又需要分別添加兩個SQL語句代碼,那么如果有多個條件呢?是不是每次都要重新添加,顯然之前這種方式是不靠譜的,因為引入動態sql的if標簽可以解決此問題。
使用if標簽
注意:字符串類型的數據需要要做不等于空字符串校驗。
and放在sex或者username的前面是合法的,如果前面沒有條件會自動把and去掉,如果放在條件后面不會自動去掉,可能造成異常!
where 1=1是sql語句條件邏輯判斷表達式,由于1=1成立,恒為真,該表達式1=1將始終返回”真”。
改造UserMapper.xml
Where標簽
上面的sql還有where 1=1 這樣的語句,很麻煩
可以使用where標簽進行改造
改造UserMapper.xml,如下
sql片段使用
Sql中可將重復的sql提取出來,使用時用include引用即可,最終達到sql重用的目的。
把上面例子中的id, username, birthday, sex, address提取出來,作為sql片段,如下:
注意:申明用sql標簽使用用include和里面的refid屬性
如果要使用別的Mapper.xml配置的sql片段,可以在refid前面加上對應的Mapper.xml的namespace
foreach標簽
向sql傳遞數組或List,mybatis使用foreach解析,如下:
根據多個id查詢用戶信息
查詢sql:
SELECT * FROM user WHERE id IN (1,10,24)
QueryVo類:
如下圖在pojo中定義list屬性ids存儲多個用戶id,并添加getter/setter方法
Mapper.xml文件
UserMapper.xml添加sql,如下:
測試方法:
@Test public void testQueryUserByIds() {// mybatis和spring整合,整合之后,交給spring管理SqlSession sqlSession = this.sqlSessionFactory.openSession();// 創建Mapper接口的動態代理對象,整合之后,交給spring管理UserMapper userMapper = sqlSession.getMapper(UserMapper.class);// 使用userMapper執行根據條件查詢用戶QueryVo queryVo = new QueryVo();List<Integer> ids = new ArrayList<>();ids.add(1);ids.add(10);ids.add(24);queryVo.setIds(ids);List<User> list = userMapper.queryUserByIds(queryVo);for (User u : list) {System.out.println(u);}// mybatis和spring整合,整合之后,交給spring管理sqlSession.close(); }總結
以上是生活随笔為你收集整理的Mybatis动态sql的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: excel中VBa应用总结
- 下一篇: linux线程间同步(1)读写锁