- 浏览: 146097 次
- 性别:
- 来自: 上海
文章分类
最新评论
平时开发中总是要根据别人建立好的数据库生成对应的实体,当然如果使用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 994今天开发项目中遇见一个很奇怪的问题,其他模块都能正常编译,有 ... -
poi读取excel
2018-06-09 23:11 0最近使用poi读取excel文件时,excel时间格式输入的 ... -
spring 嵌套事务
2018-06-01 22:41 1237今天在code review的时候,发现有嵌套事务,由于嵌 ... -
invalid bound statement常见原因
2018-04-22 19:48 1489开发中使用mybaitis常遇见错误org.apache.i ... -
java类型导致md5签名结果不一致
2018-04-18 19:53 1671<div class="iteye-blog- ... -
java 读取网络ZipInputStream 中 Zipentry 文本文件
2017-10-22 12:09 3243在读取网络文件中的文件时有可能是gzip tar zip格式 ... -
java笔试题
2017-04-23 22:04 511最近换工作面试了一些公司,将记得的笔试题与大家分享一下,由 ... -
java ldap开发常见问题与代码
2017-04-23 22:00 1739最近因工作需要自己花时间学习了ldap的API并在项目中使 ... -
java3年到5年工作经验面试题整理
2017-04-02 22:39 17652最近换工作陆陆续续面试了10来家公司吧,大概整理了一下面 ... -
java 括号匹配
2016-08-21 15:11 866最近工作需要,要截取一个sql中某个函数,刚好这个函数有括号 ... -
java 删除mysql/Oracle所有表
2016-06-26 22:09 715最近测试项目,自己的本机搭建环境总是删除表,用java写了一 ... -
hibernate多数据源配置与使用
2016-03-26 22:33 740关于hibernate中多个数据源数据传输的使用: 1.首 ... -
java通过jdbc读取oracle数据库数据和插入数据
2016-03-26 21:34 1657最近因工作需要,需要做数据同步。java通 ... -
基于jdk规范的webservice
2016-01-13 23:30 473最近在项目中使用webservice连接调用其 ... -
maven 项目JUnit4 Spring JdbcTemplate 测试dao
2015-09-19 12:32 2782最近使用maven项目,由于前后端完 ... -
JdbcTemplate queryForObject Incorrect result size: expected 1, actual 0
2015-09-12 23:01 4771使用Spring中的jdbcTemplate 时,通过id ... -
java excel导入数据库
2015-09-04 21:29 742最近项目中让做将excel数据导入到数据库的功能 ... -
java 读取网络文件 protocol = http host = null
2015-07-27 22:48 6595java中通过ip地址读取文件 public void t ... -
Spring namedparameterjdbctemplate 实现批量更新
2015-07-14 23:35 3566最近开发中使用了spring的NamedParameter ... -
java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderL
2015-04-20 22:49 554java.lang.ClassNotFoundExcepti ...
相关推荐
JDBC读取数据库元数据,生成JAVA实体类
一个生成实体的工具类,只需要mysql驱动就能自动生成所有实体
JDBC读取数据库元数据,生成JAVA实体类
3、生成的代码有注释和swagger注解,并且实体中有mybatisplus注解 4、优点:提高效率、方便快捷 5、具体操作步骤可见:使用说明.txt。 1、配置mybatisplus.json outdir需要设置成绝对路径 jdbcUrl、jdbcUser、...
Sqlbean是一款通过Java语法生成SQL语句的ORM插件,其理念是弱化在开发阶段对数据库的操作,无需先建表再开发,可直接编写实体类和业务代码,项目启动后自动创建表和维护表结构。内置大量常用方法,支持灵活的条件...
代码一键自动生成工具 可生成Action、JavaBean实体类、Dao及实现类、service及实现类、spring.xml、struts.xml、mybatis.xml *该工具目前支持3种数据源的生成方式,分别是:JDBC、.table、PDM *JDBC:选择JDBC是只...
用JDBC连接数据库时,java动态生成实体类,根据数据库的的表自动生成实体类不需要我们继续繁琐的创建实体类
JDBC读取数据库元数据,生成JAVA实体类,SQL语句,Mybatis动态sql语句,详细内容见博客地址https://blog.csdn.net/zi971553/article/details/82862039
1.根据Mysql数据库的表生成java实体类,包括注释 2.将Excel表格数据生成java实体类,包括注释 3.包括源文件和生成好的jar工具,和示例文件 技术: java、log4j、poi表格操作、jdbc数据库操作、freeMarker模板使用
只需要修改generatorConfig.xml中的配置信息,将你的数据库的链接和密码修改,之中有详细注释,修改后保存启动or.bat即可。注意需要编辑or.bat的启动路径,工具类要放在C盘中
4、编写程序实现添加学生功能,创建界面,提示用户输入内容,生成实体类,放入数组; 5、编写程序实现学生信息删除,从数组中移除相应数据; 6、编写程序实现学生信息修改,从数组中读取学生信息显示在GUI界面中,...
代码一键自动生成工具 可生成Action、JavaBean实体类、Dao及实现类、service及实现类、spring.xml、struts.xml、mybatis.xml *该工具目前支持3种数据源的生成方式,分别是:JDBC、.table、PDM *JDBC:选择JDBC是只...
使用原生jdbc连接mysql数据库,获取所有表名,并映射成java实体类,支持spring注解。摆脱繁琐的实体类编写工作。
java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。 java.util.concurrent 在并发编程中很常用的实用工具类...
Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...
Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...
java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。 java.util.concurrent 在并发编程中很常用的实用工具类。...
java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。 java.util.concurrent 在并发编程中很常用的实用工具类...
第15章Java数据库连接 JDBC 15 1创建数据源 15 2JDBC ODBC桥接器 l5 3顺序查询 15 4可滚动结果集 15 5排序查询 15 6模糊查询 15 7随机查询 15 8更新 添加 删除记录 l5 9预处理语句 15 10数据库访问中的套接字技术 ...
java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。 java.util.concurrent 在并发编程中很常用的实用工具类。...