当前位置: 首页 > news >正文

数据库对象实例化流程模板 + 常见错误

目录

一. 数据库建表

二. 创建实体类

2.1 字段类型与数据库类型对应关系

2.2 常用注解

2.3 示例

三. 创建 Mapper 接口

四. 创建 Mapper XML 映射文件

五. 配置application.yml

六. 编写测试用例

在Java项目中操作数据库要先将数据库对象实例化,其流程通常为:数据库建表——>创建实体类(PO/DO)——>创建 Mapper 接口——>创建 Mapper XML 映射文件——>配置application.yml——>编写测试用例

一. 数据库建表

这点没什么好说的,根据业务需求设计并创建数据库表,明确字段类型、主键、索引等约束。

二. 创建实体类

实体类(PO:Persistent Object / DO:Data Object)是数据库表在 Java 代码中的映射,一个表对应一个实体类,数据库字段对应实体类中的属性,表中的一行数据对应实体类的一个对象。有两个注意的点,一个是字段类型与数据库类型对应,一个是常用的注解。

2.1 字段类型与数据库类型对应关系

以下是字段类型与数据库类型对应关系的表格,常用的都在这里,但还是要根据业务规则有所调整

数据库类型(MySQL)Java 类型(推荐)说明
BIGINTLong范围大(-922 亿~922 亿),适合主键、大数值
INTInteger范围适中(-21 亿~21 亿),适合普通数值
TINYINTByteInteger

-Byte:节省内存(范围 -128~127),适合状态码(0/1/2)

-Integer:兼容性更好,无需考虑范围

VARCHAR(n)String字符串,适合名称、描述、ID 等文本
TEXT/LONGTEXTString长文本,适合大段内容
DATETIME/TIMESTAMPLocalDateTime- 线程安全、API 简洁、无时区问题- 替代旧版Date(线程不安全、API 繁琐)
DATELocalDate仅日期(年月日)
TIMELocalDate仅时间(时分秒)
DECIMAL(m,n)BigDecimal高精度数值,适合金额、价格(避免Double/Float精度丢失)
BIT(1)/BOOLEANBoolean布尔值(true/false)

注意事项:

  • 金额字段绝对不用Double/Float:必须用BigDecimal,否则会出现0.1 + 0.2 = 0.30000000000000004的精度问题
  • 主键用Long:即使数据库是INT,也建议用 Long,避免后续数据量超过INT范围(-21 亿~21 亿)
  • 字段可空性:数据库字段允许NULL时,Java 类型用包装类(如IntegerLong),不用基本类型(如intlong),因为基本类型不能存NULL

2.2 常用注解

1. Lombok 注解(必用,简化代码)

Lombok 可以自动生成 getter/setter/toString/ 构造方法等,无需手动写。

注解作用示例
@Data自动生成:gettersettertoStringequalshashCode直接加在类上
@NoArgsConstructor自动生成无参构造方法必须加,MyBatis/Spring 实例化对象时需要
@AllArgsConstructor自动生成全参构造方法可选,方便创建对象时赋值
@Builder支持链式调用创建对象可选,代码更优雅

2. ORM 映射注解(根据框架选择)

如果是Spring Data JPA框架,则需要加以下注解

