spring mvc與Mybatis整合——(三)增刪改查

有了上篇文章中的環境基礎,這裏進一步做一些增刪改查的實例。並附帶源碼下載鏈接。


一、配置文件的語法約束:

      1、Mybatis的配置文件和接口的定義要有一定的規範約束,也是約定大於配置的一種表現,那就是配置文件中,增刪改查的每一個方法的id要和接口中的方法一致,且大小寫敏感。

     2、在配置文件中增刪改查方法有各自對應的標籤:insert、delete、update、select。通常情況下都會有一個parameterType標籤表示傳入的參數類型。傳遞多個參數的時候,可以不在配置文件中使用該標籤,但需在接口中配合註解。

     3、多個參數的傳遞,還有兩種方法:利用hashMap 、實體封裝;mybatis 自身的多個參數傳遞方式。這裏不做重點,後面會有介紹。

    4、參數使用ognl的表達式語法,如:#{userName},#{userAge},#{userAddress}。

    5、對於結果是集合類型的返回值使用resultMap標籤標示。

    6、association標籤相當於一個component,可以打到複用的目的。

    

二、增刪改查實例:

    實例中包含了單表的增刪改查和多表的聯合查詢,針對聯合查詢和hibernate的對象導航語法查詢很類似,這裏不用做過多解釋,重點是具體語法的體會。

    

    在上篇文章的基礎上添加了Article實體,在接口中添加了單表增刪改查的方法以及兩個實體的聯合查詢,以及返回集合類型的方法。

    1、接口的定義:

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. /** 
  2.  * 規則:接口中的方法名和參數和配置文件中的id和parameterType分別對應,sql寫在配置文件中,參數和調用的類test中的方法一致 
  3.  * sql語句中的參數和實體中的字段名一致, 
  4.  * @author limin 
  5.  * 
  6.  */  
  7. public interface IUserOperation {  
  8.     /* 
  9.      * 這裏面有一個方法名 selectUserByID 必須與 User.xml 裏面配置的 select 的id 對應(<select 
  10.      * id="selectUserByID") 
  11.      */  
  12.     public User selectUserByID(int id);  
  13.     //根據用戶名查詢用戶列表     
  14.     public List<User> selectUsers(String userName);     
  15.     public void addUser(User user);  
  16.     public void updateUser(User user);  
  17.     public void deleteUser(int id);  
  18.     public List<Article> getUserArticles(int id);   
  19.       
  20. }  

    2、配置文件:

