oracle转Java实体类
2026-06-14 23:51:54
  • oracle转Java实体类
介绍


下面给你一套 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; 即可关闭相关注解。

网站标签
热门标签
最新站点