注解作用示例
@Entity标识这是一个 JPA 实体类加在类上
@Table(name = "表名")指定实体类对应的数据库表名@Table(name = "group_buy_activity")
@Id标识主键字段加在主键字段上
@GeneratedValue(strategy = GenerationType.IDENTITY)主键自增策略(对应数据库AUTO_INCREMENT加在@Id下方
@Column(name = "数据库字段名")显式指定字段映射(可选,默认自动下划线转驼峰)@Column(name = "activity_id")

如果用的是MyBatis,实体类不需要 ORM 注解,只需通过 XML 里的resultMap映射字段即可

2.3 示例

package cn.qimingxing.infrastructure.dao.po; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import java.time.LocalDateTime; /** * 拼团活动实体类(对应数据库表:group_buy_activity) */ @Data // 自动生成 getter/setter/toString/equals/hashCode @Builder // 支持链式调用创建对象 @AllArgsConstructor // 自动生成全参构造方法 @NoArgsConstructor // 自动生成无参构造方法(必须加!) public class GroupBuyActivity { /** 自增ID(对应数据库:id) */ private Long id; /** 活动ID(对应数据库:activity_id) */ private Long activityId; /** 来源(对应数据库:source) */ private String source; /** 渠道(对应数据库:channel) */ private String channel; /** 商品ID(对应数据库:goods_id) */ private String goodsId; /** 折扣ID(对应数据库:discount_id) */ private String discountId; /** 拼团方式(0自动成团、1达成目标拼团)(对应数据库:group_type) */ private Integer groupType; /** 拼团次数限制(对应数据库:take_limit_count) */ private Integer takeLimitCount; /** 拼团目标(对应数据库:target) */ private Integer target; /** 拼团时长(分钟)(对应数据库:valid_time) */ private Integer validTime; /** 活动状态(0创建、1生效、2过期、3废弃)(对应数据库:status) */ private Integer status; /** 活动开始时间(对应数据库:start_time) */ private LocalDateTime startTime; // 推荐用 LocalDateTime,替代 Date /** 活动结束时间(对应数据库:end_time) */ private LocalDateTime endTime; /** 人群标签规则标识(对应数据库:tag_id) */ private String tagId; /** 人群标签规则范围(对应数据库:tag_scope) */ private String tagScope; /** 创建时间(对应数据库:create_time) */ private LocalDateTime createTime; /** 更新时间(对应数据库:update_time) */ private LocalDateTime updateTime; }
// 用 @Builder 链式调用创建对象,代码更优雅 GroupBuyActivity activity = GroupBuyActivity.builder() .activityId(1001L) .source("APP") .channel("WECHAT") .goodsId("G001") .discountId("D001") .groupType(0) .takeLimitCount(1) .target(3) .validTime(15) .status(1) .startTime(LocalDateTime.now()) .endTime(LocalDateTime.now().plusDays(7)) .build();

三.创建 Mapper 接口

这一步主要是定义操作数据库的方法,注意方法的返回值一般需要用到上一步定义的实体类

要注意两点:

  • 添加@Mapper注解,让 Spring 扫描并注册为 Bean
  • 若接口不在启动类子包下,需在启动类添加@MapperScan("包路径")

四.创建 Mapper XML 映射文件

这里有标准模板

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- 1. namespace:必须是 Dao 接口的全类名(点分隔,不带 .java) --> <mapper namespace="cn.qimingxing.infrastructure.dao.IGroupBuyActivityDao"> <!-- 2. 结果映射:数据库字段 <-> 实体类字段 --> <resultMap id="BaseResultMap" type="cn.qimingxing.infrastructure.dao.po.GroupBuyActivity"> <!-- 主键字段 --> <id column="id" property="id"/> <!-- 普通字段 --> <result column="activity_id" property="activityId"/> <result column="source" property="source"/> <result column="channel" property="channel"/> <result column="goods_id" property="goodsId"/> <result column="create_time" property="createTime"/> </resultMap> <!-- 4. 查询语句 --> <select id="queryGroupBuyActivityList" resultMap="BaseResultMap"> select * from 表名 </select> </mapper>
<mapper namespace="cn.qimingxing.infrastructure.dao.IGroupBuyActivityDao">

namespace = 绑定 Dao 接口,MyBatis 根据这个路径找到对应的接口。

注意:

  • 必须是 Dao 接口的全类名
  • 必须用. 分隔,不能用 /
  • 不能带 .java 后缀
<resultMap id="BaseResultMap" type="cn.qimingxing.infrastructure.dao.po.GroupBuyActivity"> <id column="id" property="id"/> <result column="activity_id" property="activityId"/> </resultMap>

作用:把数据库下划线字段自动映射成Java 驼峰字段

属性解释

  • id:给这个映射规则起个名字(随便起,但要唯一)
  • type:对应的实体类全类名(必须正确,不能带 .java)

内部标签

  • <id>:主键字段
  • <result>:普通字段

两个关键属性

  • column="xxx"数据库字段名
  • property="xxx"实体类字段名
<!-- 4. 查询语句 --> <select id="queryGroupBuyActivityList" resultMap="BaseResultMap"> select * from 表名 </select>

✔ 属性解释

  • id必须和 Dao 接口方法名完全一样
  • resultMap:使用上面定义的映射规则
  • resultType:直接写实体类(二选一,不要同时写)

五.配置application.yml

通用模板

# ========================================== # 1. Spring Boot 基础配置 # ========================================== spring: # 应用名称(随便起,方便识别) application: name: your-application-name # ========================================== # 2. 数据库连接配置(核心,必须改占位符) # ========================================== datasource: # 数据库 URL:格式 jdbc:mysql://IP:端口/数据库名?参数 url: jdbc:mysql://localhost:3306/your_database_name?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false&serverTimezone=Asia/Shanghai # 数据库账号(替换为你的账号) username: your_database_username # 数据库密码(替换为你的密码) password: your_database_password # MySQL 8+ 驱动(固定写法,不用改;MySQL 5.x 用 com.mysql.jdbc.Driver) driver-class-name: com.mysql.cj.jdbc.Driver # ========================================== # 3. HikariCP 连接池配置(Spring Boot 默认,优化性能,通用推荐值) # ========================================== hikari: # 连接池名称(随便起) pool-name: HikariCP-Pool # 最小空闲连接数(推荐 5-15) minimum-idle: 10 # 最大连接数(推荐 10-50,根据服务器配置调整) maximum-pool-size: 20 # 空闲连接存活时间(毫秒,默认 600000=10分钟) idle-timeout: 300000 # 连接最长生命周期(毫秒,默认 1800000=30分钟) max-lifetime: 1800000 # 连接超时时间(毫秒,默认 30000=30秒) connection-timeout: 30000 # 连接有效性检测 SQL(MySQL 固定写 SELECT 1;Oracle 写 SELECT 1 FROM DUAL) connection-test-query: SELECT 1 # ========================================== # 4. MyBatis 核心配置(最关键!) # ========================================== mybatis: # 【必配】指定 Mapper XML 文件的位置(classpath: 对应 src/main/resources 目录) mapper-locations: classpath:mapper/*.xml # 【推荐配】指定实体类所在包(替换为你的实体类包路径),简化 XML 中 resultType 的写法 type-aliases-package: com.example.project.po # 【推荐配】MyBatis 全局配置 configuration: # 【核心推荐】自动下划线转驼峰(开启后,数据库 activity_id 自动映射到实体类 activityId,不用写 resultMap) map-underscore-to-camel-case: true # 【调试用】打印 SQL 语句到控制台(方便看 SQL 有没有执行、参数对不对;生产环境可关闭) log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 开启二级缓存(可选,提升性能) cache-enabled: true # 开启延迟加载(可选,提升性能) lazy-loading-enabled: true # ========================================== # 5. 服务端口配置 # ========================================== server: # 服务端口(默认 8080,可改成任意未被占用的端口) port: 8080 # ========================================== # 6. 日志配置(可选,方便调试) # ========================================== logging: level: # 配置 Mapper 接口所在包的日志级别为 DEBUG(打印更详细的 SQL 信息) com.example.project.dao: debug # 全局日志级别(INFO/WARN/ERROR) root: info # 日志文件路径(可选,生产环境建议配置) file: name: logs/your-application-name.log

这一点要注意配置数据库的四个主要字段

配置项含义
url数据库连接地址
username数据库账号
password数据库密码
driver-class-name数据库驱动

MyBatis配置,主要作用是告诉 MyBatis去哪里找 Mapper XML 文件、怎么映射字段、要不要打印 SQL。如果提前配置好XML文件地址,那么这一步可以提前做。

六. 编写测试用例

这点没啥好说的,用@Resource或@Autowired注入第三步编写的Mapper接口,调用里面的方法进行测试即可。

http://www.jsqmd.com/news/622065/

相关文章:

  • RTX 4090用户必看:Anything to RealCharacters 2.5D转真人引擎环境部署与性能调优
  • 从电机驱动到激光雕刻:STM32F4主从定时器实战,搞定任意频率与脉冲个数的可编程脉冲发生器
  • 基于LSTM与注意力机制,浅析OFA模型文本生成的内部逻辑
  • 薪酬绩效体系如何解决人效困局?德锐咨询的实战方法论
  • 苹果+三星联手!玻璃基板,或将改写AI芯片格局
  • 8、如何提高webpack的构建速度?
  • 2026市政照明工程公司TOP5推荐:选品维度全解析 - 优质品牌商家
  • CoPaw实战体验:在QQ/钉钉里部署你的专属AI助手,数据全在本地
  • 开源可部署研报系统:Pixel Epic与LangChain集成实现多源知识检索
  • 罗技鼠标宏终极指南:5分钟学会PUBG压枪脚本配置
  • translategemma-12b-it图文翻译模型快速体验:支持文本与图片翻译
  • 软考高项·信息系统项目管理师 备考攻略(作文专题)
  • ViT模型在MySQL数据库中的图像分类结果存储方案
  • 10 亿欧元砸向欧洲!TikTok 布局不止为合规
  • 春联生成模型效果展示:输入‘幸福‘、‘平安‘,生成工整对联
  • 基于Multisim的电子材料设计灵感:结合Graphormer预测新型半导体分子
  • Qwen3-VL-8B环境配置详解:Anaconda虚拟环境与依赖包安装
  • 嵌入式GUI位图字体工程:Material Design字体资源实践
  • 避坑指南:Windows/Linux下Java串口通信库RXTX与jSerialComm选型及配置详解
  • PyTorch 2.8开源镜像教程:预装Git的模型代码版本控制与远程仓库同步
  • 从向心力到万有引力
  • 两行命令,MiniMax 给 Agent 安了五条腿
  • Pixel Aurora Engine 在数字孪生中的应用:根据IoT数据生成设备状态可视化面板
  • 效果实测:实时手机检测-通用模型识别精度与速度展示
  • 仅限R 4.5+用户解锁:利用Rprofmem增强版+ profvis 4.0精准定位内存泄漏点(含3个未公开的GC hook技巧)
  • LLM 算法岗 | 八股问答()· 多模态与主流模型架构曰
  • OpenClaw日志分析实战:百川2-13B-4bits量化模型错误排查助手
  • OFDM 技术如何推动5G与未来通信的革新
  • SDMatte效果展示:细碎边缘无断裂+透明区域灰度渐变真实
  • 从鱼群识别到沉船探测:聊聊水下目标检测的5个真实应用场景与技术选型