分类 数据库 下的文章

什么是事务

事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。事务可大可小,在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序。

技术背景

RuoYi-vue 前后端分离

举个例子:

订单表和订单详情表进行插入操作。

出现的问题

ps:如何查看失败的原因: 日志

插入订单表成功 但是插入订单详情表失败

解决方案:

做法非常简单,我们只需要在方法或类添加@Transactional注解即可,下面方法位于OrderService.

@Transactional
public int insertOrder(Order order)
{
    // 新增订单信息
    int rows = orderMapper.insertOrder(order);
    
    // 新增用户与订单详情
    insertOrderItem(order);
    return rows;
}

参考

https://blog.csdn.net/u012102536/article/details/123485318
http://doc.ruoyi.vip/ruoyi/document/htsc.html#%E4%BA%8B%E5%8A%A1%E7%AE%A1%E7%90%86

mybatis系列教程:单表数据操作

以文章列表为例。

文章表结构设计

id :编号
article_title :标题
article_content :内容
article_type :文章类型
................:略了几个字段
代码

1:Controller

1.1 查询 List<DrArticles> list = drArticlesService.selectDrArticlesList(drArticles);

2:Bean

@Data
public class DrArticles extends BaseEntity
{
    private static final long serialVersionUID = 1L;
    private Integer id;
    private String articleTitle;
    private String articleType;
    private String articleContent;
    private String createNickname;
}

3:Service

4:Mapper

5:mybatis xml文件

<?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">
<mapper namespace="com.system.mapper.DrArticlesMapper">
    
    <resultMap type="DrArticles" id="DrArticlesResult">
        <result property="id"    column="id"    />
        <result property="articleTitle"    column="article_title"    />
        <result property="articleType"    column="article_type"    />
        <result property="articleContent"    column="article_content"    />
        <result property="createBy"    column="create_by"    />
        <result property="createTime"    column="create_time"    />
        <result property="updateBy"    column="update_by"    />
        <result property="updateTime"    column="update_time"    />
        <result property="remark"    column="remark"    />
        <result property="createNickname"    column="create_nickname"    />
    </resultMap>

    <sql id="selectDrArticlesVo">
        select id, article_title, article_type, article_content, create_by, create_time, update_by, update_time, remark, create_nickname from dr_articles
    </sql>

    <select id="selectDrArticlesList" parameterType="DrArticles" resultMap="DrArticlesResult">
        <include refid="selectDrArticlesVo"/>
        <where>  
            <if test="articleTitle != null  and articleTitle != ''"> and article_title = #{articleTitle}</if>
            <if test="articleType != null  and articleType != ''"> and article_type = #{articleType}</if>
            <if test="articleContent != null  and articleContent != ''"> and article_content = #{articleContent}</if>
            <if test="createNickname != null  and createNickname != ''"> and create_nickname like concat('%', #{createNickname}, '%')</if>
        </where>
    </select>
    <select id="selectDrArticlesById" parameterType="Integer" resultMap="DrArticlesResult">
        <include refid="selectDrArticlesVo"/>
        where id = #{id}
    </select>  
    <insert id="insertDrArticles" parameterType="DrArticles" useGeneratedKeys="true" keyProperty="id">
        insert into dr_articles
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="articleTitle != null">article_title,</if>
            <if test="articleType != null">article_type,</if>
            <if test="articleContent != null">article_content,</if>
            <if test="createBy != null">create_by,</if>
            <if test="createTime != null">create_time,</if>
            <if test="updateBy != null">update_by,</if>
            <if test="updateTime != null">update_time,</if>
            <if test="remark != null">remark,</if>
            <if test="createNickname != null">create_nickname,</if>
         </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="articleTitle != null">#{articleTitle},</if>
            <if test="articleType != null">#{articleType},</if>
            <if test="articleContent != null">#{articleContent},</if>
            <if test="createBy != null">#{createBy},</if>
            <if test="createTime != null">#{createTime},</if>
            <if test="updateBy != null">#{updateBy},</if>
            <if test="updateTime != null">#{updateTime},</if>
            <if test="remark != null">#{remark},</if>
            <if test="createNickname != null">#{createNickname},</if>
         </trim>
    </insert>
    <update id="updateDrArticles" parameterType="DrArticles">
        update dr_articles
        <trim prefix="SET" suffixOverrides=",">
            <if test="articleTitle != null">article_title = #{articleTitle},</if>
            <if test="articleType != null">article_type = #{articleType},</if>
            <if test="articleContent != null">article_content = #{articleContent},</if>
            <if test="createBy != null">create_by = #{createBy},</if>
            <if test="createTime != null">create_time = #{createTime},</if>
            <if test="updateBy != null">update_by = #{updateBy},</if>
            <if test="updateTime != null">update_time = #{updateTime},</if>
            <if test="remark != null">remark = #{remark},</if>
            <if test="createNickname != null">create_nickname = #{createNickname},</if>
        </trim>
        where id = #{id}
    </update>

    <delete id="deleteDrArticlesById" parameterType="Integer">
        delete from dr_articles where id = #{id}
    </delete>

    <delete id="deleteDrArticlesByIds" parameterType="String">
        delete from dr_articles where id in 
        <foreach item="id" collection="array" open="(" separator="," close=")">
            #{id}
        </foreach>
    </delete>

</mapper>

技术依赖:如无特殊说明;所有配置和技术选型均采用Ruoyi-vue快速开发框架

    SpringBoot
    Mybatis
    Mysql 
    vue-element ui

说明:一个订单中有多种商品;所以有一个订单表有一个订单详情表

说明问题:

企业微信截图_20240920103124.png

表结构设计:
订单表:order

     order_id 订单表ID
     

订单详情表:order_items

    id :详情表ID
    order_id:订单表ID
    goods_id:商品ID

增加订单:
Controller层代码:

mybatis xml的写法

collection主要是应对表关系是一对多的情况
property:属性
javaType:

<resultMap>
     <result property="orderId"    column="order_id"    />
     <result property="goodsAmount"    column="goods_amount"    />
     <collection property="orderItems" column="dept_id" javaType="java.util.List" resultMap="orderItemsResult" />
</resultMap>

<resultMap id="YshopOrderItemsResult" type="orderItems">
    <id  property="id"  column="id" />
    <result property="goodsId" column="goods_id"/>
    <result property="price" column="price"/>
</resultMap>

也可以这样写

 <resultMap type="YshopGoodsType" id="YshopGoodsTypeResult">
    <result property="id"    column="id"    />
    <result property="name"    column="name"    />
    <result property="params"    column="params"    />
    <collection property="students" ofType="Student">
        <result property="id" column="sid"/>
        <result property="name" column="sname"/>
        <result property="tid" column="tid"/>
    </collection>
    <collection property=""></collection>
</resultMap>

SQL语句

前端返回一条详情信息

 /*java代码*/
 public Order selectById()
  select * from order left join order_items on order.id=order_items.order_id where order.id=100;

方式二:mybatis 一对多查询方式二

相关文章:

    《事务的处理》
     https://blog.csdn.net/weixin_46645338/article/details/123987406
     https://blog.csdn.net/weixin_45877245/article/details/119821218

[1]:

项目开发中,性能是我们比较关注的问题,特别是数据库的性能;作为一个开发,经常和SQL语句打交道,想要写出合格的SQL语句,我们需要了解SQL语句在数据库中是如何扫描表、如何使用索引的。
0:Index Scan 索引扫描


- 阅读剩余部分 -