[html] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
  3.   
  4. <mapper namespace="com.tgb.mybatis.inter.IUserOperation">  
  5.   
  6. <!-- com.yihaomen.mybatis.model.UserMapper -->  
  7.   
  8.     <!-- resultType的值要和Configuration.xml中的實體User的別名相同 -->  
  9.     <select id="selectUserByID" parameterType="int" resultType="User">  
  10.         select * from user where id = #{id}  
  11.     </select>  
  12.   
  13.     <!-- 爲了返回list 類型而定義的returnMap -->  
  14.     <resultMap type="User" id="resultListUser">  
  15.         <id column="id" property="id" />  
  16.         <result column="userName" property="userName" />  
  17.         <result column="userAge" property="userAge" />  
  18.         <result column="userAddress" property="userAddress" />  
  19.     </resultMap>  
  20.   
  21.       
  22.     <!-- 返回list 的select 語句,注意 resultMap 的值是指向前面定義好的 -->  
  23.     <select id="selectUsers" parameterType="string" resultMap="resultListUser">  
  24.         select * from user where userName like #{userName}  
  25.     </select>  
  26.   
  27.   
  28.     <!-- 執行增加操作的SQL語句。id和parameterType分別與IUserOperation接口中的addUser方法的名字和 參數類型一致。以#{name}的形式引用Student參數的name屬性,MyBatis將使用反射讀取Student參數   
  29.         的此屬性。#{name}中name大小寫敏感。引用其他的gender等屬性與此一致。useGeneratedKeys設置 爲"true"表明要MyBatis獲取由數據庫自動生成的主   
  30.         鍵;keyProperty="id"指定把獲取到的主鍵值注入 到Student的id屬性 -->  
  31.     <insert id="addUser" parameterType="User" useGeneratedKeys="true"  
  32.         keyProperty="id">  
  33.         insert into user(userName,userAge,userAddress)    
  34.         values(#{userName},#{userAge},#{userAddress})  
  35.     </insert>  
  36.   
  37.   
  38. <!-- 更新的配置 -->  
  39.     <update id="updateUser" parameterType="User">  
  40.         update user set  
  41.         userName=#{userName},userAge=#{userAge},userAddress=#{userAddress}  
  42.         where id=#{id}  
  43.     </update>  
  44.       
  45.     <!-- 刪除配置 -->  
  46.     <delete id="deleteUser" parameterType="int">  
  47.         delete from user where id=#{id}  
  48.     </delete>  
  49.           
  50.     <!-- 多對一方法二:將 association 中對應的映射獨立抽取出來,可以達到複用的目的。 -->  
  51.         <!-- User 聯合文章進行查詢 方法之二的配置 (多對一的方式) -->  
  52.     <resultMap id="resultUserArticleList" type="Article">  
  53.         <id property="id" column="aid" />  
  54.         <result property="title" column="title" />  
  55.         <result property="content" column="content" />  
  56.         <association property="user" javaType="User" resultMap="resultListUser" />  
  57.     </resultMap>  
  58.       
  59.           
  60.     <!-- 多對一的配置方法一: 根據用戶id查詢多個Article -->  
  61. <!--     <resultMap id="resultUserArticleList" type="Article">  
  62.         <id property="id" column="aid" />  
  63.         <result property="title" column="title" />  
  64.         <result property="content" column="content" />  
  65.   
  66.         <association property="user" javaType="User">  
  67.             <id property="id" column="id" />  
  68.             <result property="userName" column="userName" />  
  69.             <result property="userAddress" column="userAddress" />  
  70.         </association>  
  71.     </resultMap>  
  72.  -->  
  73.    
  74.     <select id="getUserArticles" parameterType="int"  
  75.         resultMap="resultUserArticleList">  
  76.           
  77.         select user.id,user.username,user.useraddress,article.id aid,article.title,article.content  
  78.         from user,article  
  79.         where user.id=article.userid and user.id=#{id}  
  80.     </select>  
  81.       
  82.   
  83.       
  84. </mapper>  

同時需要在Configuration.xml中,增加了Article的部分,參照user即可。

對多對一的配置有兩種方法,區別在於是否在association標籤中複用resultMap標籤,resultMap標籤配置了一個list集合。

     3、最後再給出測試文件:

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. package com.tgb.test;  
  2.   
  3. import java.io.Reader;  
  4. import java.util.List;  
  5.   
  6. import org.apache.ibatis.io.Resources;  
  7. import org.apache.ibatis.session.SqlSession;  
  8. import org.apache.ibatis.session.SqlSessionFactory;  
  9. import org.apache.ibatis.session.SqlSessionFactoryBuilder;  
  10.   
  11. import com.tgb.mybatis.inter.IUserOperation;  
  12. import com.tgb.mybatis.model.Article;  
  13. import com.tgb.mybatis.model.User;  
  14.   
  15.   
  16. /** 
  17.  * 增加:天機後,必須提交事務,否則不會寫入到數據庫 
  18.  * 更新:類似hibernate,要先查出後,之後再更新 
  19.  * 也有類似的session.commit() 
  20.  * @author limin 
  21.  * 
  22.  */  
  23. public class Test {  
  24.   
  25.     private static SqlSessionFactory sqlSessionFactory;  
  26.     private static Reader reader;  
  27.   
  28.     static {  
  29.         try {  
  30.             // 最終實現了從配置文件中配置工廠的初始化  
  31.             reader = Resources.getResourceAsReader("Configuration.xml");  
  32.             sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);  
  33.         } catch (Exception e) {  
  34.             e.printStackTrace();  
  35.         }  
  36.     }  
  37.   
  38.     public static SqlSessionFactory getSession() {  
  39.         return sqlSessionFactory;  
  40.     }  
  41.   
  42.     public void getUserList(String userName){  
  43.         SqlSession session = sqlSessionFactory.openSession();  
  44.         try {  
  45.             IUserOperation userOperation=session.getMapper(IUserOperation.class);            
  46.             List<User> users = userOperation.selectUsers(userName);  
  47.             for(User user:users){  
  48.                 System.out.println(user.getId()+":"+user.getUserName()+":"+user.getUserAddress());  
  49.             }  
  50.               
  51.         } finally {  
  52.             session.close();  
  53.         }  
  54.     }  
  55.       
  56.       
  57.       
  58.     //增加後,必須提交事務,否則不會寫入到數據庫.  
  59.     public void addUser(){  
  60.         User user=new User();  
  61.         user.setUserAddress("萬達廣場");  
  62.         user.setUserName("陸遜");  
  63.         user.setUserAge(80);  
  64.         SqlSession session = sqlSessionFactory.openSession();  
  65.         try {  
  66.             IUserOperation userOperation=session.getMapper(IUserOperation.class);  
  67.             userOperation.addUser(user);  
  68.             session.commit();  
  69.             System.out.println("當前增加的用戶 id爲:"+user.getId());  
  70.         } finally {  
  71.             session.close();  
  72.         }  
  73.     }  
  74.       
  75.     //類似hibernate,要先查出後,之後再更新  
  76.     public void updateUser(){  
  77.         //先得到用戶,然後修改,提交。  
  78.         SqlSession session = sqlSessionFactory.openSession();  
  79.         try {  
  80.             IUserOperation userOperation=session.getMapper(IUserOperation.class);  
  81.             User user = userOperation.selectUserByID(2);              
  82.             user.setUserAddress("上海東方明珠寶塔");  
  83.             userOperation.updateUser(user);  
  84.             session.commit();  
  85.               
  86.         } finally {  
  87.             session.close();  
  88.         }  
  89.     }  
  90.       
  91.       
  92.     /** 
  93.      * 刪除數據,刪除一定要 commit. 
  94.      * @param id 
  95.      */  
  96.     public void deleteUser(int id){  
  97.         SqlSession session = sqlSessionFactory.openSession();  
  98.         try {  
  99.             IUserOperation userOperation=session.getMapper(IUserOperation.class);            
  100.             userOperation.deleteUser(id);  
  101.             session.commit();              
  102.         } finally {  
  103.             session.close();  
  104.         }  
  105.     }  
  106.       
  107.     public void getUserArticles(int userid){  
  108.         SqlSession session = sqlSessionFactory.openSession();  
  109.         try {  
  110.             IUserOperation userOperation=session.getMapper(IUserOperation.class);            
  111.             List<Article> articles = userOperation.getUserArticles(userid);  
  112.             for(Article article:articles){  
  113.                 System.out.println(article.getTitle()+":"+article.getContent()+  
  114.                         ":作者是:"+article.getUser().getUserName()+":地址:"+  
  115.                          article.getUser().getUserAddress());  
  116.             }  
  117.         } finally {  
  118.             session.close();  
  119.         }  
  120.     }  
  121.   
  122.       
  123.       
  124.       
  125.     public static void main(String[] args) {          
  126.   
  127.         //測試接口返回用戶list列表  
  128.          Test testUser=new Test();         
  129.         testUser.getUserList("%");            
  130.          testUser.addUser();          
  131.          testUser.updateUser();            
  132.          testUser.deleteUser(2);              
  133.          testUser.getUserArticles(1);  
  134.            
  135. /* 
  136.         SqlSession session = sqlSessionFactory.openSession(); 
  137.         try { 
  138.  
  139.             // 1、沒有使用接口的測試 
  140.             // 這裏傳入的參數是從User.xml文件中配置的 
  141.             //User user = (User) session.selectOne("com.yihaomen.mybatis.model.UserMapper.selectUserByID", 1); 
  142.  
  143.             // 2、基於接口的測試:在接口的定義中,selectUserByID方法和配置文件中的方法名要一致,這裏傳入的是參數 
  144.             IUserOperation userOperation = session.getMapper(IUserOperation.class); 
  145.             User user = userOperation.selectUserByID(1); 
  146.  
  147.             System.out.println(user.getUserAddress()); 
  148.             System.out.println(user.getUserName()); 
  149.              
  150.              
  151.         } finally { 
  152.             session.close(); 
  153.         }       */  
  154.           
  155.   
  156.           
  157.     }  
  158.   
  159. }  

     結果如圖:



三、總結:

    這篇文章主要是增刪改查的一個實例,也包含了聯合查詢,重點是幾種xml標籤的使用,在使用的時候,可以從照貓畫虎開始,有hibernate基礎,理解Mybatis是很容易的。

    相關源碼可以從這裏下載,自行測試。

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章