1,使用场景
- JDBC是Java程序访问数据库的标准接口
- 用于创建和数据库的连接
- 在数据库中执行SQL或MySQL查询。
- 查看和修改结果记录。
- 通常用作辅助自动化测试。
2,JDBC架构
3,数据库连接关闭及语句使用
接口 | 使用方法 |
---|---|
Statement(重要) | 将其用于对数据库的通用访问。 |
Statement 接口不能接受参数。 | |
PreparedStatement(重要) | 在运行时接受输入参数。 |
CallableStatement | 访问数据库存储过程时使用。接受运行时输入参数。 |
(1)单独封装连接数据库对象和关闭资源的接口
package search_utils.DBsql;
import java.sql.*;
public class DBUtil {
private DBUtil(){ }
//静态代码块在类加载时执行,并且只执行一次
static {
try{
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//获取数据库连接对象
public static Connection getConnetion() throws SQLException{
//advert库
String url = "jdbc:mysql://10.52.46.16:33066/ads_communal";
String username = "mysql";
String password = "123456";
Connection conn = DriverManager.getConnection(url,username,password);
return conn;
}
//关闭资源
/**
@param conn 连接对象
@param stmt 数据库操作对象
@param rs 结果集
*/
public static void close(Connection conn,Statement stmt,ResultSet rs){
if(stmt !=null){
try{
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(rs !=null){
try{
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn !=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
(2)使用statement接口代码示例
statement语句:*
方法 | 使用场景 |
---|---|
【重点】ResultSet executeQuery (String SQL) | 返回一个 ResultSet 对象。当您希望获得结果集时使用此方法,就像使用 SELECT 语句一样。 |
boolean execute (String SQL) | 如果可以检索到 ResultSet 对象,则返回布尔值 true;否则,它返回 false。使用此方法执行 SQL DDL 语句或需要使用真正动态的 SQL。 |
int executeUpdate (String SQL) | 返回受 SQL 语句执行影响的行数。使用此方法来执行您希望影响的行数的 SQL 语句 - 例如,INSERT、UPDATE 或 DELETE 语句。 |
package search_utils.DBsql;
import java.sql.*;
public class sqlDemo {
public static void main(String[] args) {
Connection conn =null;
Statement stmt = null;
ResultSet rs =null;
try{
//连接数据库
conn = DBUtil.getConnetion();
//获取数据库操作对象(Statement专门执行sql语句,Statement接口不能接受参数)
stmt = conn.createStatement();
String sql = "select * from ads_ad_collect22 where ad_id=401070811";
String updateSql = "insert * from ads_ad_collect22 ";
//execute()方法 - 如果可以检索到ResultSet对象,则返回true,反之则为false
// boolean res = stmt.execute(sql);
// System.out.println("sql语句是否存在ResultSet对象:" + res);
//获取结果集,executeQuery()用于执行查询语句select,返回的是一个集合,将查询结果放在ResultSet类对象中供用户使用
//int executeUpdate()用于执行INSERT,UPDATE,DELETE语句,返回受sql语句执行影响的行数
rs = stmt.executeQuery(sql);
System.out.println("DB查询成功..." + "\n"+ rs); //返回一个ResultSet对象 - com.mysql.cj.jdbc.result.ResultSetImpl@2f01783a
//ResultSetMetaData是用于分析结果集的元数据接口
// ResultSetMetaData rsmd = rs.getMetaData();
// int columnCount = rsmd.getColumnCount();
//输出ResultSet对象
// while(rs.next()){
//
// for(int i=0;i<columnCount;i++){
// System.out.print(rs.getString(i+1) + "\t");
// }
// System.out.println();
// }
//
}catch(SQLException e){
e.printStackTrace();
}finally{
DBUtil.close(conn,stmt,rs);
}
}
}
(2)使用 PreparedStatement接口代码示例
- 提供的方法与Statement一致
- 可以实现动态提供参数 ? 作为参数。
- setXXX()方法将值绑定到参数
- 调用
executeQuery()
不需要传参
package preciseTest;
import java.sql.*;
public class DBUtilDemo {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
// String query = "select * from litemall_cart where user_id=1 and deleted=0";
//可以实现动态提供参数 - ?作为参数
// String query = "select * from litemall_cart where user_id=? and deleted=?";
String query = "select * from ads_ad_collect22 where owner_id=1000120278";
try {
conn = DBUtilTest.getConnection();
//prepareStatement接口,在运行时接受输入参数;提供的方法与Statement一致
stmt = conn.prepareStatement(query,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
//可以实现动态提供参数 - 支持setXXX()方法将值绑定到参数,替代?占位符的变量内容
// stmt.setInt(1,2);
//可以实现动态提供参数 - 调用executeQuery()不需要传参
rs = stmt.executeQuery();
System.out.println("DB查询成功: " + rs); //com.mysql.cj.jdbc.result.ResultSetImpl@484970b0
//ResultSet查询结果集合
//先声明获取哪一行的数据
rs.first();
// rs.last();
// rs.next();
//再声明获取哪一列的数据
System.out.println(rs.getInt("ad_id")); //输入列名
System.out.println(rs.getString(2)); //输入列的索引,如果值是int类型,用getInt
//遍历所有行的数据
while(rs.next()){
//打印符合要求的所有adId的数据
System.out.println(rs.getInt("ad_id"));
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
DBUtilTest.close(conn,stmt,rs);
}
}
}