Java 如何概括resultset查询?
目前,我正在编写一个脚本,该脚本从一个数据库的不同表中读取多个值。每次启动请求时,我都必须打开一条语句并创建一个新的结果集,这将导致可怕的重复代码。什么是推广这一点的好方法?如何做到这一点 我的代码中的一些元素。目前只有一条语句,必须插入结束语。我问这个问题的主要原因之一Java 如何概括resultset查询?,java,sqlite,resultset,Java,Sqlite,Resultset,目前,我正在编写一个脚本,该脚本从一个数据库的不同表中读取多个值。每次启动请求时,我都必须打开一条语句并创建一个新的结果集,这将导致可怕的重复代码。什么是推广这一点的好方法?如何做到这一点 我的代码中的一些元素。目前只有一条语句,必须插入结束语。我问这个问题的主要原因之一 public static void main(String[] args) throws Exception { Connection c = null; Statement stmt
public static void main(String[] args) throws Exception
{
Connection c = null;
Statement stmt = null;
try
{
//set up database connection
Class.forName("org.sqlite.JDBC");
c = DriverManager.getConnection("jdbc:sqlite:/nfs/home/mals/p/pu2002/workspace/Database2");
c.setAutoCommit(false);
stmt = c.createStatement();
//end
//get task id to work with
String Task_id = null;
if(args.length != 0) //if an argument was passed, Task_id will be the first element of the array args (arguments)
{
Task_id = args[0];
}
else if(args.length == 0) //if no arguments were passed, the highest number in the column id from tasks_task will be selected and set as Task_id
{
ResultSet TTask_id = stmt.executeQuery("SELECT max(id) FROM tasks_task");
int t_id = TTask_id.getInt(1);
Task_id = String.valueOf(t_id);
TTask_id.close();
}
//end
//get solution IDs from taks_ids
ArrayList<Integer> List_solIDs = new ArrayList<Integer>(); //create an empty array list
ResultSet SSolution_task_id = stmt.executeQuery("SELECT id FROM solutions_solution WHERE task_id ="+Task_id + " AND final = 1;"); //Sqlite3-Ausdruck SELECT..., Task IDs verändern pro Aufgabe - "SELECT * FROM solutions_solution where task_id ="+Task_id +";"
while (SSolution_task_id.next()) //loops through all elements of SSolution_task_id
{
List_solIDs.add(SSolution_task_id.getInt("id")); //adds all elements of the resultset SSolution_task_id to the list List_solIDs
}
SSolution_task_id.close();
//end
//get logs according to content type
int count = List_solIDs.size();
String log_javaBuilder = null;
List<String> log_JunitChecker = new ArrayList<String>();
for (int i = 0; i < count; i++)
{
boolean sol_id_valid = false;
String solID = String.valueOf(List_solIDs.get(i));
try
{
ResultSet AAttestation_sol_id = stmt.executeQuery("SELECT * FROM attestation_attestation WHERE solution_id =" +solID+";");
int Returned = AAttestation_sol_id.getInt("final_grade_id");
}
catch(Exception e)
{
sol_id_valid = true;
}
if(sol_id_valid ==true)
{
try
{
ResultSet CCresult_javaBuilder = stmt.executeQuery("SELECT log FROM checker_checkerresult WHERE solution_id = " +solID+ " AND content_type_id = 22;"); //"SELECT id FROM checker_checkerresult where solution_id = " +List_solIDs.get(i)+ ";"
log_javaBuilder = CCresult_javaBuilder.getString("log");
CCresult_javaBuilder.close();
ResultSet CCresult_Junit_checker = stmt.executeQuery("SELECT log FROM checker_checkerresult WHERE solution_id = " +solID+ " AND content_type_id = 24;");
while (CCresult_Junit_checker.next())
{
log_JunitChecker.add(CCresult_Junit_checker.getString("log"));
}
CCresult_Junit_checker.close();
}
catch (Exception e)
{
log_JunitChecker.add(null);
}
//end
publicstaticvoidmain(字符串[]args)引发异常
{
连接c=null;
语句stmt=null;
尝试
{
//建立数据库连接
Class.forName(“org.sqlite.JDBC”);
c=DriverManager.getConnection(“jdbc:sqlite:/nfs/home/mals/p/pu2002/workspace/Database2”);
c、 设置自动提交(错误);
stmt=c.createStatement();
//结束
//获取要使用的任务id
字符串Task_id=null;
if(args.length!=0)//如果传递了参数,则Task_id将是数组args(arguments)的第一个元素
{
Task_id=args[0];
}
else if(args.length==0)//如果未传递任何参数,则将从tasks\u task中选择列id中的最大数字,并将其设置为task\u id
{
ResultSet TTask_id=stmt.executeQuery(“从任务中选择最大id”);
int t_id=TTask_id.getInt(1);
Task_id=String.valueOf(t_id);
t任务id.close();
}
//结束
//从taks_ID获取解决方案ID
ArrayList_solIDs=new ArrayList();//创建一个空数组列表
结果集SSolution_task_id=stmt.executeQuery(“从解决方案中选择id,其中task_id=“+task_id+”和final=1;”;//Sqlite3 Ausdruck SELECT…,task id verÃndren pro Aufgabe-“从解决方案中选择*,其中task_id=“+task_id+”;”
while(SSolution\u task\u id.next())//遍历SSolution\u task\u id的所有元素
{
List_solIDs.add(SSolution_task_id.getInt(“id”));//将结果集SSolution_task_id的所有元素添加到List_solIDs
}
SSolution_task_id.close();
//结束
//根据内容类型获取日志
int count=List_solIDs.size();
字符串log_javaBuilder=null;
List log_JunitChecker=new ArrayList();
for(int i=0;i
欢迎所有类型的潜在改进
注:尝试过谷歌搜索。比自己编写泛型方法更好使用一些框架总是更好,有很多JPA实现不仅解决了这个问题,而且还处理了多个持久层的代码。从开始使用JPA。你也可以使用Spring JDBC模板来解决我的问题如上所述
现在,如果你真的不想要任何框架依赖关系,并且很快就完成了这段代码,那么你可以定义自己的JDBCTemplate类,它接受查询和参数映射并返回结果集。这个类可以处理打开的连接、查询执行和关闭连接等。似乎你想使用一些ORM层,例如 您要查找的可能是一个更高级别的层,
将您从底层较低级别的JDBC编码类型中抽象出来。如果您尝试在方法上使用泛型会怎么样?这是一个简单的示例,仅供说明,您必须改进所有这些:) 资源:
publicstaticlist getSingleValueList(结果集rs、类clazz、字符串colName)引发异常{
ArrayList=新建ArrayList();
while(rs.next()){//遍历泛型列表的所有元素
list.add((T)rs.getObject(colName));//将结果集rs的所有元素添加到列表中
}
rs.close();
退货清单;
}
公共静态T getSingleValue(结果集rs、类clazz、字符串colName)引发异常{
试一试{
if(rs.next()){//遍历泛型列表的所有元素
返回(T)rs.getObject(colName);
}否则{
抛出新异常(“未找到值”);
}
}最后{
rs.close();
}
}
公共静态void main(字符串[]args)引发异常{
连接c=null;
语句stmt=null;
试一试{
//建立数据库连接
Class.forName(“org.sqlite.JDBC”);
c=DriverManager.getConnection(“jdbc:sqlite:/nfs/home/mals/p/pu2002/workspace/Database2”);
c、 设置自动提交(错误);
stmt=c.createStatement(
public static <T> List<T> getSingleValueList(ResultSet rs, Class<T> clazz, String colName) throws Exception {
ArrayList<T> list = new ArrayList<T>();
while (rs.next()) {//loops through all elements of generic list
list.add((T) rs.getObject(colName)); //adds all elements of the resultset rs to the list
}
rs.close();
return list;
}
public static <T> T getSingleValue(ResultSet rs, Class<T> clazz, String colName) throws Exception {
try {
if (rs.next()) {//loops through all elements of generic list
return (T) rs.getObject(colName);
} else {
throw new Exception("no value found.");
}
} finally {
rs.close();
}
}
public static void main(String[] args) throws Exception {
Connection c = null;
Statement stmt = null;
try {
//set up database connection
Class.forName("org.sqlite.JDBC");
c = DriverManager.getConnection("jdbc:sqlite:/nfs/home/mals/p/pu2002/workspace/Database2");
c.setAutoCommit(false);
stmt = c.createStatement();
//end
//get task id to work with
String Task_id = null;
if (args.length != 0) //if an argument was passed, Task_id will be the first element of the array args (arguments)
{
Task_id = args[0];
} else if (args.length == 0) //if no arguments were passed, the highest number in the column id from tasks_task will be selected and set as Task_id
{
ResultSet TTask_id = stmt.executeQuery("SELECT max(id) FROM tasks_task");
int t_id = TTask_id.getInt(1);
Task_id = String.valueOf(t_id);
TTask_id.close();
}
//end
//get solution IDs from taks_ids
ResultSet SSolution_task_id = stmt.executeQuery("SELECT id FROM solutions_solution WHERE task_id =" + Task_id + " AND final = 1;"); //Sqlite3-Ausdruck SELECT..., Task IDs verändern pro Aufgabe - "SELECT * FROM solutions_solution where task_id ="+Task_id +";"
List<Integer> List_solIDs = getSingleValueList(SSolution_task_id, Integer.class, "id"); //create an empty array list
//end
//get logs according to content type
int count = List_solIDs.size();
String log_javaBuilder = null;
List<String> log_JunitChecker = new ArrayList<String>();
List<String> tmplog_JunitChecker;
for (int i = 0; i < count; i++) {
boolean sol_id_valid = false;
String solID = String.valueOf(List_solIDs.get(i));
try {
ResultSet AAttestation_sol_id = stmt.executeQuery("SELECT * FROM attestation_attestation WHERE solution_id =" + solID + ";");
Integer Returned = getSingleValue(AAttestation_sol_id, Integer.class, "final_grade_id");
} catch (Exception e) {
sol_id_valid = true;
}
if (sol_id_valid == true) {
try {
ResultSet CCresult_javaBuilder = stmt.executeQuery("SELECT log FROM checker_checkerresult WHERE solution_id = " + solID + " AND content_type_id = 22;"); //"SELECT id FROM checker_checkerresult where solution_id = " +List_solIDs.get(i)+ ";"
log_javaBuilder = getSingleValue(CCresult_javaBuilder, String.class, "log");
ResultSet CCresult_Junit_checker = stmt.executeQuery("SELECT log FROM checker_checkerresult WHERE solution_id = " + solID + " AND content_type_id = 24;");
tmplog_JunitChecker = getSingleValueList(CCresult_Junit_checker, String.class, "log");
log_JunitChecker.addAll(tmplog_JunitChecker);
} catch (Exception e) {
log_JunitChecker.add(null);
}
//end
}
}
} catch (Exception eeee) {
//handle it
}
}