出自 https://juejin.cn/post/6910491515555217416
入门案例
public class JdbcDemo {
public static final String URL = "jdbc:mysql://localhost:3306/mblog";
public static final String USER = "root";
public static final String PASSWORD = "123456";
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT id, name, age FROM m_user where id =1");
while(rs.next()){
System.out.println("name: "+rs.getString("name")+" 年龄:"+rs.getInt("age"));
}
}
}
JDBC步骤
数据库驱动
Class.forName("com.mysql.jdbc.Driver");
我们安装好数据库之后,我们的应用程序也是不能直接使用数据库的,必须要通过相应的数据库驱动程序,通过驱动程序去和数据库打交道。其实也就是数据库厂商的JDBC接口实现,即对Connection等接口的实现类的jar文件。
java.sql.Driver此接口是提供给数据库厂商实现的。比如说MySQL的,需要依赖对应的jar包。
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
MySQL数据库对应的实现驱动实现类:
package com.mysql.cj.jdbc;
import java.sql.SQLException;
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
static {
try {
//注册驱动
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
public Driver() throws SQLException {
}
}
DriverManager是rt.jar包下的类,(rt=runtime),把我们需要驱动类注册进去。
//DriverManager类中的方法
public static synchronized void registerDriver(java.sql.Driver driver, DriverAction da)
throws SQLException {
/* Register the driver if it has not already been added to our list */
if(driver != null) {
registeredDrivers.addIfAbsent(new DriverInfo(driver, da));
} else {
// This is for compatibility with the original DriverManager
throw new NullPointerException();
}
println("registerDriver: " + driver);
}
相应装载Oracle驱动:
Class.forName("oracle.jdbc.driver.OracleDriver");
Sql Server驱动:
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
获取连接
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
创建Statement对象
Statement stmt = conn.createStatement();
获取Statement
三种类型
要执行SQL语句,必须获得java.sql.Statement实例,Statement实例分为以下3 种类型(都是接口,实现类名是后面加上Impl,如下面的结果图所示):
- 执行静态SQL语句。通常通过Statement实例实现。
- 执行动态SQL语句。通常通过PreparedStatement实例实现。
- 执行数据库存储过程。通常通过CallableStatement实例实现。
Statement stmt = con.createStatement() ;
PreparedStatement pstmt = con.prepareStatement(sql) ;
CallableStatement cstmt = con.prepareCall("{CALL demoSp(? , ?)}") ;
常用方法Statement和PreparedStatement的异同及优缺点
同:两者都是用来执SQL语句的
异:PreparedStatement需要根据SQL语句来创建,它能够通过设置参数,指定相应的值,不是像Statement那样使用字符串拼接的方式。
PreparedStatement的优点:
1、其使用参数设置,可读性好,不易记错。在statement中使用字符串拼接,可读性和维护性比较差。
2、其具有预编译机制,性能比statement更快。
3、其能够有效防止SQL注入攻击。
execute和executeUpdate的区别
相同点:二者都能够执行增加、删除、修改等操作。
不同点:
1、execute可以执行查询语句,然后通过getResult把结果取出来。executeUpdate不能执行查询语句。
2、execute返回Boolean类型,true表示执行的是查询语句,false表示执行的insert、delete、update等。executeUpdate的返回值是int,表示有多少条数据受到了影响。
执行sql数据库查询
ResultSet rs = stmt.executeQuery("SELECT id, name, age FROM m_user where id =1");
ResultSet结果集处理
前面的入门案例中这里返回的结果集是ResultSetImpl
解析结果集
System.out.println("name: "+rs.getString("name")+" 年龄:"+rs.getInt("age"));
关闭资源
资源关闭不在业务代码这一块,主要是针对一些资源进行关闭,免得一直持有资源。另外我们处理的资源关闭一般都是在finally中处理。