环境: MySQL5.6,jdk1.8
建议: 所有的参数加上 @Param
resultMap 的意义: 将查询中得到的结果通过属性的 setter 方法注入属性里. 如果未定义 resultMap, 则虽然数据库查询成功了但会返回 null
insert
插入自增主键
如果设置了自增主键, 那插入时, 主键字段的值必须为 0, 否则不会自增;
插入字段后返回自增主键的值
- <insert id="insert" parameterType="com.iss.blog.po.Article" useGeneratedKeys="true" keyProperty="article.articleId">
- INSERT INTO ub_article
(article_id,......
- article_create_time,article_modify_time
- )
- VALUES (#{article.articleId},#{article.userId},......
- #{article.articleCreateTime,jdbcType=TIMESTAMP}, #{article.articleModifyTime,jdbcType=TIMESTAMP})
- </insert>
设置
useGeneratedKeys="true"
并且制定主键 keyProperty; 这样在插入成功后就会调用 keyProperty 的 setter 方法回填主键. 注意, 必须加上 @Param, 否则会报错.
插入成功返回 1; 失败返回 0
插入时间字段
三步:
类字段使用 java.util.Date, 数据库字段使用 DATETIME, 在插入的 value 值使用 timestamp, 比如
#{article.articleCreateTime,jdbcType=TIMESTAMP}
MySQL5.7 版本在时间字段上处理不好, 如果有问题可以参考 mysql 5.7 之后版本 datetime 默认值设置'0000-00-00' https://www.cnblogs.com/eDevelop/p/7081061.html
不存在则插入
- insert IGNORE into bd_article_tag_map (article_id,article_tag_id)
- values (#{articleTagMap.articleId}, #{articleTagMap.articleTagId})
关键是设置数据库字段为 unique, 这里设置了联合 2 个字段 unique; 根据 unique 字段来判断是否插入, 插入成功返回 1, 失败返回 0;
update
如果字段非空, 则更新
- <update id="updateByArticleId" parameterType="com.iss.blog.po.Article">
- UPDATE ub_article
- <set>
- <if test="articleTitle!=null">
- article_title =#{articleTitle},
- </if>
- <if test="articleSummary!=null">
- article_summary=#{articleSummary},
- </if>
- <if test="articleClick!=-1">
- article_click=#{articleClick},
- </if>
- </set>
- WHERE article_id=#{articleId}
- </update>
注意: 字段后面的逗号, 不可省略
delete
foreach 的用法
接口方法
- public int deleteIfNotExist(@Param("articleId")int articleId,@Param("list") List<Integer> tagIdList);
- xml
- <delete id="deleteIfNotExist" parameterType="java.util.List">
- DELETE FROM bd_article_tag_map
- WHERE article_id=#{articleId}
- AND article_tag_id NOT IN
- <foreach item="item" index="index" collection="list" open="(" separator="," close=")">
- #{item}
- </foreach>
- </delete>
- select
left join 联合查询
join 的意义: 把两个表的属性加起来
left join 的意义: 左表的属性会全部显示, 右表的属性缺少则填 null
- <select id="selectByArticleId" resultMap="TagResultMap" parameterType="int">
- SELECT * FROM bd_article_tag t1
- LEFT JOIN bd_article_tag_map t2 ON t1.article_tag_id = t2.article_tag_id
- WHERE t2.article_Id = #{articleId}
- </select>
下面的 article_id 字段在两个表中都存在, 必须加上表前缀; 这里表前缀需要写成表的别名, 否则会报错找不到此字段.
- <select id="selectArticleListByArticleTagId" resultMap="ArticleResultMap" parameterType="int">
- SELECT t1.article_id,user_id,article_archive_id,
- article_title,
- article_summary,article_click,article_status,
- article_type,article_publish,article_original,
- article_create_time,article_modify_time
- FROM ub_article t1
- LEFT JOIN bd_article_tag_map t2 ON t1.article_id = t2.article_id
- WHERE t2.article_tag_id = #{articleTagId}
- </select>
来源: http://www.bubuko.com/infodetail-2581266.html