- 在这里,jdbc是java database connection的缩写
- 我们在Java连接数据库时,一般有六个步骤:
1.加载驱动程序类;2.建立连接;3.创建语句;4.执行语句;5.处理结果;6.释放资源
我们把查询方法进行封装的目的是定义一个查询方法,能够实现对不同SQL语句做出对应的结果
下面我们来看这样一段代码,并对代码进行分析,代码执行的先后顺序用小写字母表示:
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
interface IRowMapper{
void rowMapper(ResultSet resultSet);
}
public class Select {
public static void select(String sql,IRowMapper rowMapper) {
Connection connection=null;
Statement statement=null;
ResultSet resultSet=null;
try {
Class.forName("com.mysql.jdbc.Driver");//d.加载驱动程序类
connection=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test", "root", "root");//e.建立连接
statement=connection.createStatement();//f.创建语句
resultSet=statement.executeQuery(sql);//g.执行语句
rowMapper.rowMapper(resultSet);//h.在这里为rowMapper对象调用IRowMapper接口的实现类RowMapper重写后的rowMapper方法,在这里为一个多态,此时程序运行转向main方法中的内部类中的重写后的roeMapper方法
}catch (Exception e) {
e.printStackTrace();
}finally {//k.释放资源
if (resultSet!=null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (statement!=null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection!=null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}//l.select方法执行完毕,回到main方法中的执行过程
public static void main(String[] args) {
class RowMapper implements IRowMapper{
@Override
public void rowMapper(ResultSet resultSet) {
try {
while(resultSet.next()) {//i.遍历结果,此时java中的“指针”刚开始指向空,resultSet.next()表示指向空的下一个,如果不为空,则就输出查询到的该元素的所有信息
String id=resultSet.getString("id");
String name=resultSet.getString("name");
System.out.println(id);
System.out.println("name");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}//j.内部类中的rowMapper方法执行完毕,这时候程序执行回到select方法
String sql="select *from student";//a.sql中存的是字符串的地址
IRowMapper rowMapper = new RowMapper();//b.这里的rowMapper是一个上转型对象,存的是RowMapper新对象的地址,在这里我们创建的RowMapper实际上为IRowMappe接口的实现类
select(sql,rowMapper ); //c、开始调用select方法,执行过程切换到select方法,传入sql语句字符串地址,和IRowMapper实现类创建的对象的地址
} //因为main方法结束,则整个程序结束
}
- 下面我们来看这样一段代码;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54package jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class Test1 { public static ResultSet select(String sql) { Connection connection = null; Statement statement = null; ResultSet rs = null; try { Class.forName("com.mysql.jdbc.Driver"); connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test", "root", "root"); statement = connection.createStatement(); rs = statement.executeQuery(sql); while(rs.next()) { String id = rs.getString("id"); String address = rs.getString("address"); System.out.println(id); System.out.println(address); } } catch (Exception e) { e.printStackTrace(); }finally { if (rs!=null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (statement!=null) { try { statement.close(); } catch (SQLException e) { e.printStackTrace(); } } if (connection!=null) { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } return null; } public static void main(String[] args) { select("select * from student"); } }
此时的sql中有
并且此时代码的运行结果为:
但是这样的方法有一个弊端,就是这样写代码的话,具有单一性,只能输出id和address,不能实现对不同sql语句有不同输出结果的功能。
- 还有一种代码的方式,也是值得我们从中思考的:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59package jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class Test2 { public static ResultSet select(String sql) { Connection connection = null; Statement statement = null; ResultSet rs = null; try { Class.forName("com.mysql.jdbc.Driver"); connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test", "root", "root"); statement = connection.createStatement(); rs = statement.executeQuery(sql); return rs; } catch (Exception e) { e.printStackTrace(); }finally { if (rs!=null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (statement!=null) { try { statement.close(); } catch (SQLException e) { e.printStackTrace(); } } if (connection!=null) { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } return null; } public static void main(String[] args) { ResultSet resultSet=select("select * from student"); try { while(resultSet.next()) { String id = resultSet.getString("id"); String address = resultSet.getString("address"); System.out.println(id); System.out.println(address); } } catch (Exception e) { e.printStackTrace(); } } }
这时候在main方法中的,try-catch中的代码块是不执行的,因为在resultSet调用select方法时,再执行前面的select方法时,执行到finally时,就把资源释放了,此时while语句及下面的代码块就不执行了。
最后
以上就是怕黑毛豆最近收集整理的关于详述jdbc查询方法的执行过程的全部内容,更多相关详述jdbc查询方法内容请搜索靠谱客的其他文章。
发表评论 取消回复