在com.mysql.jdbc.Driver中有一段静态代码块,是向DriverManager注册一个Driver实例。这样在Class.forName("com.mysql.jdbc.Driver")的时候,就会首先去执行这个静态代码块,于是和DriverManager.registerDriver(new Driver())有了相同的效果,但不建议使用DriverManager.registerDriver(new Driver()),因为执行DriverManager.registerDriver(new Driver())这句话时,静态代码就已经执行了,相当于实例化了两个Driver对象。
JDBC(Java Data Base Connectivity)数据库连接,通常我们在编写web应用或java应用程序要连接数据库时就要使用JDBC。
使用JDBC连接数据库一般步骤:
1、加载驱动程序
连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机)
这个通过java.lang.Class类的静态方法forName(String className)实现
<span style="font-size:18px;"><span style="font-size:14px;">Class.forName("com.mysql.jdbc.Driver") //连接的mysql数据库</span></span>
加载成功后,会将Driver类的实例注册到DriverManager类中。
2、创建连接对象
<span style="font-size:18px;"><span style="font-size:14px;">conn = DriverManager.getConnection(url, user, password);</span></span>
3、创建sql语句执行对象->Statement
Statement实例分为以下三种:
(1)执行静态SQL语句,通常通过Statement实例实现。
(2)执行动态SQL语句,通常通过PreparedStatement实例实现。
(3)执行数据库存储过程,通常通过CallableStatement实例实现
具体实现方式:
<span style="font-size:18px;"><span style="font-size:14px;">Statement st = conn.createStatement(); PreparedStatement pst = conn.prepareStatement(sql); CallableStatement cst = conn.prepareCall("{CALL demoSP(?,?)}");</span></span>
4、执行sql语句
Statement 接口提供了三种SQL语句的方法:executeQuery、executeUpdate、execute
(1)ResultSet executeQuery(String sqlString):执行查询数据库的SQL语句,返回一个结构集(ResultSet)对象。
(2)int executeUpdate(String sqlString):用于执行INSERT、UPDATE或DELETE语句以及SQL DDL语句,
如CREATE TABLE和DROP TABLE等。
(3)execute(sqlString):用于执行返回多个结果集、多个更新计数或二者组合的语句。
具体的代码实现:
<span style="font-size:18px;"><span style="font-size:14px;">ResultSet rs = st.executeQuery("select * from ..."); int rows = st.executeUpdate("insert into ..."); boolean flag = st.execute(String sql);</span></span>
5、对执行结构进行处理
两种情况:
(1)执行更新返回的是本次操作影响到的记录数。
(2)执行查询返回的结果是一个ResultSet对象。
ResultSet包含SQL语句中条件的所有行,并且它通过一套get方法提供了对这些数据的访问。
使用结果集对象的访问方法获取数据:
<span style="font-size:18px;"><span style="font-size:14px;">while(rs.next){ String name = rs.getString("name"); //使用列名 String pass = rs.getString(1); //使用列序数 }</span></span>
6、关闭相关的连接对象(顺序和声明的顺序相反)
关闭记录集、声明、连接对象。
<span style="font-size:18px;"><span style="font-size:14px;">//导包一定要导java的包
import java.sql.Connection;//导入的是java提供的接口
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* 连接数据库并进行添加操作
*
* @author student
*
*/
public class Demo2_Select {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Demo2_Select d = new Demo2_Select();
d.select();
}
public void select() throws ClassNotFoundException {
/**
* 加载驱动类 创建连接对象 connection 创建statement对象 指示sql语句 执行sql语句 处理操作结果 关闭资源
*/
// 协议 ip 接口 数据库名 汉字转码
String url = "jdbc:mysql://localhost:3306/test?characterEncoding=utf8";
String user = "root";
String password = "root";
Connection connection = null;
Statement st = null;
try {
// 1、利用反射加载驱动类,此处运用了隐式注册驱动程序的方法
Class.forName("com.mysql.jdbc.Driver");
// 2、创建连接对象connection
connection = DriverManager.getConnection(url, user, password);
// 3、创建statement对象
st = connection.createStatement();
// 3、执行语句
String sql = "select * from student";
ResultSet rs = st.executeQuery(sql);
// 显示操作结果
rs.first();
while (rs.next()) {
System.out.println(rs.getString(1) + "\t" + rs.getString(2)); //根据列的标号来获得数据
System.out.println(rs.getString("usname")); //通过列名来获得数据
}
} catch (SQLException e) {
e.printStackTrace();
}
// 关闭资源(相关对象)
try {
if(st != null)
st.close();
if(connection != null)
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}</span></span>
java数据库连接(一)--从最简单地jdbc连接说起