Mybatis核心組成部分-SQL對映檔案
Mybatis真正強大的地方在於SQL對映語句,這也是它的魅力所在。相對於它強大的功能,SQL對映檔案的配置卻非常簡單,我上篇文章語句講了Mybatis的搭建以及核心配置的講解,接下來咱們就一起來看看Mybatis另一個重要的元素-SQL對映檔案
首先先介紹一下SQL對映檔案的幾個頂級元素配置
頂級元素配置
- Mapper:對映檔案的根元素節點,只有一個屬性namespace(名稱空間),其作用如下
- 用於區分不同的mapper,全域性唯一
- 繫結DAO介面,即面向介面程式設計。當namespace繫結某一介面之後,就可以不用寫該介面的實現類,Mybatis會通過介面的完整限定名查詢到對應的mapper配置來執行SQL語句。因此namespace的命名必須要跟介面名同名
- cache:配置給定名稱空間引用快取。
- cache-ref:從其他名稱空間引用快取配置
- resultMap:用來描述資料庫結果集和物件的物件關係(鍵值對)
- sql:可以重用的sql塊,也可以被其他語句引用。
- insert:對映插入的語句
- update:對映更新的語句
- delete:對映刪除的語句
- select:對映查詢的語句
接下來我就逐一的為大家介紹
select:對映查詢語句
<!--根據使用者名稱稱查詢使用者列表(模糊查詢)--> <select id="getUserListByUserName" resultType="User" parameterType="string"> select * from user_info where userName like CONCAT('%',#{userName},'%') </select>
上面這段程式碼是一個id為getUserListByUserName的對映語句,引數型別為string,返回結果的型別是User,注意引數的傳遞使用#{引數名},它告訴Mybatis生成PreparedStatement引數,對於JDBC,該引數會被標識為“?”,若採用JDBC來實現,那程式碼就得換一下方式了
String sql="select * from user_info where userName like CONCAT('%',?,'%')"; PreparedStatement ps=conn.preparedStatement(sql); ps.setString(1,userName);
從上面兩端程式碼我相信大家都能看出區別,Mybatis節省了大量的程式碼,我相信大家會喜歡上它的
接下來我來介紹一下select對映語句中的家庭成員吧!
- id:名稱空間中唯一的識別符號,可以被用來引用這條語句
- parameter:表示查詢語句傳遞引數的型別的完全限定名或別名。它支援基礎資料型別和複雜資料型別,就比如咱們上面用到的string就是一個基礎資料型別,當然你會發現這的string的s是小寫,其實它只是一個別名,還是代表String,只不過它屬於一個內建的類型別名,那麼以此類推,對於普通的Java型別,也有許多的內建類型別名,並且它們對大小寫不明感,介意大家去閱讀以下Mybatis的幫助文件。
- resultType:查詢語句返回結果型別的完全限定名或別名,別名的使用方式與parameterType的使用方式是一致的
接下來我就用一個例項來向大家演示一下
首先我弄了一個以使用者名稱、使用者角色來查詢使用者列表的功能,咱們先建立UserMapper.java檔案
public interface UserMapper {
public List<User> getUserList(Map<String,String> userMap);
}
從上面大家可以看到我用來一個集合來接受返回的結果集,並且傳遞的引數是一個user物件
下面再來編寫UserMapper.xml檔案的主體內容
<!--查詢使用者列表(引數:物件入參)-->
<select id="getUserList" resultType="user" parameterType="Map">
select u.*,r.roleName from smbms_user u,smbms_role r
where u.userName like CONCAT('%',#{userName},'%')
and u.userRole=#{userRole} and u.userRole=r.id
</select>
上面便是咱們此次測試的查詢對映語句了,這和我在上面說的對映語句區別不大,唯一大點的區別就在於引數型別,這的引數型別我換成了一個Map集合。
接下來就可以去測試了。
@Test
public void getUserList(){
SqlSession sqlSession=null;
List<User> userList=new ArrayList<User>();
try{
sqlSession=MyBatisUtil.createSqlSession();
Map<String,String> userMap=new HashMap<String,String>();
userMap.put("uName","趙");
userMap.put("uRole","3");
userList=sqlSession.getMapper(UserMapper.class).getUserListMap(userMap);
}catch(Exception e){
e.printStackTrace();
}finally{
MyBatisUtil,closeSqlSession(sqlSession);
}
for(User user:userList){
logger.debug("testGetUserList userCode:"+user.getUserCode()+"and userName:"+user.getUserName());
}
}
resultMap
接下來說說resultMap,我們為什麼要用resultMap呢?
用小編的話說:當我們要使用的查詢對映語句是需要關聯多表的時候,那麼一個實體類的欄位就不夠用了,比如User表中有一個部門ID,而部門ID又對應了部門表,我們想查詢部門名稱而不是查詢部門ID,這時候我們就要在User實體類中加入一個部門名稱屬性,且該屬性的型別為部門實體類,
到這我們就需要使用resultMap了
<select id="getUserList" resultMap="user" parameterType="Map">
select u.*,r.roleName from smbms_user u,smbms_role r
where u.userName like CONCAT('%',#{userName},'%')
and u.userRole=#{userRole} and u.userRole=r.id
</select>
<resultMap id="userList" type="User">
<result property="userRole" column="roleName"/>
</resultMap>
resultMap元素用來描述如何將結果集對映到java物件,此處使用resultMap對列表展示所需的必要欄位來進行自由對映。接下來看看resultMap元素的屬性值和子節點吧
- id屬性:唯一識別符號,此id值用於select元素resultMap屬性的引用
- type屬性:表示該result的對映結果型別
- result子節點:用於標識一些簡單屬性,其中column屬性表示從資料庫中查詢的欄位名,property則表示查詢出來的欄位對應的值賦給實體物件的哪個屬性。
Mybatis中對查詢進行select對映的時候,返回型別可以用resultType,也可以用resultMap,那麼resultType和resultMap到底有何關聯呢?接下里小編就做一下詳細的講解
resultType
resultType直接表示返回型別,包括基礎資料庫型別和複雜資料型別
resultMap
resultMap則是對外部resultMap定義的引用,對外部resultMap的ID,表示返回結果對映到哪一個resultMap上,它的應用場景一般是:資料庫欄位資訊與物件屬性不一致或者需要做複雜的聯合查詢以便自由控制對映結果。
resultType與resultMap的關聯
在Mybatis的select元素中,resultType和resultMap本質上是一樣的,都是Map資料結構,但需要明確的一點:resultType屬性和resultMap屬性絕對不能同時存在,只能二者選其一。
接下來說說使用Mybatis實現增刪改的操作,其實這幾個操作都大同小異(小編認為的)。
insert
<insert id="add" parameterType="User">
INSERT INTO `smbms`.`smbms_user`(`userCode`, `userName`, `userPassword`, `gender`, `birthday`, `phone`, `address`, `userRole`, `createdBy`, `creationDate`)
VALUES (#{userCode}, #{userName}, #{userPassword}, #{gender}, #{birthday}, #{phone}, #{address}, #{userRole}, #{createdBy}, #{creationDate})
</insert>
update
<update id="modify" parameterType="User">
update smbms_user set userCode=#{userCode} where id=#{uId}
</update>
delete
<delete id="del" parameterType="User">
delete from smbms_user where id=#{id}
</delete>
從上面的操作中可以看出其實這三種操作都差不多,其中的屬性也都見過哈!那麼小編在這就不多做介紹了,上面我所說的都是SQL對映檔案最基礎的一些東西,後面還有動態SQL之類的我在這就不做介紹了,感興趣的童鞋可以去查查(我覺得闊以),ok,以上就是本章所介紹的,感謝大家的觀賞!