2016-03-01 36 views
0

我在通過在我的java項目中使用mybatis將用戶信息保存到mysql中時遇到了問題。要求如下:使用MyBatis將用戶信息保存到MySQL中

如果用戶的信息在數據庫中不存在,則插入此用戶。

如果用戶的信息存在於數據庫中,則更新此用戶。

現在我已經檢查了mybatis文件,動態sql定義可能會節省我的時間,但我沒有找到它的例子。 所以下面是樣本SQL我想改變:

<insert id="create" parameterType="UserLearningCourse" > 
    <!--If record not exists, perform insert command--> 
    INSERT INTO `user_learning_course` (
     user_identifier, 
     course_identifier, 
     best_grade, 
     latest_grade, 
     total_number_of_sequences, 
     last_modified_at 
    ) 
    VALUES (
     #{user_identifier}, 
     #{course_identifier}, 
     #{best_grade}, 
     #{latest_grade}, 
     #{total_number_of_sequences}, 
     #{last_modified_at} 
    ) 
    <!--If record exists, perform update command--> 
    UPDATE user_learning_course 
    <set> 
     <if test="best_grade!=null"> 
      best_grade     = #{best_grade}, 
     </if> 
     <if test="latest_grade!=null"> 
      latest_grade    = #{latest_grade}, 
     </if> 
     <if test="total_number_of_sequences!=null"> 
      total_number_of_sequences = #{total_number_of_sequences}, 
     </if> 
     <if test="last_modified_at!=null"> 
      last_modified_at   = #{last_modified_at}, 
     </if> 
    </set> 
    WHERE user_identifier  = #{user_identifier} 
</insert> 

任何人誰這樣做,你會不會請給我一些燈?謝謝。

編輯: 現在我可以基於過濾器現在插入或更新數據庫。但問題是我無法獲得返回結果。有人會幫忙嗎?下面的XML SQL:

<insert id="saveOrUpdate" parameterType="UserLearningCourse" useGeneratedKeys="true" 
     keyProperty="id" keyColumn="id"> 
    <selectKey keyProperty="count" resultType="int" order="BEFORE"> 
     SELECT COUNT(*) count FROM user_learning_course 
     where user_identifier = #{userIdentifier} 
       AND course_identifier = #{courseIdentifier} 
    </selectKey> 

    <if test="count > 0"> 
     UPDATE user_learning_course 
     <set> 
      <if test="courseIdentifier!=null"> 
       course_identifier = #{courseIdentifier}, 
      </if> 
      <if test="bestCourseGrade!=null"> 
       best_grade = #{bestCourseGrade}, 
      </if> 
      <if test="latestCourseGrade!=null"> 
       latest_grade = #{latestCourseGrade}, 
      </if> 
      <if test="totalNumberOfSequences!=null"> 
       total_number_of_sequences = #{totalNumberOfSequences}, 
      </if> 
      <if test="lastModifiedAt!=null"> 
       last_modified_at = #{lastModifiedAt}, 
      </if> 
     </set> 
     <where> 
       user_identifier = #{userIdentifier} 
       AND course_identifier = #{courseIdentifier} 
     </where> 
    </if> 
    <if test="count==0"> 
     INSERT INTO `user_learning_course` (
     user_identifier, 
     course_identifier, 
     best_grade, 
     latest_grade, 
     total_number_of_sequences, 
     last_modified_at 
     ) 
     VALUES (
     #{userIdentifier}, 
     #{courseIdentifier}, 
     #{bestCourseGrade}, 
     #{latestCourseGrade}, 
     #{totalNumberOfSequences}, 
     #{lastModifiedAt} 
     ) 
    </if> 

</insert> 

但經過我跑了它,它就會把我的異常如:

{ 「類型」: 「genericResponseWrapper」, 「httpStatusCode」:500, 「applicationErrorCode」 :0, 「errorMessage」:「Unexpected Throwable:Mapper method'com.rosettastone.ws.ptsws.dao.mybatis.UserLearningCourseDaoImpl.saveOrUpdate'has a unsupported return type:class com.rosettastone.ws.ptsws.domain.UserLearningCourse」 , 「errorDetails」:null, 「payload」:null }

我在代碼中定義的方法是:

UserLearningCourse saveOrUpdate(UserLearningCourse entity); 

我打算回到實體,但錯誤拋出。我知道xml sql配置不與返回類型。但如何解決?

回答

0

最後,我解決了這個問題。 首先,下面的SQL:

<insert id="saveOrUpdate" parameterType="UserLearningCourse" useGeneratedKeys="true" 
    keyProperty="id" keyColumn="id"> 
<selectKey keyProperty="count" resultType="int" order="BEFORE"> 
    SELECT COUNT(*) count FROM user_learning_course 
    where user_identifier = #{userIdentifier} 
      AND course_identifier = #{courseIdentifier} 
</selectKey> 

<if test="count > 0"> 
    UPDATE user_learning_course 
    <set> 
     <if test="courseIdentifier!=null"> 
      course_identifier = #{courseIdentifier}, 
     </if> 
     <if test="bestCourseGrade!=null"> 
      best_grade = #{bestCourseGrade}, 
     </if> 
     <if test="latestCourseGrade!=null"> 
      latest_grade = #{latestCourseGrade}, 
     </if> 
     <if test="totalNumberOfSequences!=null"> 
      total_number_of_sequences = #{totalNumberOfSequences}, 
     </if> 
     <if test="lastModifiedAt!=null"> 
      last_modified_at = #{lastModifiedAt}, 
     </if> 
    </set> 
    <where> 
      user_identifier = #{userIdentifier} 
      AND course_identifier = #{courseIdentifier} 
    </where> 
</if> 
<if test="count==0"> 
    INSERT INTO `user_learning_course` (
    user_identifier, 
    course_identifier, 
    best_grade, 
    latest_grade, 
    total_number_of_sequences, 
    last_modified_at 
    ) 
    VALUES (
    #{userIdentifier}, 
    #{courseIdentifier}, 
    #{bestCourseGrade}, 
    #{latestCourseGrade}, 
    #{totalNumberOfSequences}, 
    #{lastModifiedAt} 
    ) 
</if> 

二,以下方法:

UserLearningCourse saveUpdate(UserLearningCourse entity); 

三,調用方法:

public UserLearningCourse saveUpdate(UserLearningCourse userLearningCourse) 
{ 
    int affectRows = userLearningCourseDao.saveOrUpdate(userLearningCourse); 
    return userLearningCourse; 
} 

所以在這裏,你可以看到返回ID已自動過濾到原始userLearningCourse中。所以現在你可以直接返回實體。 因爲我們提到了keyproperty和keycolumn,所以它會被mybatis自動返回。 saveOrUpdate只返回影響數據庫中的行。

相關問題