本来是打算使用Hibernate的O/R映射,因为Hibernate能够将JavaBean映射成数据库表,现在把这个过程逆转过来,将数据库表反映射成JavaBean,在网上找了很多资料,貌似没太详细的说明,如果大家有这方面的资料,请留言,大家讨论,这可能是一个比较难的问题,不过应该可以解决,这里征求一下大家的实现方法。
由于使用Hibernate的方法实现不出来,只能使用最笨的方法:
1.新建一个与待拷贝的表属性一样的表,包括字段名、字段类型、大小等的属性,这里可以使用JDBC来实现,今天测试一下,可以使用两种方法
(1)使用SQL语句来读出数据库字段属性,然后把其转了javaBean,具体实现:
select column_name,data_type from information_schema.columns where table_name = '表名';
使用查询的方法把表结构读出来,然后讲字段名和类型组合成JavaBean,通过Hibernate生成新的数据库表,这里使用JDBC查询,这里的DBInfo是保存数据库字段信息的javaBean:
public List<DBInfo> getDBDesc() throws SQLException { List<DBInfo> list = new ArrayList<DBInfo>(); Connection conn = DBInit.getConnection(); String sql = "select column_name,data_type,character_maximum_length from information_schema.columns where table_name = ?"; PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, "tb_bookinfo"); ResultSet rs = ps.executeQuery(); while (rs.next()) { DBInfo info = new DBInfo(); info.setColumnName(rs.getString(1)); info.setDataType(rs.getString(2)); info.setCharacterMaximumLength(rs.getInt(3)); list.add(info); } return list; }
(2)使用java.sql.ResultSetMetaData来读取其表结构的属性,例如:
Connection conn = DBInit.getConnection(); String sql = "select *from tb_bookinfo"; ResultSetMetaData rsmd = null; PreparedStatement ps = conn.prepareStatement(sql); ResultSet rs = ps.executeQuery(); rsmd = rs.getMetaData(); // 获取字段名 if (rsmd != null) { int count = rsmd.getColumnCount(); for (int i = 1; i <= count; i++) { System.out.println("hyqTest======" + rsmd.getColumnName(i)); rsmd.getColumnType(i); }
这样做真的很死板,希望能提供高效方法,谢谢各位网友!
我昨天头脑发烧了,实现上述功能直接用SQL语句就行了,SQL语句如下:
create table if not exists NewDBName.NewTBName select * from OldDBName.OldTBName;