JDBC基本知识
JDBC对数据库操作的六个基本步骤:
//1.注册数据库驱动
//2.获取数据库连接
//3.获取传输器对象
//4.利用传输器传输SQL到数据库执行,获取结果集对象
//5.遍历结果集,获取结果数据
//6.关闭资源(这里低层是将连接还回数据源中)
Statement和PreparedStatement都可以作为执行sql语句的传输器。它们存在父子关系;PreparedStatement是Statement 父级。
在使用Statement传输器时容易被用户输入sql关键字后导致后台sql被破坏,即sql注入攻击。安全性并不高。
PreparedStatement优点:
(1)可以防止sql注入攻击, 采用预编译机制, 先将sql语句的主干发送数据库, 数据库编译后就确定了sql语句的语意, 如果后面参数中再包含sql关键字或者是特殊字符, 也只会当作普通的字符来处理!!!
(2)通过方法来设置参数, 省去了拼接sql语句的麻烦.
(3)能够尽最大可能来提高效率. PreparedStatement发送的sql语句编译后就被数据库缓存下来了, 再次执行时, 如果和缓存中的匹配就会使用缓存中的语句, 不再编译, 直接执行. statement发送的sql语句是先拼接好再发送给数据库, 由于参数不同整条sql语句也就不同, 所以每次都需要编译.
Statement对数据库的增删查改:
增加数据:
1 public static void add(Connection conn,Statement stat,ResultSet rs){ 2 try { 3 //注册mysql驱动 4 Class.forName("com.mysql.jdbc.Driver"); 5 //建立连接 6 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb1","root","admin"); 7 //创建传输器 8 stat = conn.createStatement(); 9 //操作数据 10 int rows = stat.executeUpdate("insert into account values(null,'张三',88888888)"); 11 System.out.println("添加了"+rows+"条"); 12 } catch (Exception e) { 13 e.printStackTrace(); 14 }finally{ 15 JDBCutils.closeResou(conn, stat,rs); 16 } 17 }
查看数据:
1 public static void check(Connection conn,Statement stat,ResultSet rs){ 2 3 try { 4 //注册mysql驱动 5 Class.forName("com.mysql.jdbc.Driver"); 6 //建立连接 7 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb1","root","admin"); 8 //创建传输器 9 stat = conn.createStatement(); 10 //操作数据 11 rs = stat.executeQuery("select name 名字 from account where money = 500;"); 12 while(rs.next()){ 13 System.out.println(rs.getString("名字")); 14 } 15 16 } catch (SQLException e) { 17 e.printStackTrace(); 18 }finally{ 19 JDBCutils.closeResou(conn, stat, rs); 20 } 21 22 }
PreparedStatement对数据的增删查改:
增加数据:
public static void add(Connection conn,PreparedStatement ps){ //注册驱动 try { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql:///mydb1","root","admin"); String sql = "insert into account values(null,?,?) "; ps = conn.prepareStatement(sql); ps.setString(1, "李达康"); ps.setDouble(2, 1000); int rows = ps.executeUpdate(); System.out.println("添加了:"+rows); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(); }finally{ JDBCutils.closeResou(conn, ps, null); } }
删除数据:
public static void del(Connection conn,PreparedStatement ps){ try { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql:///mydb1","root","admin"); String sql="delete from account where id=?"; ps = conn.prepareStatement(sql); ps.setInt(1, 10); int rows = ps.executeUpdate(); System.out.println("删除了"+rows); } catch (Exception e) { e.printStackTrace(); }finally{ JDBCutils.closeResou(conn, ps, null); } }
查数据:
public static void check(Connection conn,PreparedStatement ps,ResultSet rs){ try { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql:///mydb1","root","admin"); String sql="select id from account where name=?"; ps = conn.prepareStatement(sql); ps.setString(1,"童旭平"); rs = ps.executeQuery(); while(rs.next()){ System.out.println(rs.getInt("id")); } } catch (Exception e) { e.printStackTrace(); }finally{ JDBCutils.closeResou(conn, ps, rs); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话