JDBC典型用法
#01 JDBC常用的接口和类
DriverManger
常用的方法
createConnetion
Connection
常用的方法
创建Statement对象
createStatement
prepareStatement
prepareCall
控制事务的方法
Statement
常用的方法
executeQuery(String sql)
executeUpdate(String sql)
execute(String sql) 执行的是Query返回的是true,执行的是Update返回的是false
子类
prepareStatement
常用的方法:
setXxx(int parameterIndex,Xxx value)
CallableStatement
ResultSet
常用的方法
void close(),
boolean absolute(int row),
void beforeFirst(),
boolean first(),
boolean previouse()
boolean next()
boolean last()
void afterLast()
getXxx(int columnIndex) 根据索引获取值
getXxx(String columnLabel) 根据列名获取值
#02 JDBC编程步骤
package JDBCTest;
import java.sql.*;
import java.util.Properties;
public class JDBCStep {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//加载驱动,需要处理ClassNoteFoundException
Class.forName("com.mysql.jdbc.Driver");
//创建连接,需要处理SQLException,url的规则为:jdbc:subprotocol:other stuff,具体参见数据库JDBC驱动文档
//通过url,username,password获取数据库连接
Connection conn1 = DriverManager.getConnection("","","");
//将属性以JDBC参数的形式拼接在url后面
Connection conn2= DriverManager.getConnection("");
//将属性写在properties文件中
Connection conn3 = DriverManager.getConnection("", new Properties());
//通过Connection对象创建Statement对象
Statement state1 = conn1.createStatement();
Statement state2 =conn1.prepareStatement("");
Statement state3 =conn1.prepareCall("");
//使用Statement执行SQL语句,所有的Statement都有一下三个方法
//可以执行任何sql语句,但是不推荐使用,Update返回false,Query返回true
boolean execute = state1.execute("");
//执行DML返回影响的行数 ,DDL返回结果为0
int i = state1.executeUpdate("");
//执行查询语句,返回代表查询结果的ResultSet结果集
ResultSet resultSet = state1.executeQuery("");
//操纵结果集
//移动指针的方法close(),absolute(int row),beforeFirst(),first(),previouse(),next(),last(),afterLast()
//获取记录指针指向行,特定列的值 getXxx(int columnIndex) 根据索引获取值,getXxx(String columnLabel) 根据列名获取值
//回收数据库资源,关闭ResultSet,Statement,Connection等资源
}
}
#03 执行SQL语句的方式
使用executeupdate() 7/executeLargeUpdate() 8
使用execute()
package JDBCTest;
import java.sql.*;
public class TestExecuteMethod {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("", "", "");
Statement state = conn.createStatement();
boolean hasResultSet = state.execute("");
if(hasResultSet){
//返回的结果是ResultSet
ResultSet rs = state.getResultSet();
//ResultSetMetaData是用于分析结果集的元数据接口
ResultSetMetaData rsmd = rs.getMetaData();
//获取总共的列数
int count = rsmd.getColumnCount();
//通过ResultSet的next()方法获取所有的值
while(rs.next()){
//依次输出每列的值
for(int i=1;i<count;i++){
//除了Bolo类型,都可以用getString()获取属性值
System.out.println(rs.getString(i));
}
}
}else{
System.out.println("该SQL语句影响的记录有+"+state.getUpdateCount()+"行");
}
}
}
使用PreparedStatement执行SQL语句
package JDBCTest;
import java.sql.*;
public class TestPreparedStatementMethod {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("", "", "");
PreparedStatement pstmt = conn.prepareStatement("insert into test(?,?,?)");
pstmt.setString(1,"");
pstmt.setString(2,"");
pstmt.setString(3,"");
int i = pstmt.executeUpdate();
PreparedStatement pstmt1 = conn.prepareStatement("select * from test where id=? and date=?");
pstmt1.setString(1,"");
pstmt1.setString(2,"");
ResultSet resultSet = pstmt1.executeQuery();
}
}
优势
预编译SQL,批量执行sql的时候,性能更好
无需拼接SQL语句,编程更简单
防止SQL注入,安全性更好
注意:占位符参数只能代替普通值,不能代替表名,列名等数据库对象,更不能代替insert,delete的等关键字
使用CallableStatement调用存储过程
#04 管理结果集(ResultSet)
可滚动,可更新的结果集
处理Blob类型数据
Blob是二进制长对象,用于存储大文件,例如一张图片或者一个声音文件,将Blob数据插入数据库需要使用PreparedStatement的setBinaryStream(int parameterIndex,InputStream x),为指定参数传入二进制输入流,将Blob数据保存到数据库。
pstmt.setBinaryStream(1, new InputStream() {
@Override
public int read() throws IOException {
return 0;
}
});
使用ResultSetMetaData分析结果集
//返回的结果是ResultSet
ResultSet rs = state.getResultSet();
//ResultSetMetaData是用于分析结果集的元数据接口
ResultSetMetaData rsmd = rs.getMetaData();
//获取总共的列数
int count = rsmd.getColumnCount();
//获取列索引对应的列名
String columnName = rsmd.getColumnName(1);
//获取列索引对应的属性类型
int columnType = rsmd.getColumnType(1);