Mybatis真正強大的地方在於SQL映射語句,這也是它的魅力所在。相對於它強大的功能,SQL映射文件的配置卻很是簡單,我上篇文章語句講了Mybatis的搭建以及核心配置的講解,接下來我們就一塊兒來看看Mybatis另外一個重要的元素-SQL映射文件
首先先介紹一下SQL映射文件的幾個頂級元素配置java
接下來我就逐一的爲你們介紹sql
<!--根據用戶名稱查詢用戶列表(模糊查詢)--> <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映射語句中的家庭成員吧!編程
接下來我就用一個實例來向你們演示一下
首先我弄了一個以用戶名、用戶角色來查詢用戶列表的功能,我們先建立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呢?
用小編的話說:當咱們要使用的查詢映射語句是須要關聯多表的時候,那麼一個實體類的字段就不夠用了,好比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
Mybatis中對查詢進行select映射的時候,返回類型能夠用resultType,也能夠用resultMap,那麼resultType和resultMap到底有何關聯呢?接下里小編就作一下詳細的講解
resultType直接表示返回類型,包括基礎數據庫類型和複雜數據類型
resultMap則是對外部resultMap定義的引用,對外部resultMap的ID,表示返回結果映射到哪個resultMap上,它的應用場景通常是:數據庫字段信息與對象屬性不一致或者須要作複雜的聯合查詢以便自由控制映射結果。
在Mybatis的select元素中,resultType和resultMap本質上是同樣的,都是Map數據結構,但須要明確的一點:resultType屬性和resultMap屬性絕對不能同時存在,只能兩者選其一。
接下來講說使用Mybatis實現增刪改的操做,其實這幾個操做都大同小異(小編認爲的)。
<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 id="modify" parameterType="User"> update smbms_user set userCode=#{userCode} where id=#{uId} </update>
<delete id="del" parameterType="User"> delete from smbms_user where id=#{id} </delete>
從上面的操做中能夠看出其實這三種操做都差很少,其中的屬性也都見過哈!那麼小編在這就很少作介紹了,上面我所說的都是SQL映射文件最基礎的一些東西,後面還有動態SQL之類的我在這就不作介紹了,感興趣的童鞋能夠去查查(我以爲闊以),ok,以上就是本章所介紹的,感謝你們的觀賞!