利用JAVA反射,读取数据库表名,自动生成对应实体类的操作

网友投稿 770 2022-11-26


利用JAVA反射,读取数据库表名,自动生成对应实体类的操作

本代码是利用java反射,读取数据库表自动根据表名生成实体类,数据库采用老牌SQLSERVER 2000,驱动为JTDS,其他数据库可根据情况自定修改。

代码中包含了大部分数据库类型与JAVA类型的转换,少数未包含进去的会在生成代码时打印出来,方面后期查找修改。

import java.io.File;

import java.io.FileWriter;

import java.io.IOException;

import java.io.PrintWriter;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSetMetaData;

import java.sql.SQLException;

import java.text.SimpleDateFormat;

import java.util.Date;

/**

* 从数据库表反射出实体类,自动生成实体类

*

* @author Zero

*

*/

public class SqlHelper {

//基本数据配置

private String packageOutPath = "com.xxx.entity.system";// 指定实体生成所在包的路径

private String tablename = "xxx";// 表名

private String[] colnames; // 列名数组

private String[] colTypes; // 列名类型数组

private String version = "V0.01"; // 版本

private int[] colSizes; // 列名大小数组

private boolean f_util = false; // 是否需要导入包java.util.*

private boolean f_sql = false; // 是否需要导入包java.sql.*

private boolean f_lang = false; // 是否需要导入包java.sql.*

private String defaultPath = "/src/main/java/";

// 数据库连接

private static final String URL = "jdbc:jtds:sqlserver://192.168.29.128:1433/xxx";

private static final String NAME = "sa";

private static final String PASS = "xxx";

private static final String DRIVER = "net.sourceforge.jtds.jdbc.Driver";

/*

* 构造函数

*/

public SqlHelper() {

// 创建连接

Connection con;

// 查要生成实体类的表

String sql = "select * from " + tablename;

PreparedStatement pStemt = null;

try {

try {

Class.forName(DRIVER);

} catch (ClassNotFoundException e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

}

con = DriverManager.getConnection(URL, NAME, PASS);

pStemt = con.prepareStatement(sql);

ResultSetMetaData rsmd = pStemt.getMetaData();

int size = rsmd.getColumnCount(); // 统计列

colnames = new String[size];

colTypes = new String[size];

colSizes = new int[size];

for (int i = 0; i < size; i++) {

colnames[i] = rsmd.getColumnName(i + 1);

colTypes[i] = rsmd.getColumnTypeName(i + 1);

//自动生成包配置

// if (colTypes[i].equalsIgnoreCase("datetime")) {

// f_util = true;

// }

if (colTypes[i].equalsIgnoreCase("image") || colTypes[i].equalsIgnoreCase("text")

|| colTypes[i].equalsIgnoreCase("datetime") || colTypes[i].equalsIgnoreCase("time")

|| colTypes[i].equalsIgnoreCase("date") || colTypes[i].equalsIgnoreCase("datetime2")) {

f_sql = true;

}

// if (colTypes[i].equalsIgnoreCase("int")) {

// f_lang = true;

// }

colSizes[i] = rsmd.getColumnDisplaySize(i + 1);

}

String content = parse(colnames, colTypes, colSizes);

try {

File directory = new File("");

String path = this.getClass().getResource("").getPath();

System.out.println(path);

String outputPath = directory.getAbsolutePath() + this.defaultPath

+ this.packageOutPath.replace(".", "/") + "/" + initcap(tablename) + ".java";

System.out.println("执行完毕,生成路径为:"+outputPath);

FileWriter fw = new FileWriter(outputPath);

PrintWriter pw = new PrintWriter(fw);

pw.println(content);

pw.flush();

pw.close();

} catch (IOException e) {

e.printStackTrace();

}

} catch (SQLException e) {

e.printStackTrace();

} finally {

}

}

/**

* 功能:生成实体类主体代码

*

* @param colnames

* @param colTypes

* @param colSizes

* @return

*/

private String parse(String[] colnames, String[] colTypes, int[] colSizes) {

StringBuffer sb = new StringBuffer();

// 生成package包路径

sb.append("package " + this.packageOutPath + ";\r\n");

// 判断是否导入工具包

if (f_util) {

sb.append("import java.util.Date;\r\n");

}

if (f_sql) {

sb.append("import java.sql.*;\r\n");

}

if (f_lang) {

sb.append("import java.lang.*;\r\n");

}

sb.append("\r\n");

// 注释部分

sb.append(" /**\r\n");

sb.append(" * @文件名称:" + this.tablename + ".java\r\n");

sb.append(" * @创建时间:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "\r\n");

sb.append(" * @创 建 人:" + this.authorName + " \r\n");

sb.append(" * @文件描述:" + tablename + " 实体类\r\n");

sb.append(" * @文件版本:" + this.version + " \r\n");

sb.append(" */ \r\n");

// 实体部分

sb.append("\r\n\r\npublic class " + initcap(tablename) + "{\r\n");

processAllAttrs(sb);// 属性

processAllMethod(sb);// get set方法

sb.append("}\r\n");

// System.out.println(sb.toString());

return sb.toString();

}

/**

* 功能:生成所有属性

*

* @param sb

*/

private void processAllAttrs(StringBuffer sb) {

for (int i = 0; i < colnames.length; i++) {

sb.append("\tprivate " + sqlType2JavaType(colTypes[i]) + " " + colnames[i] + ";\r\n");

}

}

/**

* 功能:生成所有方法

*

* @param sb

*/

private void processAllMethod(StringBuffer sb) {

for (int i = 0; i < colnames.length; i++) {

sb.append("\tpublic void set" + initcap(colnames[i]) + "(" + sqlType2JavaType(colTypes[i]) + " "

+ colnames[i] + "){\r\n");

sb.append("\tthis." + colnames[i] + "=" + colnames[i] + ";\r\n");

sb.append("\t}\r\n");

sb.append("\tpublic " + sqlType2JavaType(colTypes[i]) + " get" + initcap(colnames[i]) + "(){\r\n");

sb.append("\t\treturn " + colnames[i] + ";\r\n");

sb.append("\t}\r\n");

}

}

/**

* 功能:将输入字符串的首字母改成大写

*

* @param str

* @return

*/

private String initcap(String str) {

char[] ch = str.toCharArray();

if (ch[0] >= 'a' && ch[0] <= 'z') {

ch[0] = (char) (ch[0] - 32);

}

return new String(ch);

}

/**

* 功能:获得列的数据类型

*

* @param sqlType

* @return

*/

private String sqlType2JavaType(String sqlType) {

if (sqlType.equalsIgnoreCase("bit")) {

return "Boolean";

} else if (sqlType.equalsIgnoreCase("decimal") || sqlType.equalsIgnoreCase("money")

|| sqlType.equalsIgnoreCase("smallmoney") || sqlType.equalsIgnoreCase("numeric")

|| sqlType.equalsIgnoreCase("bigint")) {

return "Long";

} else if (sqlType.equalsIgnoreCase("float")) {

return "Double";

} else if (sqlType.equalsIgnoreCase("int") || sqlType.equalsIgnoreCase("int identity")) {

return "Integer";

} else if (sqlType.equalsIgnoreCase("image") || sqlType.equalsIgnoreCase("varbinary(max)")

|| sqlType.equalsIgnoreCase("varbinary") || sqlType.equalsIgnoreCase("udt")

|| sqlType.equalsIgnoreCase("timestamp") || sqlType.equalsIgnoreCase("binary")) {

return "Byte[]";

} else if (sqlType.equalsIgnoreCase("nchar") || sqlType.equalsIgnoreCase("nvarchar(max)")

|| sqlType.equalsIgnoreCase("nvarchar") || sqlType.equalsIgnoreCase("nvarchar(ntext)")

|| sqlType.equalsIgnoreCase("uniqueidentifier") || sqlType.equalsIgnoreCase("xml")

|| sqlType.equalsIgnoreCase("char") || sqlType.equalsIgnoreCase("varchar(max)")

|| sqlType.equalsIgnoreCase("text") || sqlType.equalsIgnoreCase("varchar")) {

return "String";

} else if (sqlType.equalsIgnoreCase("real")) {

return "Float";

} else if (sqlType.equalsIgnoreCase("smallint") || sqlType.equalsIgnoreCase("tinyint")) {

return "Short";

} else if (sqlType.equalsIgnoreCase("date") || sqlType.equalsIgnoreCase("datetime")

|| sqlType.equalsIgnoreCase("time") || sqlType.equalsIgnoreCase("datetime2")) {

return "Date";

} else {

System.out.println("数据类型异常,类型为:" + sqlType);

}

return null;

}

/**

* 出口 TODO

*

* @param args

*/

public static void main(String[] args) {

new SqlHelper();

}

}

补充知识:java通过反射获取类名、属性名称以及@Table注解上的表名称

我就废话不多说了,大家还是直接看代码吧~

import javax.persistence.Column;

import javax.persistence.Id;

import javax.persistence.Table;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

import java.util.Map;

import java.util.concurrent.ConcurrentHashMap;

/**

* @author caizw

* @createDate 2018/2/8

* @description 反射工具类

*/

public class ReflectUtils {

/**

* 获取实体类主键

*

* @param clazz

* @return

*/

public static Field getIdField(Class> clazz) {

Field[] fields = clazz.getDeclaredFields();

Field item = null;

for (Field field : fields) {

Id id = field.getAnnotation(Id.class);

if (id != null) {

field.setAccessible(true);

item = field;

break;

}

}

if (item == null) {

Class> superclass = clazz.getSuperclass();

if (superclass != null) {

item = getIdField(superclass);

}

}

return item;

}

/**

* 根据主键名称获取实体类主键属性值

*

* @param clazz

* @param pkName

* @return

*/

public static Object gebRZKgvKWlItPkValueByName(Object clazz, String pkName) {

try {

String firstLetter = pkName.substring(0, 1).toUpperCase();

String getter = "get" + firstLetter + pkName.substring(1);

Method method = clazz.getClass().getMethod(getter, new Class[]{});

Object value = method.invoke(clazz, new Object[]{});

return value;

} catch (Exception e) {

return null;

}

}

/**

* 通过反射将 class1不为空的值赋值给class2

*

* @param class1

* @param class2

* @throws Exception

*/

public static void reflectClass1ToClass2(Object class1, Object class2) throws Exception {

Field[] field = class1.getClass().getDeclaredFields();

for (int i = 0; i < field.length; i++) {

String name = field[i].getName();

if ("serialVersionUID".equals(name)) {

continue;

}

name = name.substring(0, 1).toUpperCase() + name.substring(1);

Method m1 = class1.getClass().getMethod("get" + name);

Object value = m1.invoke(class1);

if (value != null) {

Field f = field[i];

f.setAccessible(true);

f.set(class2, value);

}

}

}

/**

* 获取实体类 @Column 的其中一个属性名称

*

* @param clazz

* @return

*/

public static Map getColumnName(Class> clazz) {

Map map = new ConcurrentHashMap<>();

Field[] fields = clazz.getDeclaredFields();

for (Field field : fields) {

if (field.isAnnotationPresent(Column.class)) {

/**

* 获取字段名

*/

Column declaredAnnotation = field.getDeclaredAnnotation(Column.class);

String column = declaredAnnotation.name();

map.put("fieldNames", field.getName());

map.put("column", column);

break;

}

}

return map;

}

/**

* 通过获取类上的@Table注解获取表名称

*

* @param clazz

* @return

*/

public static Map getTableName(Class> clazz) {

Map map = new ConcurrentHashMap<>();

Table annotation = clazz.getAnnotation(Table.class);

String name = annotation.name();

String className = clazz.getSimpleName();

map.put("tableName", name);

map.put("className", className);

return map;

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:JAVA中的Token 基于Token的身份验证实例
下一篇:JavaEE Spring MyBatis如何一步一步实现数据库查询功能
相关文章

 发表评论

暂时没有评论,来抢沙发吧~