JDBC的全称是Java数据库连接(Java Database Connectivity),它是一套用于执行SQL语句的Java API
应用程序可通过这套API连接到关系型数据库,并使用SQL语句来完成对数据库中数据的查询、新增、更新和删除等操作
需要先导入此包
建表语句
create database jdbc;
create table users( id int PRIMARY key auto_increment, name
varchar(40), password varchar(40), email varchar(60), birthday DATE );insert into users(
name
,password
,birthday
) values
(‘zs’,‘123456’,‘[email protected]’,‘1980-12-04’),
(‘lisi’,‘123456’,‘[email protected]’,‘1980-12-04’),
(‘wangwu’,‘123456’,‘[email protected]’,‘1979-12-04’);
Driver接口是所有JDBC驱动程序必须实现的接口,该接口专门提供给数据库厂商使用。需要注意的是,在编写JDBC程序时,必须要把所使用的数据库驱动程序或类库加载到项目的classpath中(这里指MySQL驱动JAR包)
DriverManager类用于加载JDBC驱动并且创建与数据库的连接。
DriverManager类中,定义了两个比较重要的静态方法,如下所示。
Connection接口代表Java程序和数据库的连接,只有获得该连接对象后,才能访问数据库,并操作数据表。在Connection接口中,定义了一系列方法,其常用方法如下所示。
Statement接口用于执行静态的SQL语句,并返回一个结果对象。Statement接口对象可以通过Connection实例的createStatement()方法获得,该对象会把静态的SQL语句发送到数据库中编译执行,然后返回数据库的处理结果。在Statement接口中,提供了3个常用的执行SQL语句的方法,具体如下所示。
PreparedStatement是Statement的子接口,用于执行预编译的SQL语句。该接口扩展了带有参数SQL语句的执行操作,应用该接口中的SQL语句可以使用占位符 “?”来代替其参数,然后通过setXxx()方法为SQL语句的参数赋值。在PreparedStatement接口中,提供了一些常用方法,具体如下所示。
需要注意的是,表中的setDate()方法可以设置日期内容,但参数Dat e的类型是java.sql.Date,型是java.sql.Date,而不是java.util.Date
在通过setXxx()方法为SQL语句中的参数赋值时,可以通过输入参数的已定义SQL类型兼容的方法(例如,如果参数具有SQL类型为Integer,那么应该使用setInt()方法,也可以通过setObject()方法设置多种类型的输入参数。具体如下所示:
ResultSet接口用于保存JDBC执行查询时返回的结果集,该结果集封装在一个逻辑表格中。
在ResultSet接口内部有一个指向表格数据行的游标(或指针),ResultSet对象初始化时,游标在表格的第一行之前
调用next()方法可将游标移动到下一行。如果下一行没有数据,则返回false。在应用程序中经常使用next()方法作为while循环的条件来迭代ResultSet结果集。ResultSet接口中的常用方法如下所示。
ResultSet接口中定义了大量的getXxx()方法,而采用哪种getXxx()方法取决于字段的数据类型。程序既可以通过字段的
名称来获取指定数据,也可以通过字段的索引来获取指定的数据,字段的索引是从1开始编号的。例如,数据表的第一列字
段名为id,字段类型为int,那么即可以使用getInt(1)获取该列的值,也可以使用getInt(“id”)获取该列的值。
通常,JDBC的使用可以按照以下几个步骤进行:
(1)加载并注册数据库驱动。
(2)通过DriverManager获取数据库连接。
(3)通过Connection对象获取Statement对象。
(4)使用Statement执行SQL语句。
(5)操作ResultSet结果集。
(6)关闭连接,释放资源。
package Test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class test1 {
public static void main(String[] args) throws Exception {
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
try {
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc", "root", "123456");
statement = connection.createStatement();
resultSet = statement.executeQuery("select * from users");
while (resultSet.next()) {
System.out.println(resultSet.getInt("id") + ":" + resultSet.getString("name") + ":" + resultSet.getString("password") +
":" + resultSet.getString("email") + ":" + resultSet.getDate("birthday"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
resultSet.close();
statement.close();
connection.close();
}
}
}
PreparedStatement对象可以对SQL语句进行预编译,预编译的信息会存储在该对象中。当相同的SQL语句再次执行时,程序会使用PreparedStatement对象中的数据,而不需要对SQL语句再次编译去查询数据库,这样就大大的提高了数据的访问效率。
package Test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
public class test2 {
public static void main(String[] args) throws Exception {
Connection conn= null;
PreparedStatement ps=null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc",
"root","123456");
String insert="insert into users(name,password,email,birthday) values" +
"(?,?,?,?)";
ps=conn.prepareStatement(insert);
ps.setString(1,"zl");
ps.setString(2,"123456");
ps.setString(3,"[email protected]");
ps.setString(4,"1987-12-23");
ps.executeUpdate();
}catch (Exception e){
e.printStackTrace();
}finally {
if(ps!=null){
ps.close();
}
if(conn!=null){
conn.close();
}
}
}
}
ResultSet主要用于存储结果集,可以通过next()方法由前向后逐个获取结果集中的数据,如果想获取结果集中任意位置的数据,则需要在创建Statement对象时,设置两个ResultSet定义的常量,具体设置方式如下:
Statement st = conn.createStatement(
ResultSet.TYPE_SCROLL_INSENITIVE,
ResultSet.CONCUR_READ_ONLY
);
ResultSet rs = st.excuteQuery(sql);
在上述方式中,常量“Result.TYPE_SCROLL_INSENITIVE”表示结果集可滚动,常量“ResultSet.CONCUR_READ_ONLY”
表示以只读形式打开结果集。
package Test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class test3 {
public static void main(String[] args) throws Exception {
Connection conn=null;
Statement statement=null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc",
"root","123456");
String sql="select * from users";
statement=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY);
ResultSet rs=statement.executeQuery(sql);
System.out.print("第二条数据为:");
rs.absolute(2);
System.out.println(rs.getString("name"));
System.out.print("第一条数据为:");
rs.beforeFirst();
rs.next();
System.out.println(rs.getString("name"));
System.out.print("第四条数据为:");
rs.afterLast();
rs.previous();
System.out.println(rs.getString("name"));
System.out.println();
}catch (Exception e){
e.printStackTrace();
}finally {
if(statement!=null){
statement.close();
}
if(conn!=null){
conn.close();
}
}
}
}
输出: