JAVA Web03——jdbc原理_使用Statement/PrepareStatement访问数据库_两种访问方式的区别_jdbc总结
程序员文章站
2022-06-23 14:50:46
一、JDBC原理JDBC:Java DataBase Connectivity可以为多种关系型数据库提供统一的访问方式,用JAVA操作数据库学习目录1.JDBC API:提供各种操作访问接口,Connection Statement PreParedStatement ResultSet2.JDBC DirverManager:管理不同的数据库驱动3.各种数据库驱动:相应的数据库厂商提供的(第三方公司提供),连接/直接操作数据库1.JDBC API主要功能:与数据库建立连...
目录
一、JDBC原理
JDBC:Java DataBase Connectivity
可以为多种关系型数据库提供统一的访问方式,用JAVA操作数据库
学习目录
1.JDBC API:提供各种操作访问接口,Connection Statement PreParedStatement ResultSet
2.JDBC DirverManager:管理不同的数据库驱动
3.各种数据库驱动:相应的数据库厂商提供的(第三方公司提供),连接/直接操作数据库
1.JDBC API
主要功能:
- 与数据库建立连接 Connection
- 发送SQL语句 Statement
- 返回处理结果 ResultSet
实现方法:
- DriverManager:管理jdbc驱动
- Connection:连接(通过DriverManager产生)
- Statement(PreparedStatement):增删改查(通过Connection产生)
- CallableStatement:调用数据库中的存储过程/存储函数(通过Connection产生)
- ResultSet:存储查询的结果(上面的Statement等产生)
Connection产生操作数据库的对象:
- Connection产生Statement对象:createStatement()
- Connection产生PreParedStatement对象:prepareStatement()
- Connection产生CallableStatement对象:prepateCall()
ResultSet:保存结果集
next():光标下移,判断是否有下一条数据
2.JDBC访问数据库的具体具体步骤
1.导入驱动,加载具体的驱动类
2.与数据库建立连接
3.发送sql,执行
4.处理结果集
3.数据库驱动
驱动jar | 具体驱动类 | 连接字符串 | |
Oracle | ojdbc-x.jar | oracle.jdbc.OracleDriver | jdbc:oracle:thin:@localhost:1521:ORCL |
MySQL | mysql-connector-java-x.jar | com.mysql.jdbc.Driver | jdbc:mysql://localhost:3306/数据库实例名 |
SqlSever | sqljdbc-x.jar | com.microsoft.sqlsever.jdbc.SQLseverDriver | jdbc:microsoft:sqlsever:localhost:1433;databasename=数据库实例名 |
二、使用Statement访问数据库
Statement操作数据库:
- 增删改:executeUpdate()
- 查询:executeQuery()
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCDemo {
private static final String URL = "jdbc:mysql://localhost:3306/test?serverTimezone=UTC";
private static final String USERNAME = "root";
private static final String PWD = "123456";
public static void update(){ //增删改
Connection connection = null;
Statement stmt = null;
try {
//1.导入驱动,加载具体的驱动类
Class.forName("com.mysql.cj.jdbc.Driver"); //加载具体的驱动类
//2.与数据库建立连接
connection = DriverManager.getConnection(URL, USERNAME, PWD);
//3.发送sql,执行(【增删改】、查)
stmt = connection.createStatement();
//String sql = "insert into ussser values(3,'aa')";
//String sql = "update ussser set name='dd' where id=3";
String sql = "delete from ussser where id=3";
//执行SQL(增删改executeUpdate(),查询executeQuery())
int count = stmt.executeUpdate(sql); //返回值表示增删改 几条数据
//4.处理结果
if(count>0) {
System.out.println("操作成功!");
}
}catch(ClassNotFoundException e) {
e.printStackTrace();
}catch(SQLException e) {
e.printStackTrace();
}catch(Exception e) {
e.printStackTrace();
}finally {
try {
if(stmt!=null)
stmt.close();
if(connection!=null)
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void query() {
Connection connection = null;
Statement stmt = null;
ResultSet rs = null;
try {
//1.导入驱动,加载具体的驱动类
Class.forName("com.mysql.cj.jdbc.Driver"); //加载具体的驱动类
//2.与数据库建立连接
connection = DriverManager.getConnection(URL, USERNAME, PWD);
//3.发送sql,执行(增删改、【查】)
stmt = connection.createStatement();
String sql = "select id,name from ussser";
//执行SQL(增删改executeUpdate(),查询executeQuery())
rs = stmt.executeQuery(sql); //返回值表示增删改 几条数据
//4.处理结果
while(rs.next()) {
//推荐用字段名的形式
int id = rs.getInt("id");
String name = rs.getString("name");
// int id = rs.getInt(1); //下标: 从1开始计数
// String name = rs.getString(2);
System.out.println(id+"---"+name);
}
}catch(ClassNotFoundException e) {
e.printStackTrace();
}catch(SQLException e) {
e.printStackTrace();
}catch(Exception e) {
e.printStackTrace();
}finally {
try {
if(rs!=null)
rs.close();
if(stmt!=null)
stmt.close();
if(connection!=null)
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
//update();
query();
}
}
使用jdbc操作数据库时,如果对数据库进行了更换,只需要替换:驱动、具体驱动类、连接字符串、用户名、密码
三、使用PrepareStatement访问数据库
PreParedStatement操作数据库:
- 增删改:executeUpdate()
- 查询:executeQuery()
- 赋值操作:setXxx()
public class JDBCDemo {
private static final String URL = "jdbc:mysql://localhost:3306/test?serverTimezone=UTC";
private static final String USERNAME = "root";
private static final String PWD = "123456";
public static void update(){ //增删改
Connection connection = null;
Statement stmt = null;
PreparedStatement pstmt = null;
try {
//1.导入驱动,加载具体的驱动类
Class.forName("com.mysql.cj.jdbc.Driver"); //加载具体的驱动类
//2.与数据库建立连接
connection = DriverManager.getConnection(URL, USERNAME, PWD);
//3.发送sql,执行(【增删改】、查)
/*Statement
stmt = connection.createStatement();
//String sql = "insert into ussser values(3,'aa')";
//String sql = "update ussser set name='dd' where id=3";
String sql = "delete from ussser where id=3";
//执行SQL(增删改executeUpdate(),查询executeQuery())
int count = stmt.executeUpdate(sql); //返回值表示增删改 几条数据
*/
//PreparedStatement
String sql = "insert into ussser values(?,?)";
pstmt = connection.prepareStatement(sql);
pstmt.setInt(1, 7);
pstmt.setString(2,"acd");
int count = pstmt.executeUpdate();
//4.处理结果
if(count>0) {
System.out.println("操作成功!");
}
}catch(ClassNotFoundException e) {
e.printStackTrace();
}catch(SQLException e) {
e.printStackTrace();
}catch(Exception e) {
e.printStackTrace();
}finally {
try {
if(stmt!=null)
stmt.close();
if(connection!=null)
connection.close();
if(pstmt!=null)
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
update();
}
}
四、两种访问方式的区别
1.Statement
- sql
- executeUpdate(sql)
2.PrepareStatement
- sql(可能存在占位符?)
- 在创建PrepareStatement对象时,将sql预编译 prepareStatement(sql)
- executeUpdate(sql)
- setXxx()替换占位符
推荐使用PrepareStatement,优势:
- 编码更加方便(避免了字符串的拼接)
- 提高性能(因为有预编译操作,预编译只需要执行一次)
eg:重复增加100条(批量处理) - 安全(可以有效防止sql注入)
sql注入:将客户输入的内容 和 开发人员的SQL语句混为一体
stmt:存在被sql注入的风险(例如输入 用户名:任意值 ' or 1=1 -- 密码:任意值)
pstmt:有效防止sql注入
五、jdbc总结
- 导入驱动包,加载具体驱动类 Class.forName("具体驱动类");
- 与数据库简历连接 connection = DriverManager.getConnection( . . . );
- 通过connection获取操作数据库的对象(Statement\preparedStatement\callableStatement)
stmt = connection.createStatement(); - (查询)处理结果集 rs=pstmt.executeQuery();
while(rs.next()){
rs.getXxx( . . . );
}
本文地址:https://blog.csdn.net/qiao39gs/article/details/108985838
上一篇: Linux chmod命令
下一篇: Hive的分桶表和分区表