下面给你一套 PHP 在线读取 Oracle 表结构、自动生成 Java 实体类 完整代码,可直接部署运行,支持:
Oracle 表字段读取
字段类型自动映射 Java 类型
下划线字段名 → 驼峰命名
自动生成 MyBatis-Plus / 普通 Java 实体
带注释、@TableName、@TableId、Lombok 注解
环境要求:PHP 开启 OCI8 扩展(连接 Oracle 必备)
一、完整代码:oracle_to_java_entity.php
php运行
<?phpheader("Content-Type: text/html; charset=utf-8");// ====================== 1. Oracle 数据库配置(自行修改)======================$db_host = '127.0.0.1';$db_port = '1521';$db_service = 'ORCL'; // 服务名/SID$db_user = 'SCOTT'; // 用户名$db_pwd = '123456'; // 密码$table_name = trim($_GET['table'] ?? 'USER_INFO'); // 接收表名// 包名、作者、类注释$package = "com.example.entity";$author = "admin";$useLombok = true; // 是否启用 @Data$useMP = true; // 是否生成 MyBatis-Plus 注解// ====================== 2. 类型映射规则 Oracle -> Java ======================$typeMap = [
'VARCHAR2' => 'String',
'NVARCHAR2' => 'String',
'CHAR' => 'String',
'NCHAR' => 'String',
'CLOB' => 'String',
'BLOB' => 'byte[]',
'DATE' => 'LocalDateTime',
'TIMESTAMP' => 'LocalDateTime',];// ====================== 3. 下划线转驼峰函数 ======================function toCamelCase($str){
$str = strtolower($str);
$str = ucwords(str_replace('_', ' ', $str));
$str = lcfirst(str_replace(' ', '', $str));
return $str;}// ====================== 4. 连接 Oracle ======================$connStr = "(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=$db_host)(PORT=$db_port))(CONNECT_DATA=(SERVICE_NAME=$db_service)))";$conn = oci_connect($db_user, $db_pwd, $connStr, 'AL32UTF8');if (!$conn) {
$e = oci_error();
die("Oracle 连接失败:" . htmlentities($e['message']));}// ====================== 5. 查询表字段、注释 ======================$sql = "
SELECT
c.COLUMN_NAME,
c.DATA_TYPE,
c.DATA_PRECISION,
c.DATA_SCALE,
cc.COMMENTS
FROM USER_TAB_COLUMNS c
LEFT JOIN USER_COL_COMMENTS cc
ON c.TABLE_NAME = cc.TABLE_NAME
AND c.COLUMN_NAME = cc.COLUMN_NAME
WHERE UPPER(c.TABLE_NAME) = UPPER(:table)
ORDER BY c.COLUMN_ID
";$stid = oci_parse($conn, $sql);oci_bind_by_name($stid, ":table", $table_name);oci_execute($stid);$columns = [];while ($row = oci_fetch_assoc($stid)) {
$columns[] = $row;}// 查询主键$pkSql = "
SELECT col.COLUMN_NAME
FROM USER_CONSTRAINTS con
JOIN USER_CONS_COLUMNS col
ON con.CONSTRAINT_NAME = col.CONSTRAINT_NAME
WHERE con.TABLE_NAME = UPPER(:table)
AND con.CONSTRAINT_TYPE = 'P'
";$pkStid = oci_parse($conn, $pkSql);oci_bind_by_name($pkStid, ":table", $table_name);oci_execute($pkStid);$pkColumn = '';if ($pkRow = oci_fetch_assoc($pkStid)) {
$pkColumn = $pkRow['COLUMN_NAME'];}oci_free_statement($stid);oci_free_statement($pkStid);oci_close($conn);if (empty($columns)) {
die("未找到表:" . htmlentities($table_name));}// ====================== 6. 组装 Java 实体代码 ======================$tableUpper = strtoupper($table_name);$className = toCamelCase(ucwords(strtolower($table_name), '_'));$classCode = [];// 包名$classCode[] = "package {$package};";$classCode[] = "";// 导入包$imports = [];$imports[] = "import java.io.Serializable;";$hasDecimal = false;$hasTime = false;foreach ($columns as $col) {
$dt = $col['DATA_TYPE'];
$scale = (int)$col['DATA_SCALE'];
if ($dt === 'NUMBER' && $scale > 0) {
$hasDecimal = true;
}
if (in_array($dt, ['DATE', 'TIMESTAMP'])) {
$hasTime = true;
}}if ($hasDecimal) $imports[] = "import java.math.BigDecimal;";if ($hasTime) $imports[] = "import java.time.LocalDateTime;";if ($useMP) {
$imports[] = "import com.baomidou.mybatisplus.annotation.TableName;";
$imports[] = "import com.baomidou.mybatisplus.annotation.TableId;";}if ($useLombok) {
$imports[] = "import lombok.Data;";}$imports = array_unique($imports);foreach ($imports as $imp) {
$classCode[] = $imp;}$classCode[] = "";// 类注释$classCode[] = "/**";$classCode[] = " * 实体类 对应表:{$tableUpper}";$classCode[] = " * @author {$author}";$classCode[] = " */";// 类注解if ($useLombok) $classCode[] = "@Data";if ($useMP) $classCode[] = "@TableName(\"{$tableUpper}\")";$classCode[] = "public class {$className} implements Serializable {";$classCode[] = "";// 字段foreach ($columns as $col) {
$colName = $col['COLUMN_NAME'];
$colCamel = toCamelCase($colName);
$colType = $col['DATA_TYPE'];
$scale = (int)$col['DATA_SCALE'];
$comment = trim($col['COMMENTS'] ?? '');
// 判定 Java 类型
if ($colType === 'NUMBER') {
if ($scale > 0) {
$javaType = 'BigDecimal';
} else {
$prec = (int)$col['DATA_PRECISION'];
$javaType = $prec > 10 ? 'Long' : 'Integer';
}
} else {
$javaType = $typeMap[$colType] ?? 'String';
}
// 字段注释
$classCode[] = " /** {$comment} */";
// 主键注解
if ($useMP && $colName === $pkColumn) {
$classCode[] = " @TableId";
}
// 字段定义
$classCode[] = " private {$javaType} {$colCamel};";
$classCode[] = "";}// 收尾$classCode[] = "}";// 拼接最终代码$finalCode = implode("\n", $classCode);?><!DOCTYPE html><html><head>
<meta charset="UTF-8">
<title>Oracle 转 Java 实体类生成器</title>
<style>
textarea {width: 100%; height: 600px; padding:10px; font-family:Consolas; font-size:14px;}
.box {max-width:1200px; margin:20px auto;}
input {padding:6px; width:300px;}
button {padding:6px 16px; cursor:pointer;}
</style></head><body><div>
<h3>Oracle 表 → Java 实体类生成器</h3>
<form method="get">
输入表名(大写/小写均可): <input type="text" name="table" value="<?php echo htmlspecialchars($table_name) ?>" placeholder="例如 USER_INFO">
<button type="submit">生成实体</button>
</form>
<br>
<textarea readonly><?php echo htmlspecialchars($finalCode) ?></textarea></div></body></html>
二、使用前配置(必做)
开启 PHP OCI8 扩展
Windows:修改 php.ini 开启 extension=oci8,并配置 Oracle 客户端环境变量
Linux:编译安装 OCI8 扩展 + 安装 Oracle Instant Client
修改代码顶部数据库信息
php运行
$db_host = '你的OracleIP';$db_port = '1521';$db_service = '你的服务名/SID';$db_user = '用户名';$db_pwd = '密码';$package = "com.example.entity"; // 生成的包名$author = "作者名";$useLombok = true; // 是否使用 @Data$useMP = true; // 是否使用 MyBatis-Plus 注解
三、功能说明
自动类型映射规则
VARCHAR2/NVARCHAR2/CHAR/CLOB → String
NUMBER(整数位) → Integer / Long(精度 > 10 用 Long)
NUMBER(带小数) → BigDecimal(金额 / 小数专用,防精度丢失)
DATE / TIMESTAMP → LocalDateTime
BLOB → byte[]
命名转换Oracle 下划线命名字段 → Java 标准驼峰命名例:USER_NAME → userName
自动识别主键自动查询表主键,给主键字段加上 @TableId
自动带入字段注释Oracle 字段注释直接转为 Java 文档注释
可开关:
Lombok @Data
MyBatis-Plus @TableName / @TableId
四、使用方式
将文件放到 PHP 网站目录,访问:
plaintext
http://域名/oracle_to_java_entity.php?table=你的表名
页面输入表名,点击生成实体
下方文本框直接复制全部代码,保存为 .java 文件即可使用
五、运行效果示例
假设 Oracle 表 USER_INFO:plaintext
USER_ID NUMBER(19) 主键
USER_NAME VARCHAR2(50)
AGE NUMBER(3)
SALARY NUMBER(10,2)
CREATE_TIME TIMESTAMP
生成结果示例:java运行
package com.example.entity;import java.io.Serializable;import java.math.BigDecimal;import java.time.LocalDateTime;import com.baomidou.mybatisplus.annotation.TableName;import com.baomidou.mybatisplus.annotation.TableId;import lombok.Data;/**
* 实体类 对应表:USER_INFO
* @author admin
*/@Data@TableName("USER_INFO")public class UserInfo implements Serializable {
/** */
@TableId
private Long userId;
/** */
private String userName;
/** */
private Integer age;
/** */
private BigDecimal salary;
/** */
private LocalDateTime createTime;}
六、常见问题排查
OCI 连接失败
检查 OCI8 扩展是否启用
检查 Oracle IP、端口、服务名、账号密码
服务器需安装 Oracle 客户端
查不到表 / 字段
确认表名属于当前登录用户
表名区分大小写,程序已做 UPPER() 兼容
时间类型不想用 LocalDateTime修改 $typeMap:php
运行
'DATE' => 'Date','TIMESTAMP' => 'Date',
并补充导入 import java.util.Date;
不需要 MyBatis-Plus设置 $useMP = false; 即可关闭相关注解。