You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

用户创建新表后无对应模型类:Java有无无需模型类处理DDL/DML的框架?

Java中无需模型类处理DDL/DML操作的框架推荐

你遇到的这个场景太常见了——动态创建表后没法通过ORM框架访问,因为没有对应的实体类。好在Java生态里有不少工具/框架完全支持无模型类的数据库操作,下面给你列几个最实用的:

1. 原生JDBC

这是最基础也是最灵活的方式,完全不依赖任何模型类,直接写SQL语句执行就行。比如:

// 示例:创建表+插入数据+查询
try (Connection conn = DriverManager.getConnection(url, user, pwd);
     Statement stmt = conn.createStatement()) {
    // 执行DDL创建表
    stmt.execute("CREATE TABLE IF NOT EXISTS dynamic_table(id INT PRIMARY KEY, name VARCHAR(255))");
    // 执行DML插入数据
    stmt.executeUpdate("INSERT INTO dynamic_table VALUES(1, 'Test')");
    // 查询数据,用ResultSet处理结果
    ResultSet rs = stmt.executeQuery("SELECT * FROM dynamic_table");
    while (rs.next()) {
        System.out.println("ID: " + rs.getInt("id") + ", Name: " + rs.getString("name"));
    }
} catch (SQLException e) {
    e.printStackTrace();
}

优点是完全可控,缺点是需要自己处理连接、结果集的关闭,代码稍显繁琐。

2. Spring JDBC Template

Spring对JDBC的封装,简化了很多重复代码,同样支持无模型类操作:

@Autowired
private JdbcTemplate jdbcTemplate;

// 创建表
jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS dynamic_table(id INT PRIMARY KEY, name VARCHAR(255))");

// 插入数据(用参数占位符避免SQL注入)
jdbcTemplate.update("INSERT INTO dynamic_table VALUES(?, ?)", 1, "Test");

// 查询数据,返回Map列表(键为列名,值为对应数据)
List<Map<String, Object>> results = jdbcTemplate.queryForList("SELECT * FROM dynamic_table");
for (Map<String, Object> row : results) {
    System.out.println("ID: " + row.get("id") + ", Name: " + row.get("name"));
}

它帮你处理了连接管理、异常转换,比原生JDBC简洁很多,适合Spring项目。

3. MyBatis(含MyBatis-Plus)

MyBatis本身就支持原生SQL,不需要实体类,结果可以直接映射成Map<String, Object>:

// Mapper接口示例
@Mapper
public interface DynamicTableMapper {
    @Update("CREATE TABLE IF NOT EXISTS dynamic_table(id INT PRIMARY KEY, name VARCHAR(255))")
    void createDynamicTable();

    @Insert("INSERT INTO dynamic_table VALUES(#{id}, #{name})")
    void insertData(@Param("id") Integer id, @Param("name") String name);

    @Select("SELECT * FROM dynamic_table")
    List<Map<String, Object>> queryAllData();
}

MyBatis-Plus也可以用同样的方式,甚至还提供了动态SQL工具类,帮你更灵活地拼接SQL语句。

4. Apache DbUtils

这是一个轻量级的JDBC工具库,专门简化JDBC操作,同样支持无模型类:

QueryRunner runner = new QueryRunner(dataSource);
// 创建表
runner.update("CREATE TABLE IF NOT EXISTS dynamic_table(id INT PRIMARY KEY, name VARCHAR(255))");
// 插入数据
runner.update("INSERT INTO dynamic_table VALUES(?, ?)", 1, "Test");
// 查询数据,返回Map列表
List<Map<String, Object>> results = runner.query("SELECT * FROM dynamic_table", new MapListHandler());

它的API非常简洁,适合小型项目或者不想引入Spring的场景。

一些额外建议

  • 无论用哪种方式,都要注意SQL注入风险,尽量使用预编译语句(比如JDBC的PreparedStatement、Spring JDBC的参数占位符、MyBatis的#{})。
  • 如果你的场景是大量动态表操作,这类“无模型”的工具比JPA/Hibernate这类ORM框架更合适,因为后者强依赖实体类,动态场景下维护成本极高。

内容的提问来源于stack exchange,提问作者Lalit Jeevanlal Kohli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 19:13:10