Java数据库JDBC——connection,statement,prepareStatement,ResultSet接口的用法和解释
Connection常用方法
变量和类型 | 方法 | 描述 |
---|---|---|
void | close() | 立即释放此 Connection对象的数据库和JDBC资源,而不是等待它们自动释放。 |
Statement | createStatement() | 创建一个 Statement对象,用于将SQL语句发送到数据库。 |
Statement | createStatement(int resultSetType, int resultSetConcurrency) | 创建一个 Statement对象,该对象将生成具有给定类型和并发性的 ResultSet对象。 |
PreparedStatement | prepareStatement(String sql) | 创建一个 PreparedStatement对象,用于将参数化SQL语句发送到数据库。 |
PreparedStatement | prepareStatement(String sql, int resultSetType, int resultSetConcurrency) | 创建一个 PreparedStatement对象,该对象将生成具有给定类型和并发性的 ResultSet对象。 |
Statement常用方法
变量和类型 | 方法 | 描述 |
---|---|---|
void | addBatch(String sql) | 将给定的SQL命令添加到此 Statement对象的当前命令列表中。 |
void | close() | 立即释放此 Statement对象的数据库和JDBC资源,而不是等待它自动关闭时发生。 |
boolean | execute(String sql) | 执行给定的SQL语句,该语句可能返回多个结果。 |
ResultSet | executeQuery(String sql) | 执行给定的SQL语句,该语句返回单个 ResultSet对象。 |
PrepareStatement常用方法
变量和类型 | 方法 | 描述 |
---|---|---|
void | addBatch() | 向此 PreparedStatement对象的一批命令添加一组参数。 |
boolean | execute() | 在此 PreparedStatement对象中执行SQL语句,该对象可以是任何类型的SQL语句。 |
ResultSet | executeQuery() | 执行此 PreparedStatement对象中的SQL查询,并返回查询生成的 ResultSet对象。 |
int | executeUpdate() | 执行在该SQL语句PreparedStatement对象,它必须是一个SQL数据操纵语言(DML)语句,比如INSERT , UPDATE或DELETE ; 或者不返回任何内容的SQL语句,例如DDL语句。 |
void | setDate(int parameterIndex, Date x) | 使用运行应用程序的虚拟机的默认时区将指定参数设置为给定的 java.sql.Date值。 |
void | setDouble(int parameterIndex, double x) | 将指定参数设置为给定的Java double值。 |
void | setFloat(int parameterIndex, float x) | 将指定参数设置为给定的Java float值。 |
void | setInt(int parameterIndex, int x) | 将指定参数设置为给定的Java int值。 |
void | setLong(int parameterIndex, long x) | 将指定参数设置为给定的Java long值。 |
void | setTime(int parameterIndex, Time x) | 将指定参数设置为给定的 java.sql.Time值。 |
void | setString(int parameterIndex, String x) | 将指定参数设置为给定的Java String值。 |
void | setObject(int parameterIndex, Object x) | 使用给定对象设置指定参数的值。 |
Resultset常用方法
变量和类型 | 方法 | 描述 |
---|---|---|
void | close() | 立即释放此 ResultSet对象的数据库和JDBC资源,而不是等待它自动关闭时发生。 |
void | deleteRow() | 从此 ResultSet对象和基础数据库中删除当前行。 |
int | getInt(int columnIndex) | 写第几列(1,2…n) |
int | getInt(String columnLabel) | 写列名 |
double | getDouble(int columnIndex) | 写第几列(1,2…n) |
double | getDouble(String columnLabel) | 写列名 |
Date | getDate(int columnIndex) | 写第几列(1,2…n) |
Date | getDate(String columnLabel) | 写列名 |
long | getLong(int columnIndex) | 写第几列(1,2…n) |
long | getLong(String columnLabel) | 写列名 |
String | getString(int columnIndex) | 写第几列(1,2…n) |
String | getString(String columnLabel) | 写列名 |
package com.isoft;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class Main {
private static String url="jdbc:mysql://localhost:3306/supermarket?serverTimezone =Asia/Shanghai&characterEncoding=utf8&useUnicode=true&useSSL=false";
private static String user="root";
private static String password="root";
public static void main(String[] args)throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection conn=null;
conn= DriverManager.getConnection(url,user,password);
String sql="SELECT * FROM goods;";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
System.out.print( rs.getInt(1)+" ");
System.out.print(rs.getString(2)+" ");
System.out.print(rs.getInt(3)+" ");
System.out.print(rs.getFloat(4)+" ");
System.out.print( rs.getInt(5)+" ");
System.out.println(rs.getDate(6)+" ");//推荐用这种,不容易错
/* System.out.print( rs.getInt("id")+" ");
System.out.print(rs.getString("gname")+" ");
System.out.print(rs.getInt("count")+" ");
System.out.print(rs.getFloat("price")+" ");
System.out.print( rs.getInt("uid")+" ");
System.out.println(rs.getDate("createtime")+" ");*/
/* System.out.print( rs.getInt("id")+" ");
System.out.print(rs.getString(2)+" ");
System.out.print(rs.getInt(3)+" ");
System.out.print(rs.getFloat("price")+" ");
System.out.print( rs.getInt("uid")+" ");
System.out.println(rs.getDate("createtime")+" ");*/
}
conn.close();
}
}
运行结果:
1 苹果 45 10.0 1 2021-01-12
2 水杯 81 27.5 1 2021-01-06
4 杯子 2 3.5 1 2021-01-06
5 杯子 3 7.5 1 2021-01-06
6 水杯 5 13.8 1 2021-01-06
7 牛奶 6 99.9 1 2021-01-06
8 奥特曼 200 16.0 1 2021-01-06
9 哇哈哈 14 2.0 1 2021-01-06
11 奥里给 6 1000.0 1 2021-01-13
当我们使用只是查询的时候一般可以使用Statement就可以,但是我们日常的业务逻辑处理中不单单只是查询,还会有DML操作,当我们执行DML操作时,为了防止sql注入,就不可以使用Statement,我们需要使用PreparedStatement接口来代替他了,PreparedStatement是Statement的子接口。
使用PreparedStatement接口的一些好处:
1.提高执行语句的性能
2.可读性和可维护性更好
3.简化Statement中的操作
4.安全性更好(可预防sql注入)
package com.isoft;
import java.sql.*;
import java.util.Scanner;
public class Main {
private static String url="jdbc:mysql://localhost:3306/supermarket?serverTimezone =Asia/Shanghai&characterEncoding=utf8&useUnicode=true&useSSL=false";
private static String user="root";
private static String password="root";
public static void main(String[] args)throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection conn=null;
conn= DriverManager.getConnection(url,user,password);
String sql="insert into goods(gname,count,price,uid,createtime) values(?,?,?,?,NOW())";
PreparedStatement preparedStatement=conn.prepareStatement(sql);
Scanner s=new Scanner(System.in);
System.out.println("请输入商品名称");
Object temp=s.next();
System.out.println("请输入商品数量");
Object temp1=s.next();
System.out.println("请输入商品单价");
Object temp2=s.next();
System.out.println("请输入操作者编号");
Object temp3=s.next();
preparedStatement.setObject(1,temp);
preparedStatement.setObject(2,temp1);
preparedStatement.setObject(3,temp2);
preparedStatement.setObject(4,temp3);
System.out.println(preparedStatement.executeUpdate());
String sql1="SELECT * FROM goods;";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql1);
while (rs.next()) {
System.out.print( rs.getInt(1)+" ");
System.out.print(rs.getString(2)+" ");
System.out.print(rs.getInt(3)+" ");
System.out.print(rs.getFloat(4)+" ");
System.out.print( rs.getInt(5)+" ");
System.out.println(rs.getDate(6)+" ");
}
conn.close();
}
}
运行结果:
请输入商品名称
大白兔
请输入商品数量
100
请输入商品单价
0.3
请输入操作者编号
123
1
1 苹果 45 10.0 1 2021-01-12
2 水杯 81 27.5 1 2021-01-06
4 杯子 2 3.5 1 2021-01-06
5 杯子 3 7.5 1 2021-01-06
6 水杯 5 13.8 1 2021-01-06
7 牛奶 6 99.9 1 2021-01-06
8 奥特曼 200 16.0 1 2021-01-06
9 哇哈哈 14 2.0 1 2021-01-06
11 奥里给 6 1000.0 1 2021-01-13
12 豆干 100 1.0 123 2021-02-03
13 辣条 100 0.5 123 2021-02-03
14 大白兔 100 0.3 123 2021-02-03
优化上述代码:
建立三个类
DBTool类:
package com.isoft;
import java.sql.*;
public class DBTool {
private String url = "jdbc:mysql://localhost:3306/supermarket?serverTimezone =Asia/Shanghai&characterEncoding=utf8&useUnicode=true&useSSL=false";
private String userName = "root";
private String pwd = "root";
private Connection conn;
private PreparedStatement prep;
public DBTool() throws Exception {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(url, userName, pwd);
}
public int update(String sql, Object ... objs) throws Exception {
//切记Object空格...空格objs
/*可变参数的使用方法,在方法中定义未知数量的参数
*格式为:修饰符 返回值类型 方法名(参数类型…变量名){}
* 如果未知个数的参数类型不同,那么可以把可变参数类型定义为Object
* 修饰符 返回值类型 方法名(Object … 变量名){}
* */
prep = conn.prepareStatement(sql);
for (int i = 0; i < objs.length; i++) {
prep.setObject(i + 1, objs[i]);
}
return prep.executeUpdate();
}
public void show()throws Exception{
String sql1 = "SELECT * FROM goods;";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql1);
while (rs.next()) {
System.out.print(rs.getInt(1) + " ");
System.out.print(rs.getString(2) + " ");
System.out.print(rs.getInt(3) + " ");
System.out.print(rs.getFloat(4) + " ");
System.out.print(rs.getInt(5) + " ");
System.out.println(rs.getDate(6) + " ");
}
}
public void close ()throws Exception {
if (prep != null && !prep.isClosed()) {
prep.close();
}
if (conn != null && !conn.isClosed()) {
conn.close();
}
}
}
GoodsImpl类:
package com.isoft;
import java.util.Scanner;
public class GoodsImpl {
public int add() throws Exception {
String sql = "insert into goods(gname,count,price,uid,createtime) values(?,?,?,?,NOW())";
Scanner s = new Scanner(System.in);
System.out.println("请输入商品名称");
Object temp = s.next();
System.out.println("请输入商品数量");
Object temp1 = s.next();
System.out.println("请输入商品单价");
Object temp2 = s.next();
System.out.println("请输入操作者编号");
Object temp3 = s.next();
DBTool tool=new DBTool();
int str=tool.update(sql,temp,temp1,temp2,temp3);
tool.close();
return str;
}
}
Main类:
package com.isoft;
public class Main {
public static void main(String[] args) throws Exception {
GoodsImpl g=new GoodsImpl();
g.add();
DBTool tool=new DBTool();
tool.show();
tool.close();
}
}
运行结果:
请输入商品名称
阿尔卑斯
请输入商品数量
1000
请输入商品单价
0.5
请输入操作者编号
123
1 苹果 45 10.0 1 2021-01-12
2 水杯 81 27.5 1 2021-01-06
4 杯子 2 3.5 1 2021-01-06
5 杯子 3 7.5 1 2021-01-06
6 水杯 5 13.8 1 2021-01-06
7 牛奶 6 99.9 1 2021-01-06
8 奥特曼 200 16.0 1 2021-01-06
9 哇哈哈 14 2.0 1 2021-01-06
11 奥里给 6 1000.0 1 2021-01-13
12 豆干 100 1.0 123 2021-02-03
13 辣条 100 0.5 123 2021-02-03
14 大白兔 100 0.3 123 2021-02-03
15 水果 100 2.0 123 2021-02-03
16 金丝猴 100 2.0 123 2021-02-03
17 阿尔卑斯 1000 0.5 123 2021-02-03 -