कॉलम नाम प्राप्त करने के लिए आप डेटाबेस मेटाडेटा का भी उपयोग कर सकते हैं। इसका यह फायदा है कि आपको कॉलम नामों को जानने की भी आवश्यकता नहीं है, बल्कि वे आपके कोड में गतिशील रूप से पुनर्प्राप्त किए जाते हैं।
public static List<String> getColumns(String tableName, String schemaName) throws SQLException{
ResultSet rs=null;
ResultSetMetaData rsmd=null;
PreparedStatement stmt=null;
List<String> columnNames =null;
String qualifiedName = (schemaName!=null&&!schemaName.isEmpty())?(schemaName+"."+tableName):tableName;
try{
stmt=conn.prepareStatement("select * from "+qualifiedName+" where 0=1");
rs=stmt.executeQuery();//you'll get an empty ResultSet but you'll still get the metadata
rsmd=rs.getMetaData();
columnNames = new ArrayList<String>();
for(int i=1;i<=rsmd.getColumnCount();i++)
columnNames.add(rsmd.getColumnLabel(i));
}catch(SQLException e){
throw e;//or log it
}
finally{
if(rs!=null)
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
throw e
}
if(stmt!=null)
try {
stmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
throw e
}
}
return columnNames;
}
एक बार आपके पास कॉलम नाम हो जाने के बाद, आप इसे सामान्य रूप से उपयोग कर सकते हैं (List.size() निश्चित रूप से कॉलम की संख्या देगा)।
अद्यतन:
//I will assume that your values (data to be inserted) is a List of Object types and that it is already populated
List<Object> data = new ArrayList<>();
//you will populate this list
//getting the column names
List<String> columnNames = getColumns("MyTable", "MyDB");
String insertColumns = "";
String insertValues = "";
if(columnNames != null && columnNames.size() > 0){
insertColumns += columnNames.get(0);
insertValues += "?";
}
for(int i = 1; i < columnNames.size();i++){
insertColumns += ", " + columnNames.get(i) ;
insertValues += "?";
}
String insertSql = "INSERT INTO MyDB.MyTable (" + insertColumns + ") values(" + insertValues + ")";
try{
PrepareStatement ps = conn.prepareStatement(insertSql);
for(Object o : data){
ps.setObject(o); //you must pass objects of correct type
}
ps.execute(); //this inserts your data
}catch(SQLException sqle){
//do something with it
}
यह कोड मानता है कि आप सही प्रकार के ऑब्जेक्ट को ReadyedStatement.setObject(Object o) विधि में पास करते हैं। मेटाडेटाबेस जानकारी का उपयोग करके कॉलम प्रकारों को पुनर्प्राप्त करना भी संभव है और फिर उस जानकारी का उपयोग टाइप चेकिंग को लागू करने के लिए करें लेकिन यह आपके कोड को और अधिक जटिल बना देगा