一、Connection接口
java.sql.Connection接口的实现对象代表与数据库的连接,也就是在Java程序和数据库之间建立连接。Connection接口中常用的方法:
Statement createStatement():创建一个语句对象,语句对象用来将SQL语句发送到数据 库。
PreparedStatement prepareStatement(String sql):创建一个预编译的语句对象,用来将参数 化的SQL语句发送到数据库,参数包含一个或者多个问号“?”占位符。
CallableStatement prepareCall(String sql):创建一个调用存储过程的语句对象,参数是调用 的存储过程,参数包含一个或者多个问号“?”为占位符。
close():关闭到数据库的连接,在使用完连接后必须关闭,否则连接会保持一段比较长的 时间,直到超时。
isClosed():判断连接是否已经关闭。
二、Statement接口
java.sql.Statement称为语句对象,它提供用于向数据库发出SQL语句,并且访问结果。
有三种Statement接口::java.sql.Statement、java.sql.PreparedStatement和 java.sql.CallableStatement
PreparedStatement继承Statement接口,CallableStatement继承 PreparedStatement接口。
Statement实现对象用于执行基本的SQL语句,PreparedStatement实现对 象用于执行预编译的SQL语句,CallableStatement实现对象用于用来调用数据库中的存储过程。
Statement提供了许多方法,最常用的方法如下:
executeQuery():运行查询语句,返回ResultSet对象。
executeUpdate():运行更新操作,返回更新的行数。
close():关闭语句对象。
isClosed():判断语句对象是否已经关闭。
Statement对象用于执行不带参数的简单SQL语句,语法格式如下:
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/JAVA",“user”,"password"); Statement stmt = conn.createStatement(); ResultSet rst = stmt.executeQuery("select userid, name from user");
一般情况下可以通过connection.createStatement()方 法就可以得到Statement对象。
PreparedStatement对象用于执行带参数的预编译SQL语句,语法格式如下:
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/JAVA",“user”,"password"); PreparedStatement pstmt = conn.prepareStatement("insert into user values(?,?)"); pstmt.setInt(1,10); //绑定第一个参数 pstmt.setString(2,"guan"); //绑定第二个参数 //执行SQL语句 pstmt.executeUpdate();
绑定参数时需要注意两个问题:绑定参数顺序和绑定参数的类型,绑定参数索引是 从1开始的,而不是从0开始的。根据绑定参数的类型不同选择对应的set方法。
CallableStatement对象用于执行对数据库已存储过程的调用,语法格式如下:
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/JAVA",“user”,"password"); strSQL = "{call proc_userinfo(?,?)}"; java.sql.CallableStatement sqlStmt = conn.prepaleCall(strSQL); sqlStmt.setString(1,"tony"); sqIStmt.setString(2,"tom"); //执行存储过程 int i = sqlStmt.exeCuteUpdate();
分析预编译SQL语句的优点:预编译SQL语句是在程序编译的时一起进行编译,这样的语句在数据库中执行时 候,不需要编译过程,直接执行SQL语句,所以速度很快。在预编译SQL语句会有一些程 序执行时才能确定的参数,这些参数采用“?”占位符,直到运行时再用实际参数替换。
三、ResultSet接口
在Statement执行SQL语句时,如果是SELET语句会返回结果集,结果集通过接口 java.sql.ResultSet描述的,它提供了逐行访问结果集的方法,通过该方法能够访问结果集中不同 字段的内容。
ResultSet最常用的方法介绍如下:
close():关闭结果集对象。
isClosed():判断结果集对象是否已经关闭。
next():将结果集的光标从当前位置向后移一行。
getString():获得在数据库里是CHAR 或 VARCHAR等字符串类型的数据,返回值类型是 String。
getFloat():获得在数据库里是浮点类型的数据,返回值类型是float。
getDouble():获得在数据库里是浮点类型的数据,返回值类型是double。
getDate():获得在数据库里是日期类型的数据,返回值类型是java.sql.Date
getBoolean():获得在数据库里是布尔数据的类型,返回值类型是boolean。
getBlob():获得在数据库里是Blob(二进制大型对象)类型的数据,返回值类型是Blob类 型。
getClob():获得在数据库里是Clob(字符串大型对象)类型的数据,返回值类型是Clob。
这些方法要求有列名或者列索引,如getString()方法的两种情况:
public String getString(int columnlndex) throws SQLException //可以填列名也可以填列索引 public String getString(String columnName) throws SQLException
注意:columnlndex列索引是从1开始的,而不是从0开始的。这个顺序与select语句有关,如 果select使用*返回所有字段,如select * from user语句,那么列索引是数据表中字段的顺 序;如果select指定具体字段,如select userid, name from user或select name,userid from user, 那么列索引是select指定字段的顺序。
ResultSet示例代码如下:
import java.io.IOException; import java.io.InputStream; import java.sql.*; import java.util.Properties; /** * @author : 蔡政洁 * @email :caizhengjie888@icloud.com * @date : 2020/3/2 * @time : 1:04 下午 */ public class HelloWorld { public static void main(String[] args) { // 加载驱动程序 try { Class.forName("com.mysql.cj.jdbc.Driver"); System.out.println("驱动程序加载成功"); } catch (ClassNotFoundException e) { e.printStackTrace(); System.out.println("驱动程序加载失败"); return; } String url = "jdbc:mysql://localhost:3306/JAVA"; Properties info = new Properties(); try { // 获得config.properties配置文件的输入流对象,需要自己创建在src文件里 InputStream inputStream = 数据库编程.建立数据库连接.HelloWorld.class.getClassLoader().getResourceAsStream("config.properties"); // 从流中加载信息到properties对象中 info.load(inputStream); } catch (IOException e) { e.printStackTrace(); return; } //这里采用自动资源管理系统 try (Connection conn = DriverManager.getConnection(url,info); Statement stmt = conn.createStatement(); ResultSet rst = stmt.executeQuery("select * from xinxi_tb") ){ System.out.println("数据库连接成功"+conn); while (rst.next()){ // 这里指列的索引,查找的列,从1开始索引 System.out.printf("id:%d ,name:%s, age:%d\n", rst.getInt(1),rst.getString("name"),rst.getInt(3)); } } catch (SQLException e) { e.printStackTrace(); } } }
config.properties文件:
user=root password=199911 useSSL=false verifyServerCertificate=false
运行结果:
驱动程序加载成功 数据库连接成功com.mysql.cj.jdbc.ConnectionImpl@7ca48474 id:1 ,name:aaa, age:21 id:2 ,name:bbb, age:32 id:4 ,name:ccc, age:43 id:5 ,name:ddd, age:56 id:6 ,name:eee, age:49