Mybatis的核心組成部分-SQL映射文件揭祕

Mybatis真正強大的地方在於SQL映射語句,這也是它的魅力所在。相對於它強大的功能,SQL映射文件的配置卻很是簡單,我上篇文章語句講了Mybatis的搭建以及核心配置的講解,接下來我們就一塊兒來看看Mybatis另外一個重要的元素-SQL映射文件
首先先介紹一下SQL映射文件的幾個頂級元素配置java

頂級元素配置

  • Mapper:映射文件的根元素節點,只有一個屬性namespace(命名空間),其做用以下
    • 用於區分不一樣的mapper,全局惟一
    • 綁定DAO接口,即面向接口編程。當namespace綁定某一接口以後,就能夠不用寫該接口的實現類,Mybatis會經過接口的完整限定名查找到對應的mapper配置來執行SQL語句。所以namespace的命名必需要跟接口名同名
  • cache:配置給定命名空間引用緩存。
  • cache-ref:從其餘命名空間引用緩存配置
  • resultMap:用來描述數據庫結果集和對象的對象關係(鍵值對)
  • sql:能夠重用的sql塊,也能夠被其餘語句引用。
  • insert:映射插入的語句
  • update:映射更新的語句
  • delete:映射刪除的語句
  • select:映射查詢的語句

接下來我就逐一的爲你們介紹sql

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文件的主體內容app

<!--查詢用戶列表(參數:對象入參)-->
        <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了spa

<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元素的屬性值和子節點吧debug

  • 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,以上就是本章所介紹的,感謝你們的觀賞!

相關文章
相關標籤/搜索