定时任务及list集合数据入库mybatis对应sql书写

本文介绍如何将yyMMdd时间格式转换为yyyy-MM-dd样式,以及如何在Spring框架中配置定时任务,实现方法的自动定时执行。同时,还提供了将List集合数据批量插入数据库的MyBatis示例。

1、yyMMdd时间格式转换为yyyy-MM-dd时间样式

    function reverseTo(value, row, index) {
        return changeDateFormat(value)
    }

    function changeDateFormat(cellval) {

        if (cellval.length == 8) {
            valDate = cellval.substring(0, 4) + "-" + cellval.substring(4, 6) + "-" + cellval.substring(6, 8);
            return valDate;
        } else if (cellval.length == 6) {
            valDate = cellval.substring(0, 4) + "-" + cellval.substring(4, 6);
            return valDate;
        }
        return valDate;
    }

2、自动定时执行:在方法上配置注解
@Lazy(false)
@Scheduled(cron = “0/5 * * * * ?”):每隔5秒执行一次
并在spring-context.xml中配置:
xmlns:tx=“http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
然后加入:<task:annotation-driven /> 自动扫描任务

3、将list集合数据插入数据的方法:

    <insert id="insertTimeInfo" parameterType="java.util.List" useGeneratedKeys="true">
        insert into AWX_VIP_KEY_INFO_DAILY
        (cust_name, vip_card, vip_cust_name, crm_cust_id, latn_id, create_date, state_date, state,
        domain_name, key_cn_nbr, manager_id, cust_star,rela_phs_nbr,staff_name,area_path,etl_state,file_id,vipkey_type)
        values
        <!--该collection针对list集合必须将参数设置为对应所要插入的集合keyInfoList-->
        <foreach collection="keyInfoList" item="item" index="index" separator=",">
            (
            #{item.custName},
            #{item.vipCard},
            #{item.vipCustName},
            #{item.crmCustId},
            #{item.latnId},
            #{item.createDate},
            #{item.stateDate},
            #{item.state},
            #{item.domainName},
            #{item.keyCnNbr},
            #{item.managerId},
            #{item.custStar},
            #{item.relaPhsNbr},
            #{item.staffName},
            #{item.areaPath},
            #{item.etlState},
            #{item.fileId},
            #{item.vipkeyType}
            )
        </foreach>
    </insert>
