JDBC基础学习笔记
千里之行,始于足下
正文
-
JDBC的理解:
JDBC是允许便捷式访问底层数据库的应用程序接口,JDO、Hibernate、MyBatis等只是更好的封装了JDBC。
-
JDBC的连接步骤:
1、注册驱动:
//反射机制 Class.forName("com.mysql.jdbc.Driver");
2、获取连接:
//可使用.properties配置文件来声明URL, USERNAME, PASSWORD Connection con = DriverManager.getConnection(URL, USERNAME, PASSWORD);
3、获取预编译数据库操作对象:
// Statement ps = con.createStatement(); String sql = "sql语句"; PreparedStatement ps = con.prepareStatement(sql);
4、执行SQL:
ResultSet rs = ps.executeUpdate();
5、处理结果集
6、释放资源:(顺序执行)
rs.close();
ps.close();
con.close();
-
PreparedStatement与Statement的区别:
1、PreparedStatement对象所代表的SQL语句中的参数用问号(?)来表示,执行效率高,能够避免sql注入,更安全。
2、Statement对象所代表的SQL语句中的参数不使用占位符表示,执行效率低,有sql注入的风险,缺乏安全性。
-
SQL注入的现象与解决方案:
1、SQL注入现象:
用户输入信息含有SQL语句的关键字,并且参与了sql的编译过程,导致sql语句原意扭曲。
2、解决办法:
采用PrepareStatement对sql语句框架进行预编译,再传值。
-
JDBC使用:
相关资料 密码:007j
1、调用工具类:
//JDBC工具库 import java.sql.*; // JdbcUtil obj = new JdbcUtil(); obj.getCon() // JdbcUtil obj = new JdbcUtil(); obj.createStatement(); // JdbcUtil.getCon(); public class JdbcUtil { //final String URL="jdbc:mysql://localhost:3306/数据库名"; final String URL="jdbc:mysql://localhost:3306/student"; final String USERNAME="root"; //final String PASSWORD="密码"; final String PASSWORD="123456"; PreparedStatement ps= null; Connection con = null; //注册驱动:将jar包中driver实现类加载到JVM中 static{ try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } //获取连接:封装连接通道创建细节 public Connection getCon(){ try { con = DriverManager.getConnection(URL, USERNAME, PASSWORD); } catch (SQLException e) { e.printStackTrace(); } return con; } //获取预编译数据库操作对象:封装交通工具创建细节(预编译) public PreparedStatement createStatement(String sql){ try { ps = getCon().prepareStatement(sql); } catch (SQLException e) { e.printStackTrace(); } return ps; } //释放资源:ps与con销毁细节 insert,update,delete public void close(){ if(ps!=null){ try { ps.close(); } catch (SQLException e) { e.printStackTrace(); } } if(con!=null){ try { con.close(); } catch (SQLException e) { e.printStackTrace(); } } } //select: ps,con,rs public void close(ResultSet rs){ if(rs!=null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } close(); } }
2、业务逻辑层:
//JDBC封装库 private JdbcUtil util = new JdbcUtil(); @Override //用户注册(SqlName:实体类) public int add(SqlName sqlName) { String sql = "insert into users(userName,pword)" + " values(?,?)"; //预编译 PreparedStatement ps = util.createStatement(sql); int result = 0; try { //获取参数 ps.setString(1, sqlName.getUserName()); ps.setString(2, sqlName.getPword()); result = ps.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } finally { util.close(); } return result; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人