目录
一、JDBC原理
学习目录
1.JDBC API
2.JDBC访问数据库的具体具体步骤
3.数据库驱动
二、使用Statement访问数据库
三、使用PrepareStatement访问数据库
四、两种访问方式的区别
五、jdbc总结
一、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,执行(【增删改】、查)/*Statementstmt = 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); //返回值表示增删改 几条数据*///PreparedStatementString 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( . . . );
}