代码
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 row(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");// 加载
connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1/test", "root", "root");
statement = connection.createStatement();
resultSet = statement.executeQuery(sql);
rowMapper.row(resultSet);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
public static void main(String[] args) {
class RowMapper implements IRowMapper {
@Override
public void row(ResultSet resultSet) {
try {
while (resultSet.next()) {
String name = resultSet.getString("name");
String address = resultSet.getString("address");
System.out.print(name);
System.out.print(address);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
select("select name,address from student", new RowMapper());
}
}
结果
nullnull
Navicat Premium 12
我们在这个MySQL图形化客户端管理工具上面建立MySQL,执行语句。
里面我们要用到的代码为:
use test;
create table student(
id char(50),
name char(40),
user_name varchar(50),
address varchar(85),
password varchar(150)
);
执行过程
因为要将判断语句从外部插入进去,所以,我们用接口和内部类实现这一功能。
1.我们再来看一下main方法中的代码如何执行。
执行select语句,传入select方法一个查询信息的语句,和一个对象。
2.跳到select方法。
(1)加载驱动类。使用Class.forName(“com.mysql.jdbc.Driver”);语句实现此功能。其中的com.mysql.jdbc.Driver可以找到Driver()复制过来。
(2)连接。使用connection = DriverManager.getConnection(“jdbc:mysql://127.0.0.1/test”, “root”, “root”);实现此功能,jdbc,意思是一种java API。MySQL点明我们是用的是MySQL执行的。127.0.0.1是本机,root是用户名,root是密码。不一定要和我的完全一样。
(3)创建语句。使用statement = connection.createStatement();语句实现。createStatement翻译过来就是创建语句嘛。
(4)执行语句。executeQuery()方法实现。这个方法被用来执行 select语句,但也只能执行查询语句,执行后返回代表查询结果的ResultSet对象。之后就要判断了,所以我们调用了row方法。传入resultSet。
3.进入内部类实现row方法 。resultSet.next() 就是本来内容是一条连续的有各自空间的长条。(看下图),在第一条内容上面有一个指针,这时候指针什么也不指,然而,当我们使用的时候,它会看一下他下面有没有内容,有内容的话就继续向下走,没有的话就停止了。我们用他的这个特性来判断语句是否执行完毕。在while内部,我们定义name和address,然后输出。由于运行时错误,我们使用try-catch来抛出。返回select方法,进行资源释放。即finally里的内容。因为要是先释放connection的话,由于statement还存在,所以无法释放成功。所以我们先释放statement,再释放connection。