java实体类属性太多,有上百个。如果页面添加 你需要把这个好几百个属性都一个一个name对应写在input里面,导致页面太庞大而且你不敢保证你写的属性某个有错误。
针对这种情况我当时也是一脸懵逼,我这边有三四百个属性,如果一个一个去粘贴复制,肯定很累人。所以我去网上找方法,找了半天也没有找到我想要的。
最后还是公司一个技术非常好的牛哥有一个解决方案就是直接从数据库读取实体类所对应的表数据 可以读取到表名,列名、列的注释。然后封装进一个map集合里面,拿到前台直接循环便利这个map给input赋值name属性。哈哈 大大的减少了就业面input数量,而且你还能保证属性的正确性。特此贴出代码,也让跟我一样碰见这种情况的人能有一个好的解决方案。
第一步:Java有一个JDBC这个连接数据库的工具类,他可以读取数据库任何你想要的。具体看他的API.
public void init() {
Connection conn = null;
Statement stmt = null;
try {
Class.forName(TableInfoUtil.getProperty("driverClass"));//加载数据库驱动
conn = DriverManager.getConnection(TableInfoUtil.getProperty("jdbcUrl"), TableInfoUtil.getProperty("user"),//获取连接
TableInfoUtil.getProperty("password"));
stmt = conn.createStatement();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
initRateIndex(conn, stmt);
}
private void initRateIndex(Connection conn, Statement stmt) {
ResultSet rs = null;
Strring sql="SELECT table_schema,table_name,column_name ,column_comment ,COLUMN_TYPE
FROM information_schema.columns WHERE TABLE_NAME ='表名' AND TABLE_SCHEMA = '数据库名字'
"
//table_schema(数据库名称),table_name(表名),column_name (列名),column_comment(列上的注释) ,COLUMN_TYPE (列的类型) where 表名你可以写成like 那就查询好几个相似的表
try {
rs = stmt.executeQuery(sql);
Map<String, TableObject> tableMap = new HashMap<String, TableObject>();//这个是我自己封装的map类、具体你可以赋值sql语句先去执行看一下,然后根据你的业务情况自己写一个map类。
while (rs.next()) {
String tableName = rs.getString("table_name").toLowerCase();
String columnName = rs.getString("column_name").toLowerCase();
if (columnName.indexOf("id") != -1 || columnName.indexOf("Id") != -1 || columnName.indexOf("ID") != -1
|| columnName.indexOf("_flag") != -1) {
continue;
}
TableObject to = new TableObject();
if (null == tableMap.get(tableName)) {
to.setTableName(TableInfoUtil.getProperty(tableName));
to.settName_vaule(tableName);
tableMap.put(tableName, to);
} else {
to = (TableObject) tableMap.get(tableName);
}
TableColumnObject tco = new TableColumnObject();
String colunm = rs.getString("column_comment");
if (colunm.indexOf(":") != -1) {
colunm = colunm.substring(0, colunm.indexOf(":"))
+ colunm.substring(colunm.indexOf(":") + 1, colunm.length());
}
if (colunm.indexOf(":") != -1) {
colunm = colunm.substring(0, colunm.indexOf(":"))
+ colunm.substring(colunm.indexOf(":") + 1, colunm.length());
}
if (colunm.indexOf(" ") != -1) {
colunm = colunm.substring(0, colunm.indexOf(" "));
}
/* if (colunm.indexOf("(") != -1) {
colunm = colunm.substring(0, colunm.indexOf("("))
+ colunm.substring(colunm.indexOf(")") + 1, colunm.length());
}
if (colunm.indexOf("(") != -1) {
colunm = colunm.substring(0, colunm.indexOf("("))
+ colunm.substring(colunm.indexOf(")") + 1, colunm.length());
}*/
tco.setT_columnName(colunm);
tco.setT_columnValue(columnName);
String colunmType = rs.getString("COLUMN_TYPE");
String [] typeArray = colunmType.replaceAll("[^0-9]", ",").split(",");
to.getTableColumns().add(tco);
}
GlobalParam.tableMap = tableMap;//上面的代码只是根据我的一些情况做了一些处理,你可以不用 直接写直接获取 例如:String tableName = rs.getString("table_name").toLowerCase();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
closeAll(conn, stmt, rs);
}
}
public void closeAll(Connection conn, Statement stmt, ResultSet rs) {
try {
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
第二部,封装进map里面了就行了,然后你在control里面或者初始化的时候就把这些获取到,然后在页面直接循环你这个map
<form id="wsbalanceSheetTabform">
<table border="1" class="headTable1">
<%
Map<String, TableObject> tableMap =GlobalParam.tableMap;
int coun=0;
for (Map.Entry<String, TableObject> entry : tableMap.entrySet()) {
if(entry.getKey().equalsIgnoreCase("m_balancesheet")){
TableObject to= entry.getValue();
List<TableColumnObject> tableColumns=to.getTableColumns();
for(int i = 0,r=76;i<tableColumns.size();i++,r++){%>
<%if(tableColumns.get(i).getT_columnValue().equalsIgnoreCase("year")){ %>
<thead><tr><th><%=tableColumns.get(i).getT_columnName() %></th>
<%for(int k=0;k<4;k++){ %>
<td colspan="2">
<div class="input-group date form_date1" >
<input type="text" class="form-control form_datetime date1 " name="list[<%=k %>].<%=tableColumns.get(i).getT_columnValue()%>" id="<%=tableColumns.get(i).getT_columnValue()%>balan<%=k+1 %>" οnchange="pdyearjidu('quarteryearbalan<%=k+1 %>','wsbalanceSubmit','balan');getOneBalanInfoQs('<%=k+1 %>','balan')" data-placement="bottom" data-content="该年度报表类型已经存在" data-trigger="manual">
<span class="input-group-addon"><span class="glyphicon glyphicon-time" ></span></span>
</div>
</td>
<% }%>
</tr>
<%} %>
<%if(tableColumns.get(i).getT_columnValue().equalsIgnoreCase("isunite")){ %>
<tr><th><%=tableColumns.get(i).getT_columnName() %></th>
<%for(int k=0;k<4;k++){ %>
<td colspan="2"><select name="list[<%=k %>].<%=tableColumns.get(i).getT_columnValue()%>" id="<%=tableColumns.get(i).getT_columnValue()%>balan<%=k+1 %>" class="form-control">
<option value="0">个体</option>
<option value="1">合并</option>
</select>
</td>
<% }%>
</tr></thead>
<%} %>
<%if(tableColumns.get(i).getT_columnValue().equalsIgnoreCase("quarterYear")){ %>
<tr><th><%=tableColumns.get(i).getT_columnName() %></th>
<%for(int k=0;k<4;k++){ %>
<td colspan="2">
<select id="<%=tableColumns.get(i).getT_columnValue()%>balan<%=k+1 %>" name="list[<%=k %>].<%=tableColumns.get(i).getT_columnValue()%>" class="form-control a" data-placement="bottom" data-content="该年度报表类型已经存在" data-trigger="manual" οnchange="pdyearjidu(this.id,'wsbalanceSubmit','balan');getOneBalanInfoQs('<%=k+1 %>','balan')">
<option value="1">一季报</option>
<option value="2">中报</option>
<option value="3">三季报 </option>
<option value="4">年报 </option>
</select>
</td>
<% }%>
</tr>
<%} %>
<% if(i>=3&&i<=78){
if(i==3){%>
<tbody> <tr>
<th ></th>
<th >期初数</th>
<th >期末数</th>
<th >期初数</th>
<th >期末数</th>
<th >期初数</th>
<th >期末数</th>
<th >期初数</th>
<th >期末数</th>
</tr>
<tr style="background-color: rgba(241, 227, 54, 0.85);"><th >流动资产:</th>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<% }
if(i==20){
%>
<tr style="background-color: rgba(241, 227, 54, 0.85);"><th >非流动资产:</th>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<%} %>
<tr>
<th><%=tableColumns.get(i).getT_columnName() %></th>
<td><input id="<%=tableColumns.get(i).getT_columnValue()%>balan1" name="list[<%=coun %>].<%=tableColumns.get(i).getT_columnValue()%>" maxlength="<%=tableColumns.get(i).getT_columnType()%>" οnkeyup="checkDouble1(this.id,'wsbalanceSubmit');checkyear(this.id,'yearprofit<%=coun+1 %>')" οnblur="blurhide(this.id)" data-placement="bottom" data-content="请输入合法数字并小数位不能超过三位" class="form-control empty1"/></td>
<td><input id="<%=tableColumns.get(r).getT_columnValue()%>balan1" name="list[<%=coun %>].<%=tableColumns.get(r).getT_columnValue()%>" maxlength="<%=tableColumns.get(r).getT_columnType()%>" οnkeyup="checkDouble1(this.id,'wsbalanceSubmit');checkyear(this.id,'yearprofit<%=coun+1 %>')" οnblur="blurhide(this.id)" data-placement="bottom" data-content="请输入合法数字并小数位不能超过三位" class="form-control empty1"/></td>
<td><input id="<%=tableColumns.get(i).getT_columnValue()%>balan2" name="list[<%=coun+1 %>].<%=tableColumns.get(i).getT_columnValue()%>" maxlength="<%=tableColumns.get(i).getT_columnType()%>" οnkeyup="checkDouble1(this.id,'wsbalanceSubmit');checkyear(this.id,'yearprofit<%=coun+2 %>')" οnblur="blurhide(this.id)" data-placement="bottom" data-content="请输入合法数字并小数位不能超过三位" class="form-control empty2"/></td>
<td><input id="<%=tableColumns.get(r).getT_columnValue()%>balan2"name="list[<%=coun+1 %>].<%=tableColumns.get(r).getT_columnValue()%>" maxlength="<%=tableColumns.get(r).getT_columnType()%>" οnkeyup="checkDouble1(this.id,'wsbalanceSubmit');checkyear(this.id,'yearprofit<%=coun+2 %>')" οnblur="blurhide(this.id)" data-placement="bottom" data-content="请输入合法数字并小数位不能超过三位" class="form-control empty2"/></td>
<td><input id="<%=tableColumns.get(i).getT_columnValue()%>balan3" name="list[<%=coun+2 %>].<%=tableColumns.get(i).getT_columnValue()%>" maxlength="<%=tableColumns.get(i).getT_columnType()%>" οnkeyup="checkDouble1(this.id,'wsbalanceSubmit');checkyear(this.id,'yearprofit<%=coun+3 %>')" οnblur="blurhide(this.id)" data-placement="bottom" data-content="请输入合法数字并小数位不能超过三位" class="form-control empty3"/></td>
<td><input id="<%=tableColumns.get(r).getT_columnValue()%>balan3"name="list[<%=coun+2 %>].<%=tableColumns.get(r).getT_columnValue()%>" maxlength="<%=tableColumns.get(r).getT_columnType()%>" οnkeyup="checkDouble1(this.id,'wsbalanceSubmit');checkyear(this.id,'yearprofit<%=coun+3 %>')" οnblur="blurhide(this.id)" data-placement="bottom" data-content="请输入合法数字并小数位不能超过三位" class="form-control empty3"/></td>
<td><input id="<%=tableColumns.get(i).getT_columnValue()%>balan4"name="list[<%=coun+3 %>].<%=tableColumns.get(i).getT_columnValue()%>" maxlength="<%=tableColumns.get(i).getT_columnType()%>" οnkeyup="checkDouble1(this.id,'wsbalanceSubmit');checkyear(this.id,'yearprofit<%=coun+4 %>')" οnblur="blurhide(this.id)" data-placement="bottom" data-content="请输入合法数字并小数位不能超过三位" class="form-control empty4"/></td>
<td><input id="<%=tableColumns.get(r).getT_columnValue()%>balan4"name="list[<%=coun+3 %>].<%=tableColumns.get(r).getT_columnValue()%>" maxlength="<%=tableColumns.get(r).getT_columnType()%>" οnkeyup="checkDouble1(this.id,'wsbalanceSubmit');checkyear(this.id,'yearprofit<%=coun+4 %>')" οnblur="blurhide(this.id)" data-placement="bottom" data-content="请输入合法数字并小数位不能超过三位" class="form-control empty4"/></td>
<tr>
<%
}//end if
%>
<%
}//end for
}
}
%>
</tbody></table>
<div class="btn-group btn-group-lg," style="width: 100%;">
<center>
<button type="button" id="wsbalanceSubmit" class="btn btn-primary btn-lg" style="width: 17%;" οnclick="editBalanQsInfo('wsbalanceSheetTabform','1')">保存</button>
<button type="button" class="btn btn-primary btn-lg" data-dismiss="modal" style="width: 17%;" >放弃</button>
</center>
</div>
</form>
上面就是我自己在启动项目的时候直接初始化了,然后在jsp页面直接小脚本调用我那个获取数据库相关信息的类循环。因为我是获取一个数据库好几个表 所以我想获取哪个表 我就自己判断了一下 if(entry.getKey().equalsIgnoreCase("m_balancesheet")){ 然后开始循环这个表里的所有的列名字 列注解 列的类型(用于看看这个字段限制的数量)。
如果你不是jsp页面,是html那你就在control里面直接给返回那个map。然后用js循环,用js添加input。道理是一样的。
我这个写的代码逻辑可能有些问题,我没时间改进,你可以根据你自己的改进一下。
最主要的是 JDBC他可以直接从数据库获取信息。这样就方便了好多。