- 浏览: 150241 次
- 性别:
- 来自: 上海
文章分类
最新评论
平时开发中总是要根据别人建立好的数据库生成对应的实体,当然如果使用hibernate也可以用它自身的工具去生成或者通过实体反向生成对应的表结构,但是大部分都是根据数据库表去生成实体的,为了避免重复干这种活,抽空写了一段程序用于根据数据库表生成对应的实体,是通过jdbc生成的
数据库工具类<span style="font-family: monospace; line-height: 1.5; background-color: #fafafa;">DBUtil.java </span></p>
<pre name="code" class="java">/**
* @author caifan
*
* 2016年11月20日
* 获取数据库信息
*/
public class DBUtil {
private static ThreadLocal<Connection> localConnection = new ThreadLocal<Connection>();
/**
* 获取连接 将user password 存在property中, 如果是oracle数据库为了获取oracle字段的备注信息
* 2016年11月20日
* @param username
* @param psword
* @param url
* @return
*/
public static Connection getConn(String url, String username, String password, DBType dbtype){
Connection conn = localConnection.get();
Properties prop = new Properties();
prop.put("user", username);
prop.put("password", password);
if(dbtype.getName().equals("Oracle")) {
prop.put("remarksReporting", "true");
}
if(conn == null) {
try {
Class.forName(dbtype.getDriverName());
conn = DriverManager.getConnection(url, prop);
System.out.println("连接成功");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
localConnection.set(conn);
}
return conn;
}
/**
* 关闭连接
* 2016年11月20日
*/
public static void closeConnection() {
Connection conn = localConnection.get();
if(conn != null) {
try {
conn.close();
//ThreaLocal中清除Connection
localConnection.remove();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 关闭Statement(用于执行静态 SQL 语句并返回它所生成结果的对象。)
* 2016年11月20日
* @param pstmt
*/
public static void close(PreparedStatement ps) {
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 关闭Statement(用于执行静态 SQL 语句并返回它所生成结果的对象。)
* 2016年11月20日
* @param pstmt
*/
public static void close(Statement pstmt) {
if (pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 关闭结果集
* 2016年11月20日
* @param rs
*/
public static void close(ResultSet rs ) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 开启事务
* 2016年11月20日
* @param conn
*/
public static void beginTransaction(Connection conn) {
try {
if (conn != null) {
if (conn.getAutoCommit()) {
conn.setAutoCommit(false); //手动提交
}
}
}catch(SQLException e) {
e.printStackTrace();
}
}
/**
* 提交事务
* 2016年11月20日
* @param conn
*/
public static void commitTransaction(Connection conn) {
try {
if (conn != null) {
if (!conn.getAutoCommit()) {
conn.commit();
}
}
}catch(SQLException e) {
e.printStackTrace();
}
}
/**
* 回滚事务
* 2016年11月20日
* @param conn
*/
public static void rollbackTransaction(Connection conn) {
try {
if (conn != null) {
if (!conn.getAutoCommit()) {
conn.rollback();
}
}
}catch(SQLException e) {
e.printStackTrace();
}
}
}</pre>
<p> 由于各数据库只是遵循了数据库 的标准,有些类型与java类型对应的关系可能不太一样所以我这里对不同的数据库类型使用的不同的存储,使用的map存储的映射关系</p>
<pre name="code" class="java">/**
* 配置数据库驱动和名称
* @author caifan
*
* 2016年12月10日
*/
public enum DBType {
MySQL {
@Override
public String getName() {
return "MySQL";
}
@Override
public String getDriverName() {
return "com.mysql.jdbc.Driver";
}
@Override
public Map<String, String> getFieldType() {
/**
* 类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int)
VARCHAR L+N VARCHAR java.lang.String 12
CHAR N CHAR java.lang.String 1
BLOB L+N BLOB java.lang.byte[] -4
TEXT 65535 VARCHAR java.lang.String -1
INTEGER 4 INTEGER UNSIGNED java.lang.Long 4
TINYINT 3 TINYINT UNSIGNED java.lang.Integer -6
SMALLINT 5 SMALLINT UNSIGNED java.lang.Integer 5
MEDIUMINT 8 MEDIUMINT UNSIGNED java.lang.Integer 4
BIT 1 BIT java.lang.Boolean -7
BIGINT 20 BIGINT UNSIGNED java.math.BigInteger -5
FLOAT 4+8 FLOAT java.lang.Float 7
DOUBLE 22 DOUBLE java.lang.Double 8
DECIMAL 11 DECIMAL java.math.BigDecimal 3
BOOLEAN 1 同TINYINT
ID 11 PK (INTEGER UNSIGNED) java.lang.Long 4
DATE 10 DATE java.sql.Date 91
TIME 8 TIME java.sql.Time 92
DATETIME 19 DATETIME java.sql.Timestamp 93
TIMESTAMP 19 TIMESTAMP java.sql.Timestamp 93
YEAR 4 YEAR java.sql.Date 91
*/
Map<String, String> map = new HashMap<String, String>();
map.put("VARCHAR", "String");
map.put("CHAR", "String");
map.put("BLOB", "byte[]");
map.put("TEXT", "String");
map.put("INTEGER", "Long");
map.put("TINYINT", "Integer");
map.put("SMALLINT", "Integer");
map.put("MEDIUMINT", "Integer");
map.put("BIT", "Boolean");
map.put("BIGINT", "BigInteger");
map.put("FLOAT", "Float");
map.put("DOUBLE", "Double");
map.put("DECIMAL", "BigDecimal");
map.put("BOOLEAN", "Integer");
map.put("ID", "Long");
map.put("DATE", "Date");
map.put("TIME", "Time");
map.put("DATETIME", "Timestamp");
map.put("TIMESTAMP", "Timestamp");
map.put("YEAR", "Date");
map.put("INT", "Integer");
return map;
}
},MariaDB {
@Override
public String getName() {
return "MariaDB";
}
@Override
public String getDriverName() {
return "org.mariadb.jdbc.Driver";
}
/**
* MariaDB暂时引用Mysql类型
*/
@Override
public Map<String, String> getFieldType() {
Map<String, String> map = new HashMap<String, String>();
map.put("VARCHAR", "String");
map.put("CHAR", "String");
map.put("BLOB", "byte[]");
map.put("TEXT", "String");
map.put("INTEGER", "Long");
map.put("TINYINT", "Integer");
map.put("SMALLINT", "Integer");
map.put("MEDIUMINT", "Integer");
map.put("BIT", "Boolean");
map.put("BIGINT", "BigInteger");
map.put("FLOAT", "Float");
map.put("DOUBLE", "Double");
map.put("DECIMAL", "BigDecimal");
map.put("BOOLEAN", "Integer");
map.put("ID", "Long");
map.put("DATE", "Date");
map.put("TIME", "Time");
map.put("DATETIME", "Timestamp");
map.put("TIMESTAMP", "Timestamp");
map.put("YEAR", "Date");
map.put("INT", "Integer");
return map;
}
}, Oracle {
@Override
public String getName() {
return "Oracle";
}
@Override
public String getDriverName() {
return "oracle.jdbc.driver.OracleDriver";
}
@Override
public Map<String, String> getFieldType() {
Map<String, String> map = new HashMap<String, String>();
map.put("BINARY_DOUBLE", "Double");
map.put("BINARY_FLOAT", "Float");
map.put("VARCHAR2", "String");
map.put("NVARCHAR2", "String");
map.put("CHAR", "String");
map.put("BLOB", "Blob");
map.put("CLOB", "Clob");
map.put("DATE", "Date");
map.put("LONG", "String");
map.put("NCLOB", "Clob");
map.put("NUMBER", "Float");
map.put("INTEGER", "Integer");
map.put("TIMESTAMP", "Date");
return map;
}
}, SQLServer {
@Override
public String getName() {
return "SQLServer";
}
@Override
public String getDriverName() {
return "com.microsoft.sqlserver.jdbc.SQLServerDriver";
}
/*编号 数据库类型 JDBC类型 JDBC索引 描述
1 int java.lang.Integer 4
2 varchar java.lang.String 12
3 char java.lang.String 1
4 nchar java.lang.String 1
5 nvarchar java.lang.String 12
6 text java.lang.String -1
7 ntext java.lang.String -1
8 tinyint java.lang.Integer -6
11 smallint java.lang.Integer 5
12 bit java.lang.Boolean -7
13 bigint java.lang.Long -5
14 float java.lang.Double 6
15 decimal java.math.BigDecimal 3
16 money java.math.BigDecimal 3
17 smallmoney java.math.BigDecimal 3
18 numeric java.math.BigDecimal 2
19 real java.lang.Float 7
20 uniqueidentifier java.lang.String 1
21 smalldatetime java.sql.Timestamp 93
22 datetime java.sql.Timestamp 93
23 timestamp byte[] -2
24 binary byte[] -2
25 varbinary byte[] -3
26 image byte[] -4
27 sql_variant java.lang.String 12*/
@Override
public Map<String, String> getFieldType() {
Map<String, String> map = new HashMap<String, String>();
map.put("INT", "Integer");
map.put("VARCHAR", "String");
map.put("CHAR", "String");
map.put("NCHAR", "String");
map.put("NVARCHAR", "String");
map.put("TEXT", "String");
map.put("NTEXT", "String");
map.put("TINYINT", "Integer");
map.put("SMALLINT", "Integer");
map.put("BIT", "Boolean");
map.put("BIGINT", "Long");
map.put("FLOAT", "Double");
map.put("DECIMAL", "BigDecimal");
map.put("MONEY", "BigDecimal");
map.put("SMALLMONEY", "BigDecimal");
map.put("NUMERIC", "BigDecimal");
map.put("REAL", "Float");
map.put("UNIQUEIDENTIFIER", "String");
map.put("SMALLDATETIME", "Date");
map.put("DATETIME", "Date");
map.put("TIMESTAMP", "Date");
map.put("BINARY", "byte[]");
map.put("VARBINARY", "byte[]");
map.put("IMAGE", "byte[]");
map.put("SQL_VARIANT", "String");
return map;
}
}, Teradata {
@Override
public String getName() {
return "Teradata";
}
@Override
public String getDriverName() {
return "com.teradata.jdbc.TeraDriver";
}
@Override
public Map<String, String> getFieldType() {
return null;
}
};
public abstract String getName();
public abstract String getDriverName();
public abstract Map<String, String> getFieldType();
}
</pre>
<p> 主要做了mysql、oracle两种数据库的映射,其他的数据库使用的不多没有去映射,如有必要自己去映射一下就ok了</p>
<p>下面是一个生成代码</p>
<pre name="code" class="java">/**
* @author caifan
*
* 2016年11月20日
* 根据数据库生成实体
*
* 1.首先读取元数据获取所有的表名
* 2.读取表名获取该表对应的所有字段名、字段对应的类型、备注
* 3.根据对应的字段类型生成对应的字段名、和注释
*/
public class GenBean {
public static void main(String[] args) throws Exception {
Connection conn = DBUtil.getConn("jdbc:mysql://localhost:3306/learn", "root", "123456",DBType.MySQL);
DatabaseMetaData metaData = conn.getMetaData();
List<String> tables = getTables(conn);
for(String table : tables) {
getColumnsAndGenJava(conn, table, "D:/test", DBType.MySQL, false);
// dropTable(conn, table);
// truncateTable(conn, table);
}
}
/**
* 根据表名获取字段列信息
* 2016年12月11日
* @param conn
* @param tablename
* @param javaPath 生成java文件路径
* @param type 数据库类型
* @param anotation 是否支持注解(hibernate使用注解时设置true即可)
*/
public static void getColumnsAndGenJava(Connection conn, String tablename, String javaPath, DBType type, boolean anotation) {
StringBuffer buffer = new StringBuffer();//存放字段信息
StringBuffer gsField = new StringBuffer();//存放get set方法
//StringBuffer setField = new StringBuffer();//存放get方法
FileWriter fw = null;
if(anotation) {
buffer.append("@Entity(tableName=\"" + tablename + "\")\n");
}
buffer.append("public class " + getTransferName(tablename) + " implements Serializable {\n");
DatabaseMetaData metaData;
try {
File file = new File(javaPath + File.separator + getTransferName(tablename) + ".java");
if(file.exists()) {
file.delete();
}
fw = new FileWriter(file);
//获取类型
@SuppressWarnings("rawtypes")
Map map = type.getFieldType();
String javaType;
metaData = conn.getMetaData();
ResultSet columns = metaData.getColumns(null, "%", tablename, "%");
String columnName;//列名
String typeName;//类型名
String remarks;//备注
while(columns.next()) {
typeName = columns.getString("TYPE_NAME");//字段类型名称(例如:VACHAR2)
javaType = map.get(typeName.toUpperCase()).toString();
columnName = columns.getString("COLUMN_NAME");//列名
if (anotation) {
buffer.append("@Column(name=\""+columnName+"\")\n");
}
buffer.append("\tprivate ").append(javaType).append(" ");
buffer.append(getFirstNameLower(getTransferName(columnName)) + ";");
//get方法
gsField.append("\tpublic ").append(javaType).append(" get" + getTransferName(columnName))
.append("() {\n\t\treturn " + getFirstNameLower(getTransferName(columnName)) + ";\n\t}\n");
//set方法
gsField.append("\tpublic void set" + getTransferName(columnName)).append("(").append(javaType).append(" ")
.append(getFirstNameLower(getTransferName(columnName))).append(") {\n")
.append("\t\tthis.").append(getFirstNameLower(getTransferName(columnName)))
.append(" = ").append(getFirstNameLower(getTransferName(columnName))).append(";\n\t}\n");
remarks = columns.getString("REMARKS");//备注
if(remarks != null) {
buffer.append("//" + remarks + "\n");
} else {
buffer.append("\n");
}
}
buffer.append(gsField);
buffer.append("}");
fw.write(buffer.toString());
} catch (Exception e) {
e.printStackTrace();
} finally {
if(fw != null) {
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 获取表名
* 2016年11月20日
* @param tableSql
* @param conn
* @return
*/
private static List<String> getTables(Connection conn) {
List<String> tables = new ArrayList<>();
ResultSet rs = null;
try {
DatabaseMetaData metaData = conn.getMetaData();
rs = metaData.getTables(null, metaData.getUserName(), null, new String[]{"TABLE"});
while(rs.next()) {
tables.add(rs.getString("TABLE_NAME"));
}
} catch(Exception e) {
e.printStackTrace();
} finally {
try {
if(rs != null) {
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
return tables;
}
/**
* 根据字段名字来生成驼峰式的名字,如果名字全大写或者全小写将字段转成除首字母大写其余小写,如果有_隔开的则将每个_前后的字符串转成首字母大写其余小写
* 2016年12月11日
* @param name
* @return
*/
public static String getTransferName (String name) {
String transferName = "";
if(name.indexOf("_") > -1) {
String[] strs = name.split("_");
for (String str : strs) {
transferName += getFirstNameUpper(str);
}
} else {
transferName = getFirstNameUpper(name);
}
return transferName;
}
/**
* 将字符串转成首字母大写
* 2016年12月11日
* @param name
* @return
*/
private static String getFirstNameUpper(String name) {
String transferName = name.toLowerCase();
transferName = transferName.substring(0, 1).toUpperCase() + transferName.substring(1);
return transferName;
}
/**
* 将首字母转成小写
* 2016年12月14日
* @param name
* @return
*/
private static String getFirstNameLower(String name) {
return name.substring(0, 1).toLowerCase() + name.substring(1);
}
/**
* 清空表
* 2016年12月15日
* @param conn
* @param tableName
*/
private static void truncateTable(Connection conn, String tableName) {
Statement stat = null;
try {
stat = conn.createStatement();
stat.execute("truncate table " + tableName);
} catch (SQLException e) {
e.printStackTrace();
} finally {
if(stat != null) {
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
/**
* 删除表
* 2016年12月15日
* @param conn
* @param tableName
*/
private static void dropTable(Connection conn, String tableName) {
Statement stat = null;
try {
stat = conn.createStatement();
stat.execute("drop table " + tableName);
} catch (SQLException e) {
e.printStackTrace();
} finally {
if(stat != null) {
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
这个里面含有删除表和清除表数据的方法,如果需要使用直接调用即可。
如果有更好的意见望提出
欢迎加入QQ 群513650703共同学习交流
数据库工具类<span style="font-family: monospace; line-height: 1.5; background-color: #fafafa;">DBUtil.java </span></p>
<pre name="code" class="java">/**
* @author caifan
*
* 2016年11月20日
* 获取数据库信息
*/
public class DBUtil {
private static ThreadLocal<Connection> localConnection = new ThreadLocal<Connection>();
/**
* 获取连接 将user password 存在property中, 如果是oracle数据库为了获取oracle字段的备注信息
* 2016年11月20日
* @param username
* @param psword
* @param url
* @return
*/
public static Connection getConn(String url, String username, String password, DBType dbtype){
Connection conn = localConnection.get();
Properties prop = new Properties();
prop.put("user", username);
prop.put("password", password);
if(dbtype.getName().equals("Oracle")) {
prop.put("remarksReporting", "true");
}
if(conn == null) {
try {
Class.forName(dbtype.getDriverName());
conn = DriverManager.getConnection(url, prop);
System.out.println("连接成功");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
localConnection.set(conn);
}
return conn;
}
/**
* 关闭连接
* 2016年11月20日
*/
public static void closeConnection() {
Connection conn = localConnection.get();
if(conn != null) {
try {
conn.close();
//ThreaLocal中清除Connection
localConnection.remove();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 关闭Statement(用于执行静态 SQL 语句并返回它所生成结果的对象。)
* 2016年11月20日
* @param pstmt
*/
public static void close(PreparedStatement ps) {
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 关闭Statement(用于执行静态 SQL 语句并返回它所生成结果的对象。)
* 2016年11月20日
* @param pstmt
*/
public static void close(Statement pstmt) {
if (pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 关闭结果集
* 2016年11月20日
* @param rs
*/
public static void close(ResultSet rs ) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 开启事务
* 2016年11月20日
* @param conn
*/
public static void beginTransaction(Connection conn) {
try {
if (conn != null) {
if (conn.getAutoCommit()) {
conn.setAutoCommit(false); //手动提交
}
}
}catch(SQLException e) {
e.printStackTrace();
}
}
/**
* 提交事务
* 2016年11月20日
* @param conn
*/
public static void commitTransaction(Connection conn) {
try {
if (conn != null) {
if (!conn.getAutoCommit()) {
conn.commit();
}
}
}catch(SQLException e) {
e.printStackTrace();
}
}
/**
* 回滚事务
* 2016年11月20日
* @param conn
*/
public static void rollbackTransaction(Connection conn) {
try {
if (conn != null) {
if (!conn.getAutoCommit()) {
conn.rollback();
}
}
}catch(SQLException e) {
e.printStackTrace();
}
}
}</pre>
<p> 由于各数据库只是遵循了数据库 的标准,有些类型与java类型对应的关系可能不太一样所以我这里对不同的数据库类型使用的不同的存储,使用的map存储的映射关系</p>
<pre name="code" class="java">/**
* 配置数据库驱动和名称
* @author caifan
*
* 2016年12月10日
*/
public enum DBType {
MySQL {
@Override
public String getName() {
return "MySQL";
}
@Override
public String getDriverName() {
return "com.mysql.jdbc.Driver";
}
@Override
public Map<String, String> getFieldType() {
/**
* 类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int)
VARCHAR L+N VARCHAR java.lang.String 12
CHAR N CHAR java.lang.String 1
BLOB L+N BLOB java.lang.byte[] -4
TEXT 65535 VARCHAR java.lang.String -1
INTEGER 4 INTEGER UNSIGNED java.lang.Long 4
TINYINT 3 TINYINT UNSIGNED java.lang.Integer -6
SMALLINT 5 SMALLINT UNSIGNED java.lang.Integer 5
MEDIUMINT 8 MEDIUMINT UNSIGNED java.lang.Integer 4
BIT 1 BIT java.lang.Boolean -7
BIGINT 20 BIGINT UNSIGNED java.math.BigInteger -5
FLOAT 4+8 FLOAT java.lang.Float 7
DOUBLE 22 DOUBLE java.lang.Double 8
DECIMAL 11 DECIMAL java.math.BigDecimal 3
BOOLEAN 1 同TINYINT
ID 11 PK (INTEGER UNSIGNED) java.lang.Long 4
DATE 10 DATE java.sql.Date 91
TIME 8 TIME java.sql.Time 92
DATETIME 19 DATETIME java.sql.Timestamp 93
TIMESTAMP 19 TIMESTAMP java.sql.Timestamp 93
YEAR 4 YEAR java.sql.Date 91
*/
Map<String, String> map = new HashMap<String, String>();
map.put("VARCHAR", "String");
map.put("CHAR", "String");
map.put("BLOB", "byte[]");
map.put("TEXT", "String");
map.put("INTEGER", "Long");
map.put("TINYINT", "Integer");
map.put("SMALLINT", "Integer");
map.put("MEDIUMINT", "Integer");
map.put("BIT", "Boolean");
map.put("BIGINT", "BigInteger");
map.put("FLOAT", "Float");
map.put("DOUBLE", "Double");
map.put("DECIMAL", "BigDecimal");
map.put("BOOLEAN", "Integer");
map.put("ID", "Long");
map.put("DATE", "Date");
map.put("TIME", "Time");
map.put("DATETIME", "Timestamp");
map.put("TIMESTAMP", "Timestamp");
map.put("YEAR", "Date");
map.put("INT", "Integer");
return map;
}
},MariaDB {
@Override
public String getName() {
return "MariaDB";
}
@Override
public String getDriverName() {
return "org.mariadb.jdbc.Driver";
}
/**
* MariaDB暂时引用Mysql类型
*/
@Override
public Map<String, String> getFieldType() {
Map<String, String> map = new HashMap<String, String>();
map.put("VARCHAR", "String");
map.put("CHAR", "String");
map.put("BLOB", "byte[]");
map.put("TEXT", "String");
map.put("INTEGER", "Long");
map.put("TINYINT", "Integer");
map.put("SMALLINT", "Integer");
map.put("MEDIUMINT", "Integer");
map.put("BIT", "Boolean");
map.put("BIGINT", "BigInteger");
map.put("FLOAT", "Float");
map.put("DOUBLE", "Double");
map.put("DECIMAL", "BigDecimal");
map.put("BOOLEAN", "Integer");
map.put("ID", "Long");
map.put("DATE", "Date");
map.put("TIME", "Time");
map.put("DATETIME", "Timestamp");
map.put("TIMESTAMP", "Timestamp");
map.put("YEAR", "Date");
map.put("INT", "Integer");
return map;
}
}, Oracle {
@Override
public String getName() {
return "Oracle";
}
@Override
public String getDriverName() {
return "oracle.jdbc.driver.OracleDriver";
}
@Override
public Map<String, String> getFieldType() {
Map<String, String> map = new HashMap<String, String>();
map.put("BINARY_DOUBLE", "Double");
map.put("BINARY_FLOAT", "Float");
map.put("VARCHAR2", "String");
map.put("NVARCHAR2", "String");
map.put("CHAR", "String");
map.put("BLOB", "Blob");
map.put("CLOB", "Clob");
map.put("DATE", "Date");
map.put("LONG", "String");
map.put("NCLOB", "Clob");
map.put("NUMBER", "Float");
map.put("INTEGER", "Integer");
map.put("TIMESTAMP", "Date");
return map;
}
}, SQLServer {
@Override
public String getName() {
return "SQLServer";
}
@Override
public String getDriverName() {
return "com.microsoft.sqlserver.jdbc.SQLServerDriver";
}
/*编号 数据库类型 JDBC类型 JDBC索引 描述
1 int java.lang.Integer 4
2 varchar java.lang.String 12
3 char java.lang.String 1
4 nchar java.lang.String 1
5 nvarchar java.lang.String 12
6 text java.lang.String -1
7 ntext java.lang.String -1
8 tinyint java.lang.Integer -6
11 smallint java.lang.Integer 5
12 bit java.lang.Boolean -7
13 bigint java.lang.Long -5
14 float java.lang.Double 6
15 decimal java.math.BigDecimal 3
16 money java.math.BigDecimal 3
17 smallmoney java.math.BigDecimal 3
18 numeric java.math.BigDecimal 2
19 real java.lang.Float 7
20 uniqueidentifier java.lang.String 1
21 smalldatetime java.sql.Timestamp 93
22 datetime java.sql.Timestamp 93
23 timestamp byte[] -2
24 binary byte[] -2
25 varbinary byte[] -3
26 image byte[] -4
27 sql_variant java.lang.String 12*/
@Override
public Map<String, String> getFieldType() {
Map<String, String> map = new HashMap<String, String>();
map.put("INT", "Integer");
map.put("VARCHAR", "String");
map.put("CHAR", "String");
map.put("NCHAR", "String");
map.put("NVARCHAR", "String");
map.put("TEXT", "String");
map.put("NTEXT", "String");
map.put("TINYINT", "Integer");
map.put("SMALLINT", "Integer");
map.put("BIT", "Boolean");
map.put("BIGINT", "Long");
map.put("FLOAT", "Double");
map.put("DECIMAL", "BigDecimal");
map.put("MONEY", "BigDecimal");
map.put("SMALLMONEY", "BigDecimal");
map.put("NUMERIC", "BigDecimal");
map.put("REAL", "Float");
map.put("UNIQUEIDENTIFIER", "String");
map.put("SMALLDATETIME", "Date");
map.put("DATETIME", "Date");
map.put("TIMESTAMP", "Date");
map.put("BINARY", "byte[]");
map.put("VARBINARY", "byte[]");
map.put("IMAGE", "byte[]");
map.put("SQL_VARIANT", "String");
return map;
}
}, Teradata {
@Override
public String getName() {
return "Teradata";
}
@Override
public String getDriverName() {
return "com.teradata.jdbc.TeraDriver";
}
@Override
public Map<String, String> getFieldType() {
return null;
}
};
public abstract String getName();
public abstract String getDriverName();
public abstract Map<String, String> getFieldType();
}
</pre>
<p> 主要做了mysql、oracle两种数据库的映射,其他的数据库使用的不多没有去映射,如有必要自己去映射一下就ok了</p>
<p>下面是一个生成代码</p>
<pre name="code" class="java">/**
* @author caifan
*
* 2016年11月20日
* 根据数据库生成实体
*
* 1.首先读取元数据获取所有的表名
* 2.读取表名获取该表对应的所有字段名、字段对应的类型、备注
* 3.根据对应的字段类型生成对应的字段名、和注释
*/
public class GenBean {
public static void main(String[] args) throws Exception {
Connection conn = DBUtil.getConn("jdbc:mysql://localhost:3306/learn", "root", "123456",DBType.MySQL);
DatabaseMetaData metaData = conn.getMetaData();
List<String> tables = getTables(conn);
for(String table : tables) {
getColumnsAndGenJava(conn, table, "D:/test", DBType.MySQL, false);
// dropTable(conn, table);
// truncateTable(conn, table);
}
}
/**
* 根据表名获取字段列信息
* 2016年12月11日
* @param conn
* @param tablename
* @param javaPath 生成java文件路径
* @param type 数据库类型
* @param anotation 是否支持注解(hibernate使用注解时设置true即可)
*/
public static void getColumnsAndGenJava(Connection conn, String tablename, String javaPath, DBType type, boolean anotation) {
StringBuffer buffer = new StringBuffer();//存放字段信息
StringBuffer gsField = new StringBuffer();//存放get set方法
//StringBuffer setField = new StringBuffer();//存放get方法
FileWriter fw = null;
if(anotation) {
buffer.append("@Entity(tableName=\"" + tablename + "\")\n");
}
buffer.append("public class " + getTransferName(tablename) + " implements Serializable {\n");
DatabaseMetaData metaData;
try {
File file = new File(javaPath + File.separator + getTransferName(tablename) + ".java");
if(file.exists()) {
file.delete();
}
fw = new FileWriter(file);
//获取类型
@SuppressWarnings("rawtypes")
Map map = type.getFieldType();
String javaType;
metaData = conn.getMetaData();
ResultSet columns = metaData.getColumns(null, "%", tablename, "%");
String columnName;//列名
String typeName;//类型名
String remarks;//备注
while(columns.next()) {
typeName = columns.getString("TYPE_NAME");//字段类型名称(例如:VACHAR2)
javaType = map.get(typeName.toUpperCase()).toString();
columnName = columns.getString("COLUMN_NAME");//列名
if (anotation) {
buffer.append("@Column(name=\""+columnName+"\")\n");
}
buffer.append("\tprivate ").append(javaType).append(" ");
buffer.append(getFirstNameLower(getTransferName(columnName)) + ";");
//get方法
gsField.append("\tpublic ").append(javaType).append(" get" + getTransferName(columnName))
.append("() {\n\t\treturn " + getFirstNameLower(getTransferName(columnName)) + ";\n\t}\n");
//set方法
gsField.append("\tpublic void set" + getTransferName(columnName)).append("(").append(javaType).append(" ")
.append(getFirstNameLower(getTransferName(columnName))).append(") {\n")
.append("\t\tthis.").append(getFirstNameLower(getTransferName(columnName)))
.append(" = ").append(getFirstNameLower(getTransferName(columnName))).append(";\n\t}\n");
remarks = columns.getString("REMARKS");//备注
if(remarks != null) {
buffer.append("//" + remarks + "\n");
} else {
buffer.append("\n");
}
}
buffer.append(gsField);
buffer.append("}");
fw.write(buffer.toString());
} catch (Exception e) {
e.printStackTrace();
} finally {
if(fw != null) {
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 获取表名
* 2016年11月20日
* @param tableSql
* @param conn
* @return
*/
private static List<String> getTables(Connection conn) {
List<String> tables = new ArrayList<>();
ResultSet rs = null;
try {
DatabaseMetaData metaData = conn.getMetaData();
rs = metaData.getTables(null, metaData.getUserName(), null, new String[]{"TABLE"});
while(rs.next()) {
tables.add(rs.getString("TABLE_NAME"));
}
} catch(Exception e) {
e.printStackTrace();
} finally {
try {
if(rs != null) {
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
return tables;
}
/**
* 根据字段名字来生成驼峰式的名字,如果名字全大写或者全小写将字段转成除首字母大写其余小写,如果有_隔开的则将每个_前后的字符串转成首字母大写其余小写
* 2016年12月11日
* @param name
* @return
*/
public static String getTransferName (String name) {
String transferName = "";
if(name.indexOf("_") > -1) {
String[] strs = name.split("_");
for (String str : strs) {
transferName += getFirstNameUpper(str);
}
} else {
transferName = getFirstNameUpper(name);
}
return transferName;
}
/**
* 将字符串转成首字母大写
* 2016年12月11日
* @param name
* @return
*/
private static String getFirstNameUpper(String name) {
String transferName = name.toLowerCase();
transferName = transferName.substring(0, 1).toUpperCase() + transferName.substring(1);
return transferName;
}
/**
* 将首字母转成小写
* 2016年12月14日
* @param name
* @return
*/
private static String getFirstNameLower(String name) {
return name.substring(0, 1).toLowerCase() + name.substring(1);
}
/**
* 清空表
* 2016年12月15日
* @param conn
* @param tableName
*/
private static void truncateTable(Connection conn, String tableName) {
Statement stat = null;
try {
stat = conn.createStatement();
stat.execute("truncate table " + tableName);
} catch (SQLException e) {
e.printStackTrace();
} finally {
if(stat != null) {
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
/**
* 删除表
* 2016年12月15日
* @param conn
* @param tableName
*/
private static void dropTable(Connection conn, String tableName) {
Statement stat = null;
try {
stat = conn.createStatement();
stat.execute("drop table " + tableName);
} catch (SQLException e) {
e.printStackTrace();
} finally {
if(stat != null) {
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
这个里面含有删除表和清除表数据的方法,如果需要使用直接调用即可。
如果有更好的意见望提出
欢迎加入QQ 群513650703共同学习交流
发表评论
-
maven项目不编译 idea pluin不显示compiler
2018-06-27 22:36 1033今天开发项目中遇见一个很奇怪的问题,其他模块都能正常编译,有 ... -
poi读取excel
2018-06-09 23:11 0最近使用poi读取excel文件时,excel时间格式输入的 ... -
spring 嵌套事务
2018-06-01 22:41 1284今天在code review的时候,发现有嵌套事务,由于嵌 ... -
invalid bound statement常见原因
2018-04-22 19:48 1610开发中使用mybaitis常遇见错误org.apache.i ... -
java类型导致md5签名结果不一致
2018-04-18 19:53 1706<div class="iteye-blog- ... -
java 读取网络ZipInputStream 中 Zipentry 文本文件
2017-10-22 12:09 3304在读取网络文件中的文件时有可能是gzip tar zip格式 ... -
java笔试题
2017-04-23 22:04 539最近换工作面试了一些公司,将记得的笔试题与大家分享一下,由 ... -
java ldap开发常见问题与代码
2017-04-23 22:00 1801最近因工作需要自己花时间学习了ldap的API并在项目中使 ... -
java3年到5年工作经验面试题整理
2017-04-02 22:39 17753最近换工作陆陆续续面试了10来家公司吧,大概整理了一下面 ... -
java 括号匹配
2016-08-21 15:11 891最近工作需要,要截取一个sql中某个函数,刚好这个函数有括号 ... -
java 删除mysql/Oracle所有表
2016-06-26 22:09 754最近测试项目,自己的本机搭建环境总是删除表,用java写了一 ... -
hibernate多数据源配置与使用
2016-03-26 22:33 770关于hibernate中多个数据源数据传输的使用: 1.首 ... -
java通过jdbc读取oracle数据库数据和插入数据
2016-03-26 21:34 1709最近因工作需要,需要做数据同步。java通 ... -
基于jdk规范的webservice
2016-01-13 23:30 503最近在项目中使用webservice连接调用其 ... -
maven 项目JUnit4 Spring JdbcTemplate 测试dao
2015-09-19 12:32 2816最近使用maven项目,由于前后端完 ... -
JdbcTemplate queryForObject Incorrect result size: expected 1, actual 0
2015-09-12 23:01 4815使用Spring中的jdbcTemplate 时,通过id ... -
java excel导入数据库
2015-09-04 21:29 776最近项目中让做将excel数据导入到数据库的功能 ... -
java 读取网络文件 protocol = http host = null
2015-07-27 22:48 6698java中通过ip地址读取文件 public void t ... -
Spring namedparameterjdbctemplate 实现批量更新
2015-07-14 23:35 3728最近开发中使用了spring的NamedParameter ... -
java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderL
2015-04-20 22:49 586java.lang.ClassNotFoundExcepti ...
相关推荐
总的来说,Java实体类生成工具是提高开发效率的重要工具,它通过自动化繁重的代码生成工作,让开发者能够更加专注于业务逻辑的实现,从而提高整体的项目进度和代码质量。正确地理解和使用这类工具,能够显著提升Java...
4. **生成Java代码**: 根据解析到的表结构,自动生成Java实体类。每个字段对应一个Java属性,数据类型需要转换成Java兼容的类型,如`VARCHAR`转`String`,`INT`转`int`等。同时,生成对应的getter和setter方法。 5....
JDBC读取数据库元数据,生成JAVA实体类
一个生成实体的工具类,只需要mysql驱动就能自动生成所有实体
通过这个实体生成工具类,开发者可以快速地根据数据库表结构自动生成对应的Java实体类,从而减少手动编写这些类的工作量。 在使用这个工具类前,首先需要了解几个关键的概念: 1. **实体类(Entity Class)**:...
在生成代码的过程中,模板引擎如FreeMarker或Velocity被用来根据预定义的模板生成Java源代码。开发者可以自定义模板,以满足项目特定的需求或编码风格。 6. **自动化集成** 许多IDE如Eclipse、IntelliJ IDEA都...
4. 数据库表结构解析,用于生成Java实体类的属性和方法。 5. Java实体类的设计,包括属性、getter和setter方法。 6. 使用JPA注解进行对象-关系映射,如`@Entity`、`@Table`、`@Column`等。 7. ORM框架如Hibernate或...
对应的Java实体类可能如下所示: ```java import javax.persistence.*; @Entity @Table(name = "users") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; ...
另外,MyBatis也提供了逆向工程功能,可以从数据库表生成Java POJOs(Plain Old Java Objects)。还有一些第三方工具,如Apache Velocity和FreeMarker,可以用来定制模板生成实体类。 回到“生成实体类工具源码”这...
JDBC读取数据库元数据,生成JAVA实体类
4. **代码生成工具**:有一些开源工具,如MyBatis的逆向工程、Hibernate的`hibernate-tools`等,可以帮助开发者根据数据库表自动生成Java实体类。这些工具通常使用模板引擎,如FreeMarker或Velocity,根据预定义的...
Java实体类生成器是一种工具,它能够自动生成Java编程中的数据模型类,这些类通常用于映射数据库表结构。在Java开发中,特别是在基于ORM(对象关系映射)框架如Hibernate或MyBatis的项目中,实体类是必不可少的。...
这个小工具的工作原理可能是这样的:首先,它通过JDBC(Java Database Connectivity)连接到数据库,获取数据库中的表结构信息,包括表名、字段名、字段类型等。然后,利用这些信息,生成符合Java Bean规范的实体类...
在这个场景中,"java web 生成实体" 指的是使用特定工具或库,自动生成Java实体类(Entity)的过程。这些实体类通常用于表示数据库中的表,使得开发人员能够更方便地进行数据操作。 Oracle数据库是一种广泛使用的的...
【标题】"mybatis逆向工程(通过数据库生成java实体类)"所涉及的知识点主要集中在MyBatis框架的逆向工程(Reverse Engineering)上,这是一个强大的功能,它可以帮助开发者快速生成基于数据库表的Java实体类、Mapper...
总结一下,"java生成实体工具"是一个用于自动化生成Java实体类的实用程序,它根据数据库表结构自动生成符合Java Bean规范的类。通过理解和掌握这个工具的使用,开发者可以更高效地进行数据访问层的开发,减少手动...
- 根据获取的信息,自动生成对应字段的Java属性,类型转换通常基于JDBC的java.sql.Types映射。 - 针对每个属性,生成getter和setter方法,以及可能的构造函数。 - 如果有外键关联,会生成对应的导航属性和关联...
这个代码片段应该是通过JDBC(Java Database Connectivity)API连接到MySQL服务器,查询数据库中的表信息,包括表名、字段名、数据类型、约束以及注释等。然后,它将这些信息整理成易于阅读的文本格式,并保存为TXT...
Sqlbean是一款通过Java语法生成SQL语句的ORM插件,其理念是弱化在开发阶段对数据库的操作,无需先建表再开发,可直接编写实体类和业务代码,项目启动后自动创建表和维护表结构。内置大量常用方法,支持灵活的条件...
在结合JDBC(Java Database Connectivity)API时,可以构建出更高效、更易维护的数据访问层。本案例通过注解的方式,简化了JDBC操作数据库的过程,并利用反射机制动态地调用这些操作。 首先,让我们详细了解Java...