1、加载驱动
首先将驱动 jar 包从数据库系统官方网站上下载下来,并将驱动 jar 包添加到构建路径中。
Class.forName("驱动串");
这里的驱动串就是需要加载的 JDBC 驱动程序的名称。
JDBC 的驱动方式可以分为 4 种类型:JDBC-ODBC 桥接方式、Native-API 驱动、JDBC-Net 驱动和 Native-protocol驱动。
2、获取连接
可以通过驱动管理器 DriverManager 类获取和数据库系统的连接。
Connection conn=DriverManager.getConnection("连接串","连接数据库的用户名称","对应的口令");
连接串用于代表需要连接的数据库,连接串的标准 jdbc 主协议:子协议:其它部分,但是不同的数据库系统其对应的连接串不同。
3、构建语句对象
在与特定数据库建立连接后,就可以发送 SQL 语句,在发送 SQL 语句之前需要创建一个语句对象。
Statement stmt=conn.createStatement();
ResultSet res=stmt.executeQuery("select * from tb_student");
通过语句对象提交所需要执行的 SQL 语句。一般不建议使用 Statement 对象,这个对象用于提交静态 sql 语句。有 sql 注入漏洞,建议使用 Statement 的子接口 PreparedStatement。
1、Statement 对象中提供了 executeQuery 方法来执行查询 select 操作,这个方法会返回查询结果集 ResultSet类对象,其中包含 SQL 语句的查询结果。
2、Statement 对象中提供了 executeUpdate 方法来执行 insert、update 和 delete 修改操作,这个方法会返回一个 int 值,表示 sql 的增删改操作所影响的数据行数。
4、接收查询结果集
JDBC 中使用 ResultSet 对象来表示查询结果集,可以理解为一个指向满足查询结果的行指针,其中并不存放实际数据,所以在使用结果集之前不能关闭连接。
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from tb_student");
5、遍历处理结果集
ResultSet 对象包含了执行查询后满足条件的所有行,提供了对应的访问方法,有一组对应的 getXxx 方法获取指定列的值。
ResultSet 提供的成员方法:
1、boolean next() throws SQLException; 行指针后移,并判断是否有数据,如果可以获取数据的返回 true,否则 false。
2、xxx getXxx(int columnIndex) throws SQLException 按照列的序号获取对应类型的数据。8 种简单类型、String 都有对应的 getXxx 方法。注意:这里的需要从1开始,一般在具体应用种不建议使用序号。
3、xxx getXxx(String columnLabel) throws SQLException; 按照列的名称获取对应列类型的数据。
while(resultSet.next()){
Long id=resultSet.getLong("id");
String username= resultSet.getString("username");
String password=resultSet.getString("password");
//日期有 3 种:日期 java.sql.Date、时间 java.sql.Time、日期和时间 java.sql.Timestamp
Date birth=resultSet.getDate("rdate");//sql 包种的所有日期类型都继承于 java.util.Date
Boolean sex=resultSet.getBoolean("sex");
System.out.println(id+"\t"+username+"\t"+password+"\t"+birth+"\t"+(sex?"男":"女"));
}
6、关闭对象
手动关闭 ResultSet、Statement 和 Connection,必须保证 Connection 对象关闭 。
建议使用 try/finally 结构。
代码
创建table
CREATE TABLE `tbl_users`
(
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户编号',
`username` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`password` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`rdate` datetime NULL DEFAULT CURRENT_TIMESTAMP,
`sex` tinyint(1) NULL DEFAULT 1,
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `username`(`username` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
创建对象
public class User {
private Long id;
private String username;
private String password;
private Date rdate;
private Boolean sex;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Date getRdate() {
return rdate;
}
public void setRdate(Date rdate) {
this.rdate = rdate;
}
public Boolean getSex() {
return sex;
}
public void setSex(Boolean sex) {
this.sex = sex;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", rdate=" + rdate +
", sex=" + sex +
'}';
}
}
代码实现
public class Test {
public static void main(String[] args) {
ArrayList<User> users = new ArrayList<>();
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?serverTimezone=UTC",
"root", "123456");
ps = conn.prepareStatement("select * from tbl_users");
rs = ps.executeQuery();
while (rs.next()) {
User user = new User();
user.setId(rs.getLong("id"));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
user.setRdate(rs.getDate("rdate"));
user.setSex(rs.getBoolean("sex"));
users.add(user);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
rs.close();
} catch (SQLException e1) {
e1.printStackTrace();
} finally {
try {
ps.close();
} catch (SQLException e2) {
e2.printStackTrace();
} finally {
try {
conn.close();
} catch (SQLException e3) {
e3.printStackTrace();
}
}
}
}
for (User tmp : users)
System.out.println(tmp);
}
}