利用JAVA反射,读取数据库表名,自动生成对应实体类的操作
本代码是利用java反射,读取数据库表自动根据表名生成实体类,数据库采用老牌SQLSERVER2000,驱动为JTDS,其他数据库可根据情况自定修改。
代码中包含了大部分数据库类型与JAVA类型的转换,少数未包含进去的会在生成代码时打印出来,方面后期查找修改。
importjava.io.File;
importjava.io.FileWriter;
importjava.io.IOException;
importjava.io.PrintWriter;
importjava.sql.Connection;
importjava.sql.DriverManager;
importjava.sql.PreparedStatement;
importjava.sql.ResultSetMetaData;
importjava.sql.SQLException;
importjava.text.SimpleDateFormat;
importjava.util.Date;
/**
*从数据库表反射出实体类,自动生成实体类
*
*@authorZero
*
*/
publicclassSqlHelper{
//基本数据配置
privateStringpackageOutPath="com.xxx.entity.system";//指定实体生成所在包的路径
privateStringauthorName="Zero";//作者名字
privateStringtablename="xxx";//表名
privateString[]colnames;//列名数组
privateString[]colTypes;//列名类型数组
privateStringversion="V0.01";//版本
privateint[]colSizes;//列名大小数组
privatebooleanf_util=false;//是否需要导入包java.util.*
privatebooleanf_sql=false;//是否需要导入包java.sql.*
privatebooleanf_lang=false;//是否需要导入包java.sql.*
privateStringdefaultPath="/src/main/java/";
//数据库连接
privatestaticfinalStringURL="jdbc:jtds:sqlserver://192.168.29.128:1433/xxx";
privatestaticfinalStringNAME="sa";
privatestaticfinalStringPASS="xxx";
privatestaticfinalStringDRIVER="net.sourceforge.jtds.jdbc.Driver";
/*
*构造函数
*/
publicSqlHelper(){
//创建连接
Connectioncon;
//查要生成实体类的表
Stringsql="select*from"+tablename;
PreparedStatementpStemt=null;
try{
try{
Class.forName(DRIVER);
}catch(ClassNotFoundExceptione1){
//TODOAuto-generatedcatchblock
e1.printStackTrace();
}
con=DriverManager.getConnection(URL,NAME,PASS);
pStemt=con.prepareStatement(sql);
ResultSetMetaDatarsmd=pStemt.getMetaData();
intsize=rsmd.getColumnCount();//统计列
colnames=newString[size];
colTypes=newString[size];
colSizes=newint[size];
for(inti=0;i='a'&&ch[0]<='z'){
ch[0]=(char)(ch[0]-32);
}
returnnewString(ch);
}
/**
*功能:获得列的数据类型
*
*@paramsqlType
*@return
*/
privateStringsqlType2JavaType(StringsqlType){
if(sqlType.equalsIgnoreCase("bit")){
return"Boolean";
}elseif(sqlType.equalsIgnoreCase("decimal")||sqlType.equalsIgnoreCase("money")
||sqlType.equalsIgnoreCase("smallmoney")||sqlType.equalsIgnoreCase("numeric")
||sqlType.equalsIgnoreCase("bigint")){
return"Long";
}elseif(sqlType.equalsIgnoreCase("float")){
return"Double";
}elseif(sqlType.equalsIgnoreCase("int")||sqlType.equalsIgnoreCase("intidentity")){
return"Integer";
}elseif(sqlType.equalsIgnoreCase("image")||sqlType.equalsIgnoreCase("varbinary(max)")
||sqlType.equalsIgnoreCase("varbinary")||sqlType.equalsIgnoreCase("udt")
||sqlType.equalsIgnoreCase("timestamp")||sqlType.equalsIgnoreCase("binary")){
return"Byte[]";
}elseif(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";
}elseif(sqlType.equalsIgnoreCase("real")){
return"Float";
}elseif(sqlType.equalsIgnoreCase("smallint")||sqlType.equalsIgnoreCase("tinyint")){
return"Short";
}elseif(sqlType.equalsIgnoreCase("date")||sqlType.equalsIgnoreCase("datetime")
||sqlType.equalsIgnoreCase("time")||sqlType.equalsIgnoreCase("datetime2")){
return"Date";
}else{
System.out.println("数据类型异常,类型为:"+sqlType);
}
returnnull;
}
/**
*出口TODO
*
*@paramargs
*/
publicstaticvoidmain(String[]args){
newSqlHelper();
}
}
补充知识:java通过反射获取类名、属性名称以及@Table注解上的表名称
我就废话不多说了,大家还是直接看代码吧~
importjavax.persistence.Column;
importjavax.persistence.Id;
importjavax.persistence.Table;
importjava.lang.reflect.Field;
importjava.lang.reflect.Method;
importjava.util.Map;
importjava.util.concurrent.ConcurrentHashMap;
/**
*@authorcaizw
*@createDate2018/2/8
*@description反射工具类
*/
publicclassReflectUtils{
/**
*获取实体类主键
*
*@paramclazz
*@return
*/
publicstaticFieldgetIdField(Class>clazz){
Field[]fields=clazz.getDeclaredFields();
Fielditem=null;
for(Fieldfield:fields){
Idid=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);
}
}
returnitem;
}
/**
*根据主键名称获取实体类主键属性值
*
*@paramclazz
*@parampkName
*@return
*/
publicstaticObjectgetPkValueByName(Objectclazz,StringpkName){
try{
StringfirstLetter=pkName.substring(0,1).toUpperCase();
Stringgetter="get"+firstLetter+pkName.substring(1);
Methodmethod=clazz.getClass().getMethod(getter,newClass[]{});
Objectvalue=method.invoke(clazz,newObject[]{});
returnvalue;
}catch(Exceptione){
returnnull;
}
}
/**
*通过反射将class1不为空的值赋值给class2
*
*@paramclass1
*@paramclass2
*@throwsException
*/
publicstaticvoidreflectClass1ToClass2(Objectclass1,Objectclass2)throwsException{
Field[]field=class1.getClass().getDeclaredFields();
for(inti=0;igetColumnName(Class>clazz){
Mapmap=newConcurrentHashMap<>();
Field[]fields=clazz.getDeclaredFields();
for(Fieldfield:fields){
if(field.isAnnotationPresent(Column.class)){
/**
*获取字段名
*/
ColumndeclaredAnnotation=field.getDeclaredAnnotation(Column.class);
Stringcolumn=declaredAnnotation.name();
map.put("fieldNames",field.getName());
map.put("column",column);
break;
}
}
returnmap;
}
/**
*通过获取类上的@Table注解获取表名称
*
*@paramclazz
*@return
*/
publicstaticMapgetTableName(Class>clazz){
Mapmap=newConcurrentHashMap<>();
Tableannotation=clazz.getAnnotation(Table.class);
Stringname=annotation.name();
StringclassName=clazz.getSimpleName();
map.put("tableName",name);
map.put("className",className);
returnmap;
}
}
以上这篇利用JAVA反射,读取数据库表名,自动生成对应实体类的操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。