mybatis的核心就是動態sql.
什么是動態sql:對sql語句進行靈活操作,通過表達式進行判斷,對sql進行靈活拼接、組裝。
這篇文章講解sql中的if語句。它可以對查詢條件進行判斷,如果輸入參數不為空才進行查詢條件的拼接。這篇文章的核心就是下面的這段代碼。
<!--
<where></where>相當於sql語句中的where關鍵字。
這個標簽還有一個功能就是自動會去掉第一個and.,比如下面兩句sql代碼,如果第一個滿足的那么就會去掉and這個關鍵字。
-->
<where> <if test="userCustom!=null"> <if test="userCustom.sex!=null and userCustom.sex!=''"> and user.sex= #{userCustom.sex} </if> <if test="userCustom.username!=null and userCustom.username!=''" > and user.username=#{userCustom.username} </if> </if> </where>
下面給出u具體案例:
案例代碼結構如下:
除了userMapper.xml和Mybatis_mappertest.java要修改外,其他的代碼都不用變。
userMapper.xml代碼如下:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- nanmespace:命名空間。 作用就是對sql進行分類話管理,理解Sal分離 注意:使用mapper代理方式,namespace有特殊重要的作用 --> <mapper namespace="cn.itcast.mybatis.mapper.userMapper"> <!-- 這里的id要和Mapp接口里面的函數名字一模一樣。parameterType表示輸入的類型, resultType表示輸出的類型 --> <select id="findUserList" parameterType="cn.itcast.mybatis.po.UserQueryVo" resultType="cn.itcast.mybatis.po.UserCustom"> SELECT id ,username FROM USER WHERE user.sex= #{userCustom.sex} AND user.username=#{userCustom.username} </select> <!-- 定義resultMap 將SELECT id id_,username username_ FROM USER 和User類中的屬性做一個映射關系 type:resultMap最終映射的java對象類型,可以使用別名 id:對resultMap的唯一標識。 --> <resultMap type="user" id="userResultMap"> <!-- id:表示查詢結果集中唯一的標識。 column:查詢出來的列名 property:type指定的pojo類型中的屬性名 最終resultMap對column和property作一個映射關系(對應關系) --> <id column="id_" property="id"/> <result column="username_" property="username"/> </resultMap> <select id="findUserByResultMap" parameterType="cn.itcast.mybatis.po.UserQueryVo" resultMap="userResultMap"> SELECT id id_,username username_ FROM USER <!-- where可以自動去掉條件中的第一個and --> <where> <if test="userCustom!=null"> <if test="userCustom.sex!=null and userCustom.sex!=''"> and user.sex= #{userCustom.sex} </if> <if test="userCustom.username!=null and userCustom.username!=''" > and user.username=#{userCustom.username} </if> </if> </where> </select> </mapper>
測試代碼Mybatis_mappertest.java代碼如下:
package cn.itcast.mybatis.first; import java.io.IOException; import java.io.InputStream; import java.util.Date; import java.util.List; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Before; import org.junit.Test; import cn.itcast.mybatis.mapper.userMapper; import cn.itcast.mybatis.po.User; import cn.itcast.mybatis.po.UserCustom; import cn.itcast.mybatis.po.UserQueryVo; public class Mybatis_mappertest { private SqlSessionFactory sqlSessionFactory; @Before public void setup() throws IOException { String resource="SqlMapConfig.xml"; InputStream inputStream= Resources.getResourceAsStream(resource); //主要是生成SqlsessionFactory。 this.sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); } @Test public void testMaper() { SqlSession sqlSession=null; sqlSession=sqlSessionFactory.openSession(); //生成代理類 userMapper userMapper=sqlSession.getMapper(userMapper.class); //創建包裝對象,設置查詢條件 UserQueryVo userQueryVo=new UserQueryVo(); UserCustom userCustom=new UserCustom(); // 注意我把這里的sex注銷掉了,也就是說sex沒有值,那么我們用的是動態的sql語句,就是說sex不會被拼接進去吧 // userCustom.setSex("1"); userCustom.setUsername("王王"); userQueryVo.setUserCustom(userCustom); userMapper.findUserByResultMap(userQueryVo); } }
運行如下:
DEBUG [main] - ==> Preparing: SELECT id id_,username username_ FROM USER WHERE user.username=?
看到沒,這里得sql語句中沒有 and user.sex= #{userCustom.sex}這條語句。也就是說沒有拼接上去。
我們再改一下:干脆把整個userCustom都不輸入進去。
結果如下:
DEBUG [main] - ==> Preparing: SELECT id id_,username username_ FROM USER
看到沒,這里的sql語句中什么where后面的語句都沒有拼接上去了。