-
什么是JDBC
- JDBC是Java数据库连接技术的简称,提供连接各种常用数据库的能力
-
JDBC的工作原理
-
JDBC API
- 供程序员调用的接口与类,集成在java.sql和javax.sql包中,如:
- DriverManager类
- Connection接口
- Statement接口
- ResultSet接口
- 供程序员调用的接口与类,集成在java.sql和javax.sql包中,如:
-
DriverManager:管理各种不同的JDBC驱动
-
JDBC 驱动:负责连接各种不同的数据库
-
-
JDBC API
- JDBC API主要功能:与数据库建立连接、执行SQL 语句、处理结果
- DriverManager :依据数据库的不同,管理JDBC驱动
- Connection :负责连接数据库并担任传送数据的任务
- Statement :由 Connection 产生、负责执行SQL语句
- prepardStatement 接口:是Statement 子接口,也由Connection 产生,同样负责执行SQL语句,与Statement 接口相比,prepardStatement 接口具有高安全性,高性能,高可读性和高可维护性的优点。
- ResultSet:负责保存Statement执行后所产生的查询结果
- JDBC API主要功能:与数据库建立连接、执行SQL 语句、处理结果
-
JDBC编程模板
try {
Class.forName(JDBC驱动类); //1、加载JDBC驱动
}
… …
try { //URL用来标识数据库
Connection con=DriverManager.getConnection(URL,数据库用户名,密码); //2、与数据库建立连接
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM table1;");//3、发送SQL语句,并得到返回结果
while (rs.next()) {
int x = rs.getInt("a");
String s = rs.getString("b");
float f = rs.getFloat("c"); //4、处理返回结果
}
rs.close(); //5、释放资源 关闭
stmt.close();
con.close();
}
… …
//与ADO.NET步骤类似
-
JDBC驱动
- JDBC驱动由数据库厂商提供
- 在个人开发与测试中,可以使用JDBC-ODBC桥连方式 (不推荐用)
- 将对JDBC API的调用,转换为对另一组数据库连接API的调用
- 优点:可以访问所有ODBC可以访问的数据库
- 缺点:执行效率低、功能不够强大
- 将对JDBC API的调用,转换为对另一组数据库连接API的调用
- 在生产型开发中,推荐使用纯Java驱动方式
- 使用纯Java方式连接数据库
- 由JDBC驱动直接访问数据库
- 优点:完全Java代码,快速、跨平台
- 缺点:访问不同的数据库需要下载专用的JDBC驱动
- 使用纯Java方式连接数据库
- 在个人开发与测试中,可以使用JDBC-ODBC桥连方式 (不推荐用)
- JDBC驱动由数据库厂商提供
… …
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver"); //加载驱动
} catch (ClassNotFoundException e) {
… …
}
try {
conn = DriverManager.getConnection( //建立连接
"jdbc:mysql://localhost:3306/epet","epetadmin", "0000");
//省略代码 … …
} catch (SQLException e) { //处理异常
… …
} finally {
try {
conn.close(); //关闭连接
} catch (SQLException e) {
… …
}}
-
连接数据库的步骤
-
加载JDBC驱动
Class.forName("JDBC驱动类的名称")
-
与数据库建立连接
Connection conn=DriverManager.getConnection(数据库连接字符串,数据库用户名,密码);
-
发送SQL语句,并得到返回结果
Statement stmt=conn.createStatement(); ResultSet rs=stmt.executeQuery("SQL语句");
-
处理返回结果
while(rs.next()){ int id =rs.getint("id"); String name=rs.getString("name"); System.out.println(id+" "+name); }
-
-
Statement常用方法
方法名 说明 ResultSet executeQuery(String sql) 执行SQL查询并获取到ResultSet对象 int executeUpdate(String sql) 可以执行插入、删除、更新等操作,返回值是执行该操作所影响的行数 boolean execute(String sql) 可以执行任意SQL语句,然后获得一个布尔值,表示是否返回ResultSet -
ResultSet常用方法
方法名 说明 boolean next() 将游标从当前位置向下移动一行 boolean previous() 游标从当前位置向上移动一行 void close() 关闭ResultSet 对象 int getInt(int colIndex) 以int形式获取结果集当前行指定列号值 int getInt(String colLabel) 以int形式获取结果集当前行指定列名值 float getFloat(int colIndex) 以float形式获取结果集当前行指定列号值 float getFloat(String colLabel) 以float形式获取结果集当前行指定列名值 String getString(int colIndex) 以String 形式获取结果集当前行指定列号值 String getString(String colLabel) 以String形式获取结果集当前行指定列名值 -
PreparedStatement --SQL注入的隐患
- 什么是SQL注入:SQL注入是网站存在最多也是最简单的漏洞,主要原因是程序员在开发用户和数据库交互的系统时没有对用户输入的字符串进行过滤,转义,限制或处理不严谨,导致用户可以通过输入精心构造的字符串去非法获取到数据库中的数据。
- 如何避免SQL注入的隐患?
- 使用PreparedStatement 接口
- 继承自 Statement接口
- 比Statement对象使用起来更加灵活,更有效率
- PreparedStatement接口 (预编译的 SQL 语句)
- 提高了代码的可读性和可维护性
- 提高了SQL语句执行的性能
- 提高了安全性
-
案例分享
-
登录
//登录 import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Scanner; public class C1 { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("请输入用户名:"); String name = input.next(); System.out.print("请输入密码:"); String pwd = input.next(); // 创建连接对象 Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; // 奶瓶子,加入mysql连接jar包 try { // 加载驱动 Class.forName("com.mysql.jdbc.Driver"); // 创建连接 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/petshop", "root", "ok"); // sql,执行sql String sql = " SELECT COUNT(*) FROM petowner WHERE `name`=? AND `password`=? "; // 获取pstmt对象,预编译sql语句 pstmt = conn.prepareStatement(sql); // 给sql里的?赋值 pstmt.setObject(1, name); pstmt.setObject(2, pwd); // 调用stmt的查询方法 rs = pstmt.executeQuery(); int count = 0; while (rs.next()) { count = rs.getInt(1); } // 处理结果 if (count > 0) { System.out.println("登录成功"); } else { System.out.println("登录失败"); } } catch (Exception e) { e.printStackTrace(); } finally { // 关闭 try { rs.close(); pstmt.close(); conn.close(); } catch (Exception e2) { e2.printStackTrace(); } } } }
-
查询
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; //查询 public class C2 { public static void main(String[] args) { // 创建三个对象 Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { // 加载驱动 Class.forName("com.mysql.jdbc.Driver"); // 获取连接 conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/petshop", "root", "ok"); // sql语句 String sql = "SELECT * FROM petowner"; // 获取pstmt对象并预编译sql pstmt = conn.prepareStatement(sql); // 执行sql rs = pstmt.executeQuery(); // 操作结果 while (rs.next()) { int id = rs.getInt("id"); String name = rs.getString("name"); String pwd = rs.getString("password"); int money = rs.getInt("money"); System.out.println(id + "\t" + name + "\t" + pwd + "\t" + money); } } catch (Exception e) { e.printStackTrace(); } finally { //关闭 try { rs.close(); pstmt.close(); conn.close(); } catch (Exception e2) { e2.printStackTrace(); } } } }
-
新增
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.util.Scanner; //新增 public class C3 { public static void main(String[] args) { Scanner input=new Scanner(System.in); System.out.print("请输入用户名:"); String name = input.next(); System.out.print("请输入密码:"); String pwd = input.next(); System.out.print("请输入钱:"); int monery=input.nextInt(); Connection conn=null; PreparedStatement pstmt=null; try { Class.forName("com.mysql.jdbc.Driver"); conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/petshop", "root", "ok"); String sql="INSERT INTO petowner (`name`,`password`,money) VALUES (?,?,?) "; pstmt=conn.prepareStatement(sql); pstmt.setObject(1, name); pstmt.setObject(2, pwd); pstmt.setObject(3, monery); int count=pstmt.executeUpdate(); if (count>0) { System.out.println("新增成功!"); }else { System.out.println("新增失败!"); } } catch (Exception e) { e.printStackTrace(); }finally{ try { pstmt.close(); conn.close(); } catch (Exception e2) { e2.printStackTrace(); } } } }
-
修改
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.util.Scanner; //修改 public class C4 { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("请输入要改的用户ID:"); int ID = input.nextInt(); System.out.print("请输入钱:"); int monery = input.nextInt(); Connection conn = null; PreparedStatement pstmt = null; try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/petshop", "root", "ok"); String sql = "update petowner set money=? where id=?"; pstmt = conn.prepareStatement(sql); pstmt.setObject(1, monery); pstmt.setObject(2, ID); int count = pstmt.executeUpdate(); if (count > 0) { System.out.println("修改成功!"); } else { System.out.println("修改失败!"); } } catch (Exception e) { e.printStackTrace(); } finally { try { pstmt.close(); conn.close(); } catch (Exception e2) { e2.printStackTrace(); } } } }
-
删除
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.util.Scanner; public class C5 { // 删除 public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("请输入被删除的用户ID:"); int ID = input.nextInt(); Connection conn = null; PreparedStatement pstmt = null; try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/petshop", "root", "ok"); String sql = "Delete from petowner where id=?"; pstmt = conn.prepareStatement(sql); pstmt.setObject(1, ID); int count = pstmt.executeUpdate(); if (count > 0) { System.out.println("删除成功!"); } else { System.out.println("删除失败!"); } } catch (Exception e) { e.printStackTrace(); } finally { try { pstmt.close(); conn.close(); } catch (Exception e2) { e2.printStackTrace(); } } } }
-
-
-
-
总结
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bsyAA7I0-1624350921135)(img\image-20210622163119792.png)]
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
pstmt.close();
conn.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
}
~~~