利用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){ Map map=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 */ publicstaticMap getTableName(Class>clazz){ Map map=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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。