package rfx.server.util.sql;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.function.Function;
import javax.inject.Inject;
import javax.inject.Named;
import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;
import rfx.server.util.json.JSONArray;
import rfx.server.util.json.JSONException;
import rfx.server.util.json.JSONObject;
/**
* refer more at http://docs.spring.io/spring/docs/current/spring-framework-reference/html/jdbc.html
*
* @author Trieu.nguyen
*
*/
public class CommonSpringDAO {
protected JdbcTemplate jdbcTpl;
protected DataSource dataSource;
protected Function<DataSource, Boolean> setDataSourceCallback;
@Inject
@Named("dataSource")
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
this.jdbcTpl = new JdbcTemplate(this.dataSource);
if(setDataSourceCallback != null){
setDataSourceCallback.apply(dataSource);
}
}
public JdbcTemplate getJdbcTemplate() {
return jdbcTpl;
}
private static JSONObject toJSONObject(ResultSetMetaData rsmd, int numColumns, ResultSet rs) throws JSONException, SQLException{
JSONObject obj = new JSONObject();
for (int i = 1; i < numColumns + 1; i++) {
String column_name = rsmd.getColumnName(i);
switch (rsmd.getColumnType(i)) {
case java.sql.Types.ARRAY:
obj.put(column_name, rs.getArray(i));
break;
case java.sql.Types.BIGINT:
obj.put(column_name, rs.getInt(i));
break;
case java.sql.Types.BOOLEAN:
obj.put(column_name, rs.getBoolean(i));
break;
case java.sql.Types.BLOB:
obj.put(column_name, rs.getBlob(i));
break;
case java.sql.Types.DOUBLE:
obj.put(column_name, rs.getDouble(i));
break;
case java.sql.Types.FLOAT:
obj.put(column_name, rs.getFloat(i));
break;
case java.sql.Types.INTEGER:
obj.put(column_name, rs.getInt(i));
break;
case java.sql.Types.NVARCHAR:
obj.put(column_name, rs.getNString(i));
break;
case java.sql.Types.VARCHAR:
obj.put(column_name, rs.getString(i));
break;
case java.sql.Types.TINYINT:
obj.put(column_name, rs.getInt(i));
break;
case java.sql.Types.SMALLINT:
obj.put(column_name, rs.getInt(i));
break;
case java.sql.Types.DATE:
obj.put(column_name, rs.getDate(i));
break;
case java.sql.Types.TIMESTAMP:
obj.put(column_name, rs.getTimestamp(i));
break;
default:
obj.put(column_name, rs.getObject(i));
break;
}
}
return obj;
}
public static JSONObject convertResultSetToJSONObject(ResultSet rs) {
try {
ResultSetMetaData rsmd = rs.getMetaData();
while (rs.next()) {
int numColumns = rsmd.getColumnCount();
return toJSONObject(rsmd, numColumns, rs);
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return new JSONObject();
}
public static JSONArray convertResultSetToJSONArray(ResultSet rs) {
JSONArray jsonArray = new JSONArray();
try {
ResultSetMetaData rsmd = rs.getMetaData();
while (rs.next()) {
int numColumns = rsmd.getColumnCount();
jsonArray.put(toJSONObject(rsmd, numColumns, rs));
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return jsonArray;
}
}