<think>好的,我现在需要帮助用户解决如何基于提供的Java类和数据库表结构,使用MyBatis实现带有标签判断的数据插入操作。首先,我需要仔细分析用户提供的类和表结构,确保理解各个字段的对应关系。 用户提到的类有三个:TaskEBomDTO、TaskEBomHDTO和TaskEBomLDTO。根据命名,可能HDTO对应头表,LDTO对应行项目。数据库表有t_pdm_task_ebom_head和t_pdm_task_ebom_item,分别存储头信息和明细项。需要确认每个DTO对应哪个表,以及字段映射是否正确。 接下来,标签判断逻辑是关键。用户提到需要根据标签判断,可能是指某些字段需要根据特定条件进行设置。例如,如果标签存在或符合某种条件,就设置对应的字段值。需要明确标签的判断条件是什么,比如根据某个字段的值或存在性来决定其他字段的赋值。 然后,考虑MyBatis的实现方式。通常,插入操作需要编写Mapper接口,定义插入方法,并在XML文件中编写SQL语句。对于批量插入,可以使用MyBatis的foreach标签。同时,标签判断可能需要使用动态SQL,如<if>标签来处理条件逻辑。 需要确保事务管理,因为插入头表和明细项需要在一个事务中完成,要么全部成功,要么回滚。Spring的@Transactional注解可以用于此。 另外,主键生成方式需要注意。数据库表设计中的主键是自增还是采用其他策略?如果是自增,在插入头表后,需要获取生成的主键ID,并设置到明细项的headId中。MyBatis的useGeneratedKeys和keyProperty属性可以实现这一点。 可能的步骤: 1. 插入头表数据,获取生成的主键。 2. 遍历TaskEBomDTO中的明细列表,为每个明细项设置headId。 3. 插入明细项数据,处理标签判断逻辑,动态生成对应的字段值。 在XML文件中,动态SQL会根据标签条件判断是否需要设置某些字段。例如,如果标签存在,则设置对应的列值,否则可能设为默认值或null。 需要检查字段类型和数据库类型是否匹配,避免插入错误。例如,日期类型的处理,是否需要进行格式转换。 最后,编写Service层代码,调用Mapper方法,并确保事务正确管理。测试时,需验证标签判断逻辑是否正确应用,数据是否准确插入到相应的表中。</think>根据您的需求,结合MyBatis实现逻辑,以下是分步骤的解决方案(Java代码与SQL实现): 一、数据结构对应关系 1. 表头结构对应: ```java // t_pdm_task_ebom_head public class TaskEBomHDTO { private String projectCode; // 项目编码 private String tag; // 标签字段 private String version; // 版本号 private LocalDateTime createTime; // 创建时间 } ``` 2. 明细项结构对应: ```java // t_pdm_task_ebom_item public class TaskEBomLDTO { private String headId; // 关联头表ID private String componentCode; // 组件编码 private String tagFlag; // 标签标记 private Integer quantity; // 数量 } ``` 二、MyBatis Mapper实现 1. Mapper接口定义: ```java public interface TaskEBomMapper { // 插入头表 @Options(useGeneratedKeys = true, keyProperty = "id") int insertHead(TaskEBomHDTO head); // 批量插入明细 int batchInsertItems(@Param("list") List<TaskEBomLDTO> items); } ``` 2. XML映射文件实现: ```xml <!-- 头表插入 --> <insert id="insertHead"> INSERT INTO t_pdm_task_ebom_head (project_code, version, create_time, <if test="tag != null and tag != ''">tag,</if> status) VALUES (#{projectCode}, #{version}, NOW(), <if test="tag != null and tag != ''">#{tag},</if> 0) </insert> <!-- 明细表批量插入 --> <insert id="batchInsertItems"> INSERT INTO t_pdm_task_ebom_item (head_id, component_code, quantity, <if test="item.tagFlag != null">tag_flag,</if> create_time) VALUES <foreach collection="list" item="item" separator=","> (#{item.headId}, #{item.componentCode}, #{item.quantity}, <if test="item.tagFlag != null">#{item.tagFlag},</if> NOW()) </foreach> </insert> ``` 三、服务层实现 ```java @Service @Transactional public class TaskEBomService { @Autowired private TaskEBomMapper taskEBomMapper; public void saveEBom(List<TaskEBomDTO> dtos) { for (TaskEBomDTO dto : dtos) { // 插入头表 TaskEBomHDTO head = convertToHead(dto); taskEBomMapper.insertHead(head); // 转换明细项 List<TaskEBomLDTO> items = dto.getItems().stream() .map(item -> { TaskEBomLDTO l = new TaskEBomLDTO(); l.setHeadId(head.getId()); l.setComponentCode(item.getCode()); l.setQuantity(item.getQty()); // 标签判断逻辑 if ("SPECIAL".equals(head.getTag())) { l.setTagFlag("FLAG_" + item.getType()); } return l; }).collect(Collectors.toList()); // 批量插入明细 taskEBomMapper.batchInsertItems(items); } } private TaskEBomHDTO convertToHead(TaskEBomDTO dto) { // 转换逻辑实现 } } ``` 四、关键实现点说明 1. 标签判断逻辑: - 头表标签判断:通过MyBatis的`<if>`标签动态生成插入字段,当tag字段存在时才会插入数据库 - 明细标签标记:在服务层根据头表tag值动态设置明细项的tag_flag字段 2. 事务管理: 使用`@Transactional`注解保证头表和明细表的插入操作原子性,任何一步失败都会回滚整个事务[^1] 3. 主键回传: 通过`@Options(useGeneratedKeys = true)`实现插入头表后自动回传生成的主键ID到head对象
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值