頭引入 -->
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<!--concat_ws(",",company_address,company_detail_address)-->
結果map映射-->
<resultMap id="itemPublish" type="itemPublish" >
<id column="id" property="id" jdbcType="BIGINT" />
<result column="platform_id" property="platformId" jdbcType="BIGINT" />
<result column="seller_id" property="sellerId" jdbcType="BIGINT" />
<result column="shop_id" property="shopId" jdbcType="BIGINT" />
<result column="supply_seller_id" property="supplySellerId" jdbcType="BIGINT" />
<result column="supply_shop_id" property="supplyShopId" jdbcType="BIGINT" />
<result column="operator_id" property="operatorId" jdbcType="BIGINT" />
<result column="item_name" property="itemName" jdbcType="VARCHAR" />
<result column="cid" property="cid" jdbcType="BIGINT" />
<result column="second_cid" property="secondCid" jdbcType="BIGINT" />
<result column="brand_id" property="brandId" jdbcType="BIGINT" />
<result column="unit" property="unit" jdbcType="VARCHAR" />
<result column="origin" property="origin" jdbcType="VARCHAR" />
<result column="ad" property="ad" jdbcType="VARCHAR" />
<result column="industry_label" property="industryLabel" jdbcType="VARCHAR" />
<result column="category_attributes" property="categoryAttributes" jdbcType="VARCHAR" />
<result column="spec_attributes" property="specAttributes" jdbcType="VARCHAR" />
<result column="sale_status" property="saleStatus" jdbcType="INTEGER" />
<result column="packing_list" property="packingList" jdbcType="VARCHAR" />
<result column="describe_url" property="describeUrl" jdbcType="VARCHAR" />
<result column="created" property="created" jdbcType="TIMESTAMP"/>
<result column="modified" property="modified" jdbcType="TIMESTAMP" />
<result column="shop_cid" property="shopCid" jdbcType="BIGINT" />
<result column="listing_time" property="listingTime" jdbcType="TIMESTAMP" />
<result column="delisting_time" property="delistingTime" jdbcType="TIMESTAMP"/>
<result column="operator" property="operator" jdbcType="INTEGER" />
<result column="add_source" property="addSource" jdbcType="INTEGER" />
<result column="store_status" property="storeStatus" jdbcType="INTEGER" />
<result column="yn" property="yn" jdbcType="INTEGER" />
<result column="sku_type" property="skuType" jdbcType="INTEGER" />
<result column="attributes" property="attributes" jdbcType="INTEGER" />
<result column="model_code" property="modelCode" jdbcType="INTEGER" />
<result column="bar_code" property="barCode" jdbcType="INTEGER" />
<result column="product_code" property="productCode" jdbcType="INTEGER" />
<result column="sku_status" property="skuStatus" jdbcType="INTEGER" />
<result column="weight" property="weight" jdbcType="INTEGER" />
<result column="picture_url" property="pictureUrl" jdbcType="VARCHAR" />
<result column="alt_images" property="altImages" jdbcType="VARCHAR" />
<result column="sort_number" property="sortNumber" jdbcType="INTEGER" />
<result column="copy_status" property="copyStatus" jdbcType="INTEGER" />
<result column="publishuserId" property="publishuserId" jdbcType="BIGINT" />
<result column="cash_coupon_support" property="cashCouponSupport" jdbcType="INTEGER" />
<result column="meet_coupon_support" property="meetCouponSupport" jdbcType="INTEGER" />
<result column="vip_discount_support" property="vipDiscountSupport" jdbcType="INTEGER" />
<result column="detail_page_qrcode" property="detailPageQrcode" jdbcType="VARCHAR" />
</resultMap>
若resultMap中jdbcType與mysql中有不同 (例如庫中數據是tyint類型/對象中是String類型),可以自動轉化,,可以set到對象中
標籤定義-->
<sql id="Example_Where_Clause" >
<where >
<foreach collection="oredCriteria" item="criteria" separator="or" >
<if test="criteria.valid" >
<trim prefix="(" suffix=")" prefixOverrides="and" >
<foreach collection="criteria.criteria" item="criterion" >
<choose >
<when test="criterion.noValue" >
and ${criterion.condition}
</when>
<when test="criterion.singleValue" >
and ${criterion.condition} #{criterion.value}
</when>
<when test="criterion.betweenValue" >
and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
</when>
<when test="criterion.listValue" >
and ${criterion.condition}
<foreach collection="criterion.value" item="listItem" open="(" close=")" separator="," >
#{listItem}
</foreach>
</when>
</choose>
</foreach>
</trim>
</if>
</foreach>
</where>
</sql>
insert語句-->
<insert id="itemPublish" parameterType="item" useGeneratedKeys="true" keyProperty="id">
insert into item (platform_id, seller_id,
shop_id, supply_seller_id, supply_shop_id, operator_id,
item_name, cid,second_cid, brand_id,
unit, origin, ad,
category_attributes, spec_attributes, sale_status,
packing_list, describe_url, created,
modified, shop_cid, listing_time,
delisting_time, operator,
add_source, store_status, yn,copy_status,publishuserId,industry_label,
cash_coupon_support,meet_coupon_support,vip_discount_support,detail_page_qrcode
)
values ( #{platformId,jdbcType=BIGINT}, #{sellerId,jdbcType=BIGINT},
#{shopId,jdbcType=BIGINT}, #{supplySellerId,jdbcType=BIGINT}, #{supplyShopId,jdbcType=BIGINT}, #{operatorId,jdbcType=INTEGER},
#{itemName,jdbcType=VARCHAR}, #{cid,jdbcType=BIGINT},#{secondCid}, #{brandId,jdbcType=BIGINT},
#{unit,jdbcType=VARCHAR}, #{origin,jdbcType=VARCHAR}, #{ad,jdbcType=VARCHAR},
#{categoryAttributes,jdbcType=VARCHAR}, #{specAttributes,jdbcType=VARCHAR}, #{saleStatus,jdbcType=INTEGER},
#{packingList,jdbcType=VARCHAR}, #{describeUrl,jdbcType=VARCHAR}, now(),
now(),#{shopCid,jdbcType=BIGINT},#{listingTime,jdbcType=TIMESTAMP},
#{delistingTime,jdbcType=TIMESTAMP}, #{operator,jdbcType=INTEGER},
#{addSource,jdbcType=INTEGER},#{storeStatus,jdbcType=INTEGER},1,#{copyStatus,jdbcType=INTEGER}, #{publishuserId,jdbcType=BIGINT},#{industryLabel,jdbcType=VARCHAR},
#{cashCouponSupport,jdbcType=INTEGER},#{meetCouponSupport,jdbcType=INTEGER},#{vipDiscountSupport,jdbcType=INTEGER},#{detailPageQrcode,jdbcType=VARCHAR}
)
</insert>
<insert id="insertSelective" parameterType="com....ItemImport" >
insert into item_import_tmp
<trim prefix="(" suffix=")" suffixOverrides="," >
<if test="id != null" >
id,
</if>
<if test="platformId != null" >
platform_id,
</if>
<if test="itemName != null" >
item_name,
</if>
<if test="batchNo != null" >
batch_no,
</if>
<if test="state != null" >
state,
</if>
<if test="failNum != null" >
fail_num,
</if>
<if test="failReason != null" >
fail_reason,
</if>
<if test="created != null" >
created,
</if>
<if test="modified != null" >
modified,
</if>
<if test="yn != null" >
yn,
</if>
<if test="itemInfo != null" >
item_info,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides="," >
<if test="id != null" >
#{id,jdbcType=BIGINT},
</if>
<if test="platformId != null" >
#{platformId,jdbcType=BIGINT},
</if>
<if test="itemName != null" >
#{itemName,jdbcType=VARCHAR},
</if>
<if test="batchNo != null" >
#{batchNo,jdbcType=VARCHAR},
</if>
<if test="state != null" >
#{state,jdbcType=INTEGER},
</if>
<if test="failNum != null" >
#{failNum,jdbcType=INTEGER},
</if>
<if test="failReason != null" >
#{failReason,jdbcType=VARCHAR},
</if>
<if test="created != null" >
#{created,jdbcType=TIMESTAMP},
</if>
<if test="modified != null" >
#{modified,jdbcType=TIMESTAMP},
</if>
<if test="yn != null" >
#{yn,jdbcType=INTEGER},
</if>
<if test="itemInfo != null" >
#{itemInfo,jdbcType=LONGVARCHAR},
</if>
</trim>
</insert>
<!-- 批量添加item_picture信息 -->
<insert id="insertItemPictureList" parameterType="java.util.List">
insert into item_picture( platform_id, item_id, shop_id, seller_id, picture_url,alt_images, sort_number, created, modified, yn)
values
<foreach collection="list" item="itemPicture" index="index" separator=",">
(#{itemPicture.platformId,jdbcType=BIGINT},
#{itemPicture.itemId,jdbcType=BIGINT},
#{itemPicture.shopId,jdbcType=BIGINT},
#{itemPicture.sellerId,jdbcType=BIGINT},
#{itemPicture.pictureUrl,jdbcType=VARCHAR},
#{itemPicture.altImages,jdbcType=VARCHAR},
#{itemPicture.sortNumber,jdbcType=INTEGER},
now(),now(), 1)
</foreach>
</insert>
刪除語句-->
<delete id="deleteByPrimaryKey" parameterType="java.lang.Long" >
delete from item_import_tmp
where id = #{id,jdbcType=BIGINT}
</delete>
<delete id="deleteByExample" parameterType="com.jd.ecc.b2b.item.domain.item.domain.ItemImportExample" >
delete from item_import_tmp
<if test="_parameter != null" >
<include refid="Example_Where_Clause" />
</if>
</delete>
修改語句-->
<update id="updateSaleStatus" parameterType="map">
UPDATE item
<set>
store_status = #{storeStatus},
<if test="saleStatus != null">
sale_status = #{saleStatus}
</if>
</set>
WHERE id = #{itemId}
AND platform_id = #{platformId}
</update>
<update id="updateItem" parameterType="itemPublish">
update item set
operator_id=#{operatorId,jdbcType=INTEGER},item_name=#{itemName,jdbcType=VARCHAR},cid=#{cid,jdbcType=BIGINT},second_cid=#{secondCid},brand_id=#{brandId,jdbcType=BIGINT},
unit=#{unit,jdbcType=VARCHAR},origin=#{origin,jdbcType=VARCHAR},ad=#{ad,jdbcType=VARCHAR},category_attributes=#{categoryAttributes,jdbcType=VARCHAR},
spec_attributes=#{specAttributes,jdbcType=VARCHAR},sale_status=#{saleStatus},store_status = #{storeStatus},
packing_list=#{packingList,jdbcType=VARCHAR},describe_url=#{describeUrl,jdbcType=VARCHAR},shop_cid=#{shopCid,jdbcType=BIGINT},
operator=#{operator,jdbcType=INTEGER},industry_label=#{industryLabel},
cash_coupon_support=#{cashCouponSupport},meet_coupon_support=#{meetCouponSupport},vip_discount_support=#{vipDiscountSupport}
<if test="publishuserId != null">
,publishuserId=#{publishuserId}
</if>
where id=#{id,jdbcType=BIGINT} and platform_id=#{platformId} and yn=1
</update>
查詢語句 -->
<select id="queryItems" parameterType="sellSupplyItemInfoVo" resultMap="SellSupplyItemMap">
select DISTINCT i.id itemId,i.platform_id, i.item_name, sii.supply_seller_id, sii.supply_shop_id,ip.picture_url,
category.cname1, category.cname2, category.cname3, category.cname4
from shop_item_library sii
JOIN item i
on sii.item_id=i.id
and i.store_status = 30
and sii.supply_status = 0
JOIN item_picture ip
on i.id = ip.item_id
LEFT JOIN item_sku isk
on i.id = isk.item_id
LEFT JOIN item_brand ib
on i.brand_id = ib.id
JOIN
(
SELECT c4.c_name cname1,c3.c_name cname2,c2.c_name cname3,c1.c_name cname4,c1.cid cid
FROM item_category c1
LEFT JOIN item_category c2 ON c1.parent_cid = c2.cid
LEFT JOIN item_category c3 ON c2.parent_cid = c3.cid
LEFT JOIN item_category c4 ON c3.parent_cid = c4.cid
WHERE
c1.platform_id = #{platformId}
<if test="cid != null and cid != ''">
And c1.cid= #{cid}
</if>
) category ON i.cid = category.cid
where sii.supply_seller_id = #{supplySellerId}
AND i.platform_id = #{platformId}
<if test="productCode != null and productCode != ''">
AND isk.product_code LIKE CONCAT('%', #{productCode},'%' )
</if>
<if test="modelCode != null and modelCode != ''">
AND isk.model_code LIKE CONCAT('%', #{modelCode},'%' )
</if>
<if test="itemName != null and itemName != ''">
AND i.item_name LIKE CONCAT('%', #{itemName},'%' )
</if>
</select>
<select id="selectByExample" resultMap="BaseResultMap" parameterType="com....ItemImportExample" >
select
<if test="distinct" >
distinct
</if>
'true' as QUERYID,
<include refid="Base_Column_List" />
from item_import_tmp
<if test="_parameter != null" >
<include refid="Example_Where_Clause" />
</if>
<if test="orderByClause != null" >
order by ${orderByClause}
</if>
</select>
時間判斷
<if test="endTime != null">
AND up.audit_time < DATE_ADD(#{endTime}, INTERVAL 1 DAY)
</if>
一次更新多條:
<update id="batchUpdate" parameterType="list">
update item_category
<trim prefix="set" suffixOverrides=",">
<trim prefix="cate_code_path =case" suffix="end,">
<foreach collection="list" item="i" index="index">
<if test="i.cateCodePath!=null">
when (cid = #{i.cid} and platform_id = #{i.platformId}) then #{i.cateCodePath}
</if>
</foreach>
</trim>
<trim prefix="cate_name_path =case" suffix="end," >
<foreach collection="list" item="i" index="index">
<if test="i.cateNamePath!=null">
when (cid = #{i.cid} and platform_id = #{i.platformId}) then #{i.cateNamePath}
</if>
</foreach>
</trim>
</trim>
where
<foreach collection="list" separator="or" item="i" index="index">
(cid = #{i.cid} and platform_id = #{i.platformId})
</foreach>
</update>
MapperSQL常見問題
1、我們在寫sql的時候,在WHERE 條件中會寫這樣的語句:
<if test="wmHasRead != null and wmHasRead !=''"><![CDATA[AND wm_has_read = #{wmHasRead}]]></if>
此時要注意wmHasRead 這個字段是Integer類型,我們用了<if test="wmHasRead != null and wmHasRead !=''">來判斷是否執行此條件,那麼這樣即使這個字段你傳了正確的值也不會執行,去掉標黃色部分就好了,應爲mybatis底層會檢測此字段的類型,類型不予數據庫中相符會自動跳過這個字段。
2、SELECT E_Name FROM Employees_China
UNION ALL
SELECT E_Name FROM Employees_USA
默認地,UNION 操作符選取不同的值。如果允許重複的值,請使用 UNION ALL。
3、DISTINCT用法,跟在select 後方,去除重複的行
4、有時候我們XML憑藉的SQL過於複雜,調試bug的時候如果想打印sql的話SpringBoot用如下配置,標紅爲dao接口路徑
logging.level.com.csdn.bspo.system.dao.mapper=debug
5、DATE_FORMAT(WARRANTY_END_TIME,'%Y-%m-%d %H:%i:%S')函數可以吧sql中的時間格式化,通常用來查詢,但是如果將它用來進行時間範圍查詢的話邊界會查詢不出,and DATE_FORMAT(WARRANTY_END_TIME,'%Y-%m-%d %H:%i:%S') = "2019-11-14 00:00:00",此處即時你的數據庫timestamp時間是2019-11-14 00:00:00也查詢不出,可以用去掉函數直接比較的方式
最後說一下CDATA 區段的用法:
<select id="queryItemCategoryAttrIds" resultType="java.lang.String">
<![CDATA[
SELECT concat(id,'-',uuid) as uuid
FROM item_category_attr_import_tmp icit
WHERE icit.platform_id = #{platformId} AND icit.yn = 1 AND icit.status in(10,40)
and icit.try_num < 5
]]>
ORDER BY try_num
limit 500
</select>
假如您在 XML 文檔中放置了一個類似 "<" 字符,那麼這個文檔會產生一個錯誤,在 XML 中有 5 個預定義的實體引用:
< | < | 小於 |
> | > | 大於 |
& | & | 和號 |
' | ' | 省略號 |
" | " | 引號 |
在 XML 元素中,"<" 和 "&" 是非法的。
"<" 會產生錯誤,因爲解析器會把該字符解釋爲新元素的開始。
"&" 也會產生錯誤,因爲解析器會把該字符解釋爲字符實體的開始。
關於 CDATA 部分的註釋:
CDATA 部分不能包含字符串 "]]>"。也不允許嵌套的 CDATA 部分。
標記 CDATA 部分結尾的 "]]>" 不能包含空格或折行。
注: where 1=1 在特殊的環境會報錯,如果我們有特殊需要的話不能寫,
<insert id="itemPublish" parameterType="item" useGeneratedKeys="true" keyProperty="id"> 主鍵返回,
也有insert多條,返回insert條數的寫法
推薦1:自動尋找DAOmapper方法對應XMLsql的插件:myBatisCodeHelperPro插件,mapper中擊小鳥直接飛到對應的xml, 自動創建xml, 如果沒有對應的xml會報紅, alt+Enter會自動生成對應的xml-不過SQL需要自己寫。。
推薦2:mybatis熱部署 插件 JRebel
和IDEA自帶的tomcat熱部署區別: 本身默認的只能進行方法修改的熱部署,及靜態資源文件的熱部署
意味着:一個Module的開發除了日常的開關機、切換Module,從開始到結束 只需要 Ctrl + f9
Jrebal需要破解 http://blog.csdn.net/lsgqjh/article/details/52848172