mysql批量插入數據時遇到的問題

一、數據庫mysql  批量插入 時遇到的問題:
     數據表的字段  一定不要是關鍵字(key,value等),否則你執行sql的時候一直報錯,告訴你糟糕的sql語法,錯誤靠近###等  
     但是出於常理,我們肯定不會去想    是數據表的字段名出了問題,而是想sql語法,或者是值傳的有問題。
     但最後我還是發現了關鍵字的問題,因爲我用排除法排除所有結果,剩下的那個就是真相。
     因爲首先我們確保sql的語法是正確的,那麼錯誤就在數據上,首先將數據表字段的數據分爲幾類,比如字符串,int,和時間 ,然後逐個排除。
     1、先將sql中只留字符串類型,然後執行,看是否報錯,有錯說明在這幾個字符串中某些出了問題,在細分找;沒問題的話就下一步
     2、sql的插入條件只留int類型,然後執行,。。。。
     3、sql 中只留時間data類型,
     最後你就會發現,關鍵字的列會報錯,然後把名字改成普通的,就運行通過了!

2、這是修改後我批量查詢的sql:

<!-- 批量保存數據 -->
    <insert id="saveEnvConfig" parameterType="arrayList">  
            <selectKey resultType="java.lang.Integer" order="AFTER" keyProperty="id">
               SELECT @@IDENTITY AS id
          </selectKey>
        insert into envconfig(version,createTime,editTime,createUser,editUser,resourceID,envResourceID,envKey,envValue)values   
        <foreach collection="list" item="item"  index="index" separator=",">  
           (0,#{item.createTime},#{item.editTime},#{item.createUser},#{item.editUser},#{item.resourceID},#{item.envResourceID},#{item.envKey},#{item.envValue})   
        </foreach>  
    </insert>  

3、批量查詢出錯了,不要驚慌,先試試插入單條數據,如果單條插入數據也出錯,那麼原因很有可能就是數據的問題。

之後就是排除法一一知道找錯錯誤的那一列。

4、報錯的sql:

 insert into envconfig(version,createTime,editTime,createUser,editUser,resourceID,envResourceID,key,value) values
             (0,#{createTime},#{editTime},#{createUser},#{editUser},#{resourceID},#{envResourceID},#{key},#{value})  

5、報錯內容:

最後附上,調錯一定要細心,粗心大意會浪費你很多時間,寫到這裏,着重感謝劉**對我熱心的幫助。希望以後編程路上能永遠充滿激情,克服粗心,着急,手忙腳亂的壞習慣。

特別注意的情況:(批量更新不起作用)

二、mybatis實現批量更新,一直報錯,說我的sql語句不對,然後我仔細檢查了語句沒問題,還是執行不了,運行報錯。

原來,在連接數據庫的url中要加入 ?allowMultiQueries=true 這段,而且要放在第一行。

        url: jdbc:mysql://localhost:3306/crm?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8
        username: root
        password: root

三、mybatis  拼接sql:

1、概念:

   mybatis 標籤的一些關鍵字:

eg:  <select id="selectPersionByID"  parameterType="java.lang.String"

         resultMap="PersonResultMap">
            select * from person where id=#{id}
         </select>

1.id:sql 的唯一標識,

2.parameterType:傳遞給sql參數的數據類型,

3.resultMap:返回數據結果的類型,

4.#{id} :用於接收參數的語法,{}中的內容,如果是接收一個參數內容任意,可以使用

 select * from person where id=?  但#{} 使用預編譯的方式生成sql,防止sql的注入。

5.結果集 :resultMap 是可以直接寫javabena類名的,只要bean屬性和數據庫字段名一一對應,

 但實際上是因爲屬性名使用駝峯命名法,mysql是不區分大小寫的,(只有在數據庫字段名

都是單個字母的時候才成立,但是實際開發是要求字段見名知意的,所以一個單詞情況很少)因此多數情況

就需要構建結果集,

在mapper.xml的上面定義結果集,讓javabena 和數據庫字段一一對應,這樣數據庫就認識java字段了。

例如:

<resultMap id="PersonResultMap" type="com.feilong.person.model.Person" >
    <id column="id" property="id" jdbcType="INTEGER" />
    <result column="createTime" property="createTime" jdbcType="TIMESTAMP" />
    <result column="createUser" property="createUser" jdbcType="VARCHAR" />
    <result column="editTime" property="editTime" jdbcType="TIMESTAMP" />
    <result column="editUser" property="editUser" jdbcType="VARCHAR" />
    <result column="resourceID" property="resourceID" jdbcType="VARCHAR" />
    <result column="version" property="version" jdbcType="INTEGER" />
  </resultMap>

6.批量 增加 ,刪除 ,修改

  批量主要是foreach 標籤  就是循環遍歷的意思:

foreach一共有List,array,Map三種類型的使用場景。foreach的主要用在構建in條件中,它可以在SQL語句中進行迭代一個集合。

    item表示集合中每一個元素進行迭代時的別名,
    index指定一個名字,用於表示在迭代過程中,每次迭代到的位置,
    open表示該語句以什麼開始,
    separator表示在每次進行迭代之間以什麼符號作爲分隔 符,
    close表示以什麼結束。

1.List類型插入:

    <insert id="addPersons" parameterType="java.util.List" >
        INSERT INTO person (order_no,mac_id,client_code,status,order_time)
        <foreach collection="list" item="item" index="index" separator="union all">
             select #{item.orderNo, jdbcType=VARCHAR},#{item.macId, jdbcType=VARCHAR}
             from dual
        </foreach>
    </insert>

2.1List類型查詢:

    <select id="getPersonsList" parameterType="java.util.List" resultType="personResultMap">
        select * from person where id in
        <foreach collection="list" index="index" item="item" open="(" separator="," close=")">
            #{item}
        </foreach>
    </select>

3.參數array類型查詢:

    <select id="getPersonsById" parameterType="java.util.ArrayList" resultType="personResultMap">
         select * from person where id in
         <foreach collection="array" index="index" item="item" open="(" separator="," close=")">
              #{item}
         </foreach>
    </select>   

4.參數Map類型查詢:

map中存放了一個元素key爲ids,value爲List<String>用於id in的條件

    <select id="getPersonsList" parameterType="java.util.HashMap" resultType="personResultMap">
        select * from person where mac like "%"#{mac}"%" and id in
        <foreach collection="ids" index="index" item="item" open="(" separator="," close=")">
            #{item}
        </foreach>
    </select>

5、 resultType: 的接收
            1、基本類型  :resultType=基本類型
            2、List類型:   resultType=List中元素的類型
            3、Map類型    單條記錄:resultType =map
                                    多條記錄:resultType =Map中value的類型

6、dao.java 與 mapper.xml 的參數接收問題;

      通常我查詢的方法接收返回數據喜歡用對象接,方便get 和set, 比如多表聯合查詢結果,我會在model層單獨爲這個查詢語句建立javabean,設置屬性和查詢結果字段 一一對應,之後用dao層用 List<對象名> 作爲方法的返回參數,而 mapper 文件裏返回結果集就用我加的對象的全路徑類名。但是這樣查詢多的情況下需要建立很多的bean,對代碼維護不友好,於是可以用一下方法,用通用的list,map接參數。

     注意:使用對象的時候是resultType (返回不需要映射的查詢結果使用),使用結果集的是resultMap

例如:mybatis 的寫法: (返回值是map   ,方法接的是list<map<,>>)
    對應  mapper 。java   裏:
    public List<Map<String, String>> findIpByVersionManagementAndEnvironment(String versionManagementRid,String enResourceID){
        return versionManagementEnMapper.findIpByVersionManagementAndEnvironment(versionManagementRid,enResourceID);
    }
    對應 mapper。xml 裏 :
    <select id="findIpByVersionManagementAndEnvironment" resultType = "java.util.Map">
        SELECT DISTINCT
            i.resourceID,
            i.innerIP 
        FROM
            EnIp i
            INNER JOIN EnPort p ON i.resourceID = p.enIpResourceID 
            AND p.resourceID NOT IN ( SELECT DISTINCT t.enPortResourceID FROM ProjectTypeEn t INNER JOIN ProjectType y ON t.projectTypeResourceID = y.resourceID AND y.versionManagementRid = #{versionManagementRid}
            AND t.enPortResourceID IS NOT NULL AND t.enPortResourceID != "" ) 
        WHERE
            i.enEnvironmentResourceID =  #{enResourceID} 
    </select>

 

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