Java案例怎么实现自动填充?

wen java案例 58

本文目录导读:

Java案例怎么实现自动填充?

  1. 表单自动填充(前端+后端)
  2. MyBatis Plus 自动填充(数据库字段自动填充)
  3. Excel 数据导入自动填充
  4. 数据库级自动填充(触发器)
  5. 完整示例:订单自动填充
  6. 使用 AOP 实现自动填充
  7. 最佳实践建议

在Java中实现自动填充(AutoFill)功能,主要有以下几种常见场景和实现方式:

表单自动填充(前端+后端)

前端实现(HTML + JavaScript)

<!DOCTYPE html>
<html>
<head>
    <script>
        // 自动填充地址信息
        function autoFillAddress(zipCode) {
            // 模拟从数据库获取数据
            const addressData = {
                '100001': { province: '北京', city: '北京', district: '东城区' },
                '200001': { province: '上海', city: '上海', district: '黄浦区' }
            };
            const data = addressData[zipCode];
            if (data) {
                document.getElementById('province').value = data.province;
                document.getElementById('city').value = data.city;
                document.getElementById('district').value = data.district;
            }
        }
    </script>
</head>
<body>
    <input type="text" id="zipCode" onblur="autoFillAddress(this.value)">
    <input type="text" id="province">
    <input type="text" id="city">
    <input type="text" id="district">
</body>
</html>

后端实现(Spring Boot)

@RestController
public class AddressController {
    @Autowired
    private AddressService addressService;
    @GetMapping("/api/address/auto-fill")
    public ResponseEntity<AddressDTO> autoFillAddress(@RequestParam String zipCode) {
        AddressDTO address = addressService.getAddressByZipCode(zipCode);
        return ResponseEntity.ok(address);
    }
}

MyBatis Plus 自动填充(数据库字段自动填充)

场景:自动填充创建时间、更新时间等字段

// 1. 创建实体类
@Data
@TableName("user")
public class User {
    @TableId
    private Long id;
    private String username;
    private String email;
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;
    @TableField(fill = FieldFill.INSERT)
    private String createBy;
}
// 2. 实现元对象处理器
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        this.strictInsertFill(metaObject, "createTime", Date.class, new Date());
        this.strictInsertFill(metaObject, "updateTime", Date.class, new Date());
        this.strictInsertFill(metaObject, "createBy", String.class, 
            SecurityContextHolder.getContext().getAuthentication().getName());
    }
    @Override
    public void updateFill(MetaObject metaObject) {
        this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date());
    }
}

Excel 数据导入自动填充

public class ExcelAutoFillExample {
    public void importExcelWithAutoFill() {
        String filePath = "data.xlsx";
        try (Workbook workbook = new XSSFWorkbook(new FileInputStream(filePath))) {
            Sheet sheet = workbook.getSheetAt(0);
            for (Row row : sheet) {
                if (row.getRowNum() == 0) continue; // 跳过表头
                // 1. 读取基本数据
                String name = getCellValue(row.getCell(0));
                String idCard = getCellValue(row.getCell(1));
                // 2. 自动填充数据
                int age = calculateAge(idCard);  // 根据身份证计算年龄
                String gender = getGender(idCard); // 根据身份证获取性别
                Date birthDate = getBirthDate(idCard); // 根据身份证获取出生日期
                // 3. 创建完整对象
                Person person = new Person();
                person.setName(name);
                person.setIdCard(idCard);
                person.setAge(age);
                person.setGender(gender);
                person.setBirthDate(birthDate);
                // 保存到数据库
                personMapper.insert(person);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    // 辅助方法
    private String getCellValue(Cell cell) {
        if (cell == null) return "";
        return cell.getStringCellValue();
    }
    private int calculateAge(String idCard) {
        if (idCard.length() != 18) return 0;
        String birthStr = idCard.substring(6, 14);
        try {
            Date birthDate = new SimpleDateFormat("yyyyMMdd").parse(birthStr);
            return Period.between(
                birthDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(),
                LocalDate.now()
            ).getYears();
        } catch (ParseException e) {
            return 0;
        }
    }
}

数据库级自动填充(触发器)

-- MySQL 触发器示例
CREATE TRIGGER before_insert_user 
BEFORE INSERT ON users 
FOR EACH ROW 
BEGIN
    -- 自动填充创建时间
    SET NEW.create_time = NOW();
    -- 自动填充更新时间
    SET NEW.update_time = NOW();
    -- 自动填充默认状态
    SET NEW.status = 'ACTIVE';
    -- 生成用户编号(自动填充)
    SET NEW.user_no = CONCAT('USR', DATE_FORMAT(NOW(), '%Y%m%d'), 
        LPAD((SELECT IFNULL(MAX(SUBSTR(user_no, 11)), 0) + 1 FROM users 
        WHERE SUBSTR(user_no, 5, 8) = DATE_FORMAT(NOW(), '%Y%m%d')), 4, '0'));
END;

完整示例:订单自动填充

@Service
public class OrderService {
    @Transactional
    public Order createOrder(OrderRequest request) {
        Order order = new Order();
        // 1. 自动填充订单号
        order.setOrderNo(generateOrderNo());
        // 2. 自动填充用户信息(从当前登录用户获取)
        User currentUser = getCurrentUser();
        order.setUserId(currentUser.getId());
        order.setUserName(currentUser.getUsername());
        // 3. 自动填充商品信息
        Product product = productMapper.selectById(request.getProductId());
        order.setProductName(product.getName());
        order.setProductPrice(product.getPrice());
        // 4. 自动计算金额
        order.setQuantity(request.getQuantity());
        order.setTotalAmount(product.getPrice().multiply(
            new BigDecimal(request.getQuantity())));
        // 5. 自动填充时间
        order.setCreateTime(new Date());
        order.setStatus("PENDING");
        // 6. 保存订单
        orderMapper.insert(order);
        return order;
    }
    private String generateOrderNo() {
        return "ORD" + LocalDateTime.now()
            .format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))
            + String.format("%04d", 
                (int)(Math.random() * 10000));
    }
}

使用 AOP 实现自动填充

@Aspect
@Component
public class AutoFillAspect {
    @Around("@annotation(autoFill)")
    public Object handleAutoFill(ProceedingJoinPoint joinPoint, 
                                 AutoFill autoFill) throws Throwable {
        // 获取方法参数
        Object[] args = joinPoint.getArgs();
        for (Object arg : args) {
            if (arg instanceof BaseEntity) {
                BaseEntity entity = (BaseEntity) arg;
                if (autoFill.create()) {
                    entity.setCreateTime(new Date());
                    entity.setUpdateTime(new Date());
                } else if (autoFill.update()) {
                    entity.setUpdateTime(new Date());
                }
            }
        }
        return joinPoint.proceed();
    }
}
// 自定义注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoFill {
    boolean create() default false;
    boolean update() default false;
}
// 使用示例
@Service
public class UserService {
    @AutoFill(create = true)
    public int insertUser(User user) {
        return userMapper.insert(user);
    }
    @AutoFill(update = true)
    public int updateUser(User user) {
        return userMapper.updateById(user);
    }
}

最佳实践建议

  1. 区分场景:根据业务需求选择合适的填充方式
  2. 统一处理:对于创建时间、更新时间等通用字段,使用统一的自动填充方案
  3. 性能考虑:大量数据填充时考虑批处理
  4. 可追溯性:自动填充的数据应该能够通过日志追溯
  5. 异常处理:自动填充失败时要有合理的降级策略

选择哪种实现方式取决于你的具体业务场景和技术栈要求。

抱歉,评论功能暂时关闭!