一、數據庫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>