本文目录导读:

在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);
}
}
最佳实践建议
- 区分场景:根据业务需求选择合适的填充方式
- 统一处理:对于创建时间、更新时间等通用字段,使用统一的自动填充方案
- 性能考虑:大量数据填充时考虑批处理
- 可追溯性:自动填充的数据应该能够通过日志追溯
- 异常处理:自动填充失败时要有合理的降级策略
选择哪种实现方式取决于你的具体业务场景和技术栈要求。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播