1. 程式人生 > >(十一)mybatis之映射器(select)

(十一)mybatis之映射器(select)

默認 turn 駝峰命名 cells add tab pri public 要求

映射器

映射器的主要元素有八種:

元素名稱

描述

select

查詢語句,可自定義參數

insert

插入語句,執行後返回插入的條數

update

更新語句,執行後返回更新的條數

delete

刪除語句,執行後返回刪除的條數

sql

定義一部分的sql,被各處引用

resultMap

描述從數據庫中得到的結果,提供映射規則

cache

給定命名空間的緩存配置

cache-ref

其他命名空間緩存配置的引用

select元素

① 簡單地應用查詢的select元素

<
select id =”selectPerson” parameterType=”int” resultType=”hashmap”> SELECT * FROM PERSON WHERE ID=”#{id}” </select>

在<select>標簽中定義了,這個操作的標識id為”selectPerson”,而這個操作的接受的是int(Integer)類型的參數,並返回一個HashMap類型的對象。

其中的參數符號:

#{id}

就跟JDBC裏面的SQL語句中的一個預處理語句參數“?”是一樣的效果。

String selectPerson = “SELECT * FROM PERSON WHERE ID=?
”;

而<select>標簽中的標識屬性id,需要與映射的Mapper類中的方法名一致。

public HashMap selectperson(int id);

這樣就可以使用Mybatis調用SQL了。

② 自動映射

在Mybatis的配置文件(mybatis-config.xml)中的settings下的參數autoMappingBehavior,當它不設置為NONE的時候,Mybatis就會提供自動映射的功能------只要返回的SQL列名和POJO的屬性一致,Mybatis就會回填這些字段而不需要任何設置。

在實際中,大部分的數據庫規範都是要求每個單詞用下劃線分隔,而Java則是用駝峰命名法來命名,於是使用列的別名

就可以使Mybatis自動映射,或者直接在配置文件中開啟駝峰命名的方式

a) 使用列的別名

package com.entity

public class User{

         private int id;

         private String userName;

        

         public int getId(){

                   return id;

}

public void setId(int id){

         this.id = id;

}

public String getUserName(){

         return userName;

}

public void setUserName(String userName){

         this.userName = userName;

}

}

而數據庫表(user_info)的字段(簡略)如下:

字段

類型

說明

id

int(20)

角色編號,主鍵,遞增

user_name

varchar(60)

角色名稱

此時Mapper的映射語句是:

<select parameterType=”int” id=”getUser” resultType=”com.entity.User”>

         select id,user_name as username from user_info where id=#{id}

</select>

對於UserDao接口,提供的方法是:

public User getUser(int id);

b) 在配置文件中啟用駝峰命名法

設置settings屬性下的mapUnderscoreToCamelCase參數為true,這樣就可以實現從數據庫到POJO的自動映射了。

自動映射可以在settings元素中配置autoMappingBehavior屬性值來設定。

說明

NONE

取消自動映射

PARTIAL

只會自動映射,沒有定義嵌套結果集映射的結果集(默認值)

FULL

會自動映射任意復雜的結果集

傳遞多個參數:

a) 使用Map傳遞參數

我們可以使用Mybatis提供的Map接口作為參數來實現:

<select id=”findUserByMap” parameterType=”map” resultMap=”userMap”>

         select id,user_name from user_info where user_name like concat(‘%’,#{userName},‘%‘)

</select>

對於UserDao接口:

public List<User> findUserByMap(Map<int, String> params);

傳遞參數:

Map<int, String> paramsMap = new HashMap<int, String>();

paramsMap.put(“id”,1);

paramsMap.put(“username”,”tom”);

userMapper.findUserByMap(paramsMap);

使用Map傳遞參數。因為Map導致業務可讀性喪失,從而導致後續擴展和維護的困難,所以這個方法廢棄掉。

b) 使用註解方式傳遞參數

UserDao接口如下:

public List<User> findUserByAnnotation(@Param(“id”) int id, @Param(“userName”)String userName);

把映射器的XML修改為無需定義參數類型:

<select id=”findUserByAnnotation” parameterType=”map” resultMap=”userMap”>

select id,user_name from user_info where user_name like concat(‘%’,#{userName},’%’)

</select>

使用@Param註解傳遞多個參數,這種方式的使用受到參數個數(n)的影響。當n<=5時,它是最佳的傳參方式;當n>5的時候,多個參數將給調用帶來困難。

c) 使用JavaBean傳遞參數。

首先先定義一個UserParams的JavaBean:

package com.params;

public class UserParam{

         private String userName;

         public String getUserName(){

         return userName;

}

public void setUserName(String userName){

         this.userName = userName;

}

}

JavaBean傳遞參數:

<select id=”findUserByParams” parameterType=”com.params.UserParam” resultMap=”userMap”>

         select id,user_name from user_info where user_name like concat(‘%’,#{userName},’%’)

</select>

同樣在RoleDao接口提供一個方法:

public List<User> findUserByParams(UserParam params);

當參數個數多於5個時,建議使用JavaBean方式。


參考文章:http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html

(十一)mybatis之映射器(select)