本文目录导读:

在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);
}
}
最佳实践建议
- 区分场景:根据业务需求选择合适的填充方式
- 统一处理:对于创建时间、更新时间等通用字段,使用统一的自动填充方案
- 性能考虑:大量数据填充时考虑批处理
- 可追溯性:自动填充的数据应该能够通过日志追溯
- 异常处理:自动填充失败时要有合理的降级策略
选择哪种实现方式取决于你的具体业务场景和技术栈要求。