补充:建立实体类与数据表的映射关系
目录
前言
1 成员变量数据类型和字段类型 保持对应
2 成员变量的变量名,应采用小驼峰命名法
3 数据表中的主键如id 应采用自增方式
4 数据表中的时间类型数据与实体类中的时间类型的变量无法实现自动映射可以使用@JsonFormat 注解
4.1 配置全局时间处理器,替换@JsonFormat 注解
4.2 在Spring Boot中,可以通过配置文件设置默认格式
前言
暂且补充这么多,之后在学习或工作中遇到了,继续完善!
1 成员变量数据类型和字段类型 保持对应
如下图所示:
数据库的字段类型 | 实体类的属性数据类型 |
char/varchar/text[文本型] | String |
int [数值型] | Integer |
bigint | Long |
double | Double |
decimal | BigDecimal |
举例:
实体包 entity: student ,user 类
注意:数据库中 data/time/datetime 字段类型 ,对应在Java中有两种形式:
- Java.util.Date
- java.sql.Date
但我们推荐使用Java.util.Date
原因
这里 存在向上转型:Java.util.Date 是java.sql.Date 的父类
2 成员变量的变量名,应采用小驼峰命名法
如 数据表 字段 user_name 对应在实体类中 userName
示例
数据表
对应的实体类
3 数据表中的主键如id 应采用自增方式
如:
1,数据表中的主键(id)没有采用自增,当我们使用id查询,修改,删除,操作是无法进行的!
2 ,数据表主键开始创建表时没有添加,后添加,当查询该表全部数据时,主键id显示为null,当需要id时,要人为修改
示例
service层的借阅方法代码
public Result borrowBook(Borrow borrow) {/*判断是否借过1 观察图书库存,如果还存在,则借书,如果小于1,则借书失败*/Book book = bookService.selectBookById(borrow.getBookId());Integer Stock = book.getStock();if (Stock > 0) {borrow.setStatus(1);borrow.setBorrowDate(DateUtil.getCurrentDateTime());if (borrowMapper.insert(borrow) > 0) {System.out.println("当前图书:"+book);// 更新图书库存book.setStock(Stock - 1);book.setBookId(borrow.getBookId());bookService.brUpdateBook(book);return Result.success("借书成功");}return Result.error("500", "借书失败");}return Result.error("500", "库存不足");}
测试结果,观察打印的当前图书
发现查询不到主键id, 解决办法是 显示设置id
数据表
4 数据表中的时间类型数据与实体类中的时间类型的变量无法实现自动映射可以使用@JsonFormat 注解
使用@JsonFormat 注解 需要添加json依赖
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.0</version></dependency>
@JsonFormat 的作用
序列化(Java → JSON):将 Date/LocalDateTime 等时间类型按照指定格式转换成 JSON 字符串。
反序列化(JSON → Java):将 JSON 字符串按照指定格式解析成 Java 时间类型。
注意:数据表数据与实体类数据的映射也是通过json格式数据传递,符合序列化与反序列化
示例
场景1:数据库时间字段 ↔ 实体类 ↔ JSON
import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date;public class User {@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")private Date createTime; // 对应数据库的 datetime/timestamp 字段// getter & setter
}
数据库存储:2023-10-01 12:00:00(MySQL DATETIME)
Java 对象:java.util.Date 类型
浏览器输出结果
//JSON 输出:
{"createTime": "2023-10-01 12:00:00"
}
场景2:配合 LocalDateTime(Java 8+)
import com.fasterxml.jackson.annotation.JsonFormat;
import java.time.LocalDateTime;public class Order {@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private LocalDateTime orderTime; // 对应数据库的 datetime/timestamp 字段// getter & setter
}
数据库存储:2023-10-01 12:00:00(MySQL DATETIME)
Java 对象:LocalDateTime 类型
浏览器输出结果
//JSON 输出:
{"orderTime": "2023-10-01 12:00:00"
}
4.1 配置全局时间处理器,替换@JsonFormat 注解
- 如果不想在每个字段上使用注解,可以在配置类中设置全局格式
@Configuration
public class JacksonConfig {@Beanpublic ObjectMapper objectMapper() {ObjectMapper mapper = new ObjectMapper();mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));mapper.setTimeZone(TimeZone.getTimeZone("GMT+8"));return mapper;}
}
4.2 在Spring Boot中,可以通过配置文件设置默认格式
# application.properties
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8