核心内容摘要
手把手教你用QWEN-AUDIO创建情感化语音助手
JDBCJDBC全称Java Database Connectivity即Java数据库连接器是Java提供的专门执行SQL的API包含在java.sql和javax.sql包里。
Java程序要连接数据库执行SQL还需要安装数据库管理软件驱动比如要连接MySQL需要导入mysql-connector的jar包。
可以把JDBC的作用可以与Navivcat等数据库可视化操作工具类比比如连接数据库、执行SQL、管理事务等。
JDBC的使用步骤比较固定加载驱动程序使用Class.forName()加载数据库驱动JDBC
0以后可以自动加载无需显性编写这个步骤的代码。
建立连接使用DriverManager.getConnection()获取数据库连接获得Connection对象代表与数据库的连接对象。
创建语句使用Connection对象创建Statement、PreparedStatement或CallableStatement。
这些Statement对象代表一个SQL。
执行SQL执行SQL并获取ResultSet。
ResultSet对象代表查询结果集。
处理结果可以遍历ResultSet获取数据。
关闭资源按顺序关闭ResultSet、Statement和Connection。
示例代码importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;importjava.sql.Statement;// 使用JDBC API进行数据库连接并执行SQL语句 public class JdbcDemo1 {publicstatic void main(String[]args){// 定义数据库连接信息:// URL固定格式jdbc:mysql://主机名ip或域名:端口号/数据库名称?useSSLtruecharacterEncodingutf8useUnicodetrue参数K参数V...String urljdbc:mysql://localhost:3306/practice_join?useSSLtruecharacterEncodingutf8useUnicodetrue;// 用户名和密码Stringuseruser;String passwordpassword;// 执行SQL语句(注意需要在Navicat等可视化工具中运行过确保SQL语法正确)StringsqlSELECT s.student_id AS student_id, s.student_name AS student_name, c.class_name AS class_name\nFROM student AS s\nLEFT JOIN class AS c\nON s.class_idc.class_id;// 使用try-catch-resources语句处理异常便于释放资源try(Connection connDriverManager.getConnection(url,user,password);Statement stmtconn.createStatement();// 创建SQL语句对象ResultSet rsstmt.executeQuery(sql);// 执行SQL返回结果集){ System.out.println(数据库连接成功);// 处理结果集打印出每一列的结果到控制台while(rs.next()){intstudent_idrs.getInt(student_id);// 该类为整数类型可以使用getInt()方法获取String student_namers.getString(student_name);// 该类为字符串类型可以使用getString()方法获取String class_namers.getString(class_name);System.out.println(student_id student_name class_name);} } catch(Exception e){ System.out.println(数据库连接失败);e.printStackTrace();} } }JDBC核心接口和类DriverManager类。
用来管理JDBC驱动程序的基本服务。
最常用的是static Connection getConnection(String url, String user, String password)方法尝试与给定数据库URL建立连接。
注意不同的数据库的URL变量固定格式是不同的MySQL的格式为// MySQL url固定格式jdbc:mysql://主机名ip或域名:端口号/数据库名称?useSSLtruecharacterEncodingutf8useUnicodetrue参数K参数V...Stringurljdbc:mysql://localhost:3306/practice_join?useSSLtruecharacterEncodingutf8useUnicodetrue;Connection接口。
表示与特定数据库的连接会话。
常用方法有Statement createStatement()创建一个Statement对象用于将SQL语句发送到数据库。
PreparedStatement prepareStatement(String sql)创建一个PreparedStatement对象用于将参数化的SQL语句发送到数据库。
CallableStatement prepareCall(String sql)创建一个CallableStatement对象用于调用数据库存储过程。
void setAutoCommit(boolean autoCommit)设置此连接是否自动提交事务。
void commit()提交事务使上一次提交/回滚之后的所有更改成为持久更改。
void rollback()回滚事务撤销当前事务中所做的所有更改。
void close()立即释放此Connection对象的数据库和JDBC资源。
常用try-catch-resources语句处理异常以便异常出现后程序自动释放资源。
Statement接口。
表示执行SQL语句的对象。
常用方法ResultSet executeQuery(String sql)执行给定的SQL语句返回一个ResultSet对象通常用于SELECT查询语句是最常用的方法。
int executeUpdate(String sql)执行给定的SQL语句可能是INSERT、UPDATE或DELETE语句或者不返回任何内容的SQL语句如DDL语句。
boolean execute(String sql)执行给定的SQL语句可能返回多个结果用于执行返回多个结果集或更新计数的语句。
void close()释放此Statement对象的数据库和JDBC资源。
PreparedStatement接口。
PreparedStatement与Statement相似都是表示执行SQL语句的对象。
但PreparedStatement表示预编译的SQL语句可以防止SQL注入问题。
常见方法void setInt(int parameterIndex, int x)将指定参数设置为给定的int值。
void setString(int parameterIndex, String x)将指定参数设置为给定的String值。
void setDate(int parameterIndex, Date x)将指定参数设置为给定的java.sql.Date值。
void setObject(int parameterIndex, Object x)使用给定对象设置指定参数的值。
ResultSet executeQuery()执行此PreparedStatement对象中的SQL查询并返回ResultSet对象。
int executeUpdate()执行此PreparedStatement对象中的SQL更新INSERT、UPDATE、DELETE等。
ResultSet接口。
表示数据库结果集的数据表通常是执行SELECT查询语句生成。
常用方法boolean next()将光标从当前位置向前移动一行如果新行有效则返回true否则返回false。
最常用的方法用于循环解析处理数据。
getXXX(int columnIndex)和getXXX(String columnLabel)获取当前行中某列的值其中XXX是数据类型如Int、String、Date等不同的列字段类型使用不同的方法解析。
void close()释放此ResultSet对象的数据库和JDBC资源。
SQL注入问题SQL执行时一般是用用户输入数据编写的SQL片段拼接成完整的SQL语句比如要查询一个用户表中的信息Java代码会编写成...ConnectionconnDriverManager.getConnection(url,user,password);// 创建链接对象Statementstmtconn.createStatement();// 创建SQL语句对象// 编写SQL语句是从用户名和密码输入框输入的inputUser和inputPassword拼接成完整的SQL语句// 比如SELECT * FROM user WHERE user张三 AND password123456StringsqlSELECT * FROM user WHERE userinputUser AND passwordinputPassword;ResultSetrsstmt.executeQuery(sql);...正常查询结果是iduserpassword1张三123456假设一个黑客可以在用户名和密码框输入:inputUserinputPassword’ OR ‘1’1’ OR ‘1’1最终SQL会被拼接为:SELECT*FROMuserWHEREuserOR11ANDpasswordOR11这个SQL在条件中OR 11总为真所以会查出表中所有的数据最终执行结果如下iduserpassword1张三1234562李四4567893王五789123这就是SQL注入SQL注入是一种代码注入技术利用应用程序对用户输入处理不当的漏洞使得攻击者能够在应用程序的数据库查询中注入并执行恶意的SQL代码。
SQL注入的原理就是利用字符串拼接的方式将用户输入直接嵌入到SQL语句中。
如果用户输入中包含了恶意的SQL片段会在字符串拼接后成为SQL执行命令的一部分从而导致数据库遭受攻击包括但不限于数据泄露、数据篡改、数据删除、绕过身份验证等。
SQL注入问题解决方案JDBC提供PreparedStatement用来解决SQL注入问题。
PreparedStatement与Statement相似都是表示执行SQL语句的对象。
但PreparedStatement表示预编译的SQL语句会先使用利用问号做占位符编写的SQL进行编译之后再替换参数。
上述存在SQL注入问题的代码用PreparedStatement可以改为...ConnectionconnDriverManager.getConnection(url,user,password);// 创建链接对象StringsqlSELECT * FROM user WHERE user? AND password?// 使用字符代表需要替换的参数PreparedStatementpsconn.prepareStatement(sql);// 创建PreparedStatement对象ps.ps.setString(1,inputUser);// 将第一个占位的参数替换为inputUser字符串ps.setString(2,inputPassword);// 将第二个占位的参数替换为inputPassword字符串ResultSetrsps.executeQuery();// 执行SQL语句...为什么使用PreparedStatement能解决SQL注入问题因为PreparedStatement采用预编译的机制预编译完成后数据库知道SQL语句的基本结构比如它已经知道要查询user表条件是两个等值比较然后等待参数传入。
后续程序通过setXXX 方法如 setString, setInt为占位符设置参数值这些参数值不会被解释为SQL语句的一部分而是作为纯数据传递。
因此即使参数值中包含SQL关键词或特殊字符比如单引号数据库也会将其视为普通字符串会对其进行转义处理而不会改变原有SQL语句的结构。