<select>是iBatis已經映射的語句類型,就是查詢了,爲了配合說明,這裏再介紹兩個標記:<sql>和<include>,前者用來建立一個文本片斷,這些片斷能夠組合起來建立完整的SQL語句;後者很顯然就是包含的意思了。假設咱們有以下代碼段: java
<sql id="select-user"> select * from users </sql> <sql id="select-count"> select count(*) as value from users </sql> <sql id="where-age-over-value"> <![CDATA[ where age > #value:INT# ]]> </sql> <select id="getUserAgeOver" resultClass="hashmap"> <include refid="select-user" /> <include refid="where-age-over-value" /> </select> <select id="getUserCountAgeOver" resultClass="int"> <include refid="select-count" /> <include refid="where-age-over-value" /> </select>
該部分代碼展現了sql和include的使用,其中使用了CDATA段,這是由於XML標籤本體中出現了於XML標籤衝突的字符,這很好理解。後面兩個查詢就是咱們執行的語句部分,程序代碼能夠這麼來寫:
sql
List users = sqlMap.queryForList("User.getUserAgeOver","23"); System.out.println(users); int userCount = (Integer) sqlMap.queryForObject( "User.getUserCountAgeOver", "22"); System.out.println(userCount);若是能夠查詢到記錄,那麼就會打印出來了。上面的例子中咱們是用了#來標識傳遞的參數,#被成爲佔位符,這是內聯參數的傳遞方式的一種。
<select id="getUserById" resultClass="User"> select userId, userName, password, age, mobile, mail from users where userId = #value# </select>在程序中,用下面這些代碼就能達到查詢效果了。
User user = (User) sqlMap.queryForObject("User.getUserById", new Integer(1)); System.out.println(user);#value#是告訴iBatis傳遞一個簡單的參數,iBatis處理該語句時,將會把#value#轉換爲預處理參數形式,而後將這個參數的值設置爲1(就是queryForObject()方法的第二個參數),以後執行該預處理語句。最後iBatis接受返回的結果,而後把它映射到一個Java對象並返回該對象,這就是sqlMap的執行過程。
<select id="getUserByLikeEmail" resultClass="User"> select userId, userName, password, age, mobile, email from users where email like '%$value$%' </select>在程序中,咱們可使用以下代碼來執行模糊查詢:
<select id="getUserByLikeEmail" resultClass="User" parameterClass="parameterMap"> select userId, userName, <dynamic> <isEqual property="includePassword" compareValue="true"> password, </isEqual> </dynamic> age, mobile, email from users where email like concat('%',#email#,'%') </select>程序中咱們先定義一個ParameterMap類型,而後執行查詢,以下:
ParameterMap params = new ParameterMap("email", "gmail", "includePassword", true); List users = sqlMap.queryForList("User.getUserByLikeEmail", params); System.out.println(users);這樣咱們就能人爲控制password字段是輸出了。下面咱們來看外部參數映射,使用外部參數映射主要是在XML中定義parameterMap,標識它的id和class後再在其中定義parameter,它包括以下屬性:property,javaType,jdbcType,nullValue,mode和typeHandler。要區分這和咱們上面定義的ParameterMap類型是兩回事。咱們定義的ParameterMap是以下定義的:
package ibatis.util; import java.util.HashMap; public class ParameterMap extends HashMap<Object, Object> { private static final long serialVersionUID = 1L; public ParameterMap(Object... parameters) { for (int i = 0; i < parameters.length - 1; i += 2) { super.put(parameters[i], parameters[i + 1]); } } }它是做爲輔助類來用的,給SQL語句提供參數,在配置文件中,我沒使用的是typeAlias來爲它重命名的,並且在select標籤中咱們使用的是parameterClass屬性,而不是parameterMap屬性,這裏要區分開,它們能夠說是徹底不一樣的。
package ibatis.util; public class PrimitiveResult { private int userCount; public int getUserCount() { return userCount; } public void setUserCount(int userCount) { this.userCount = userCount; } @Override public String toString() { return "PrimitiveResult [userCount=" + userCount + "]"; } }很簡單的一個類型,就是描述用戶數量的。再在XML中定義這個類型:
<resultMap class="ibatis.util.PrimitiveResult" id="primitiveResultMap"> <result property="userCount" column="userCount" javaType="java.lang.Integer" jdbcType="int" /> </resultMap>這裏說明一下property就是定義PrimitiveResult中的一個屬性名,這裏是userCount,後面的column應該是數據庫中的字段名,這裏數據庫中沒有統計用戶數量這個字段,咱們能夠在SQL語句中使用as重命名來進行,javaType和jdbcType就好理解了,分別是Java對象的類型和數據庫字段的類型。
<select id="selectPrimitiveByUserId" resultMap="primitiveResultMap"> select count(*) as userCount from users </select>注意這裏是resultMap就好了,再也不是resultClass了,下面就是程序代碼了:
rimitiveResult userCount = (PrimitiveResult) sqlMap.queryForObject( "User.selectPrimitiveByUserId"); System.out.println(userCount);由於咱們以前在PrimitiveResult中覆蓋了toString()方法,那麼咱們執行程序,就獲得了:PrimitiveResult [userCount=2],這就是外部結果映射的使用了。