Java Database Connectivity   java数据库连接 Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsystems的商标。我们通常说的JDBC是面向关系型数据库的。 没有什么是加一层解决不了的 查询语句使用executeQuery 返回 ResultSet (结果集) 增删改使用 executeUpdate 返回 int (被影响的行数) 官方都叫我们使用while去遍历结果集 res代表一行里面的所有数据 发现ResultSet其实是一个单向的链表 next() 方法执行逻辑 先检查下一个结点是否为空,为空返回false 增删改都是Update 举一个栗子: 1.用户登录时,后台执行的数据库查询操作(SQL语句)是: 2.由于网站后台在进行数据库查询的时候没有对单引号进行过滤,当输入用户名【admin】和万能密码【1’or’1】时,执行的SQL语句为: 测试结果: 3.由于SQL语句中逻辑运算符具有优先级,【=】优先于【and】,【and】优先于【or】,且适用传递性。因此,此SQL语句在后台解析时,分成两句: Select  *  From users Where id = 1 And password = 1   和  1  ,两句bool值进行逻辑or运算,恒为真。     SQL语句的查询结果为TRUE,就意味着认证成功,也可以登录到系统中。输入用户名【admin】,密码【1’or’1】,即可登录成功。 预先将sql语句进行处理避免出现上述情况 结果:
JDBC
1. 什么是JDBC

2. 环境准备
CREATE TABLE users(  id INT PRIMARY KEY, `name` VARCHAR(40), `password` VARCHAR(20),  email VARCHAR(20),  brithday DATE ); INSERT INTO users(id,`name`,`password`,email,brithday) VALUES(1,'张三','1234','1212@qq.com','2020-8-10'); INSERT INTO users(id,`name`,`password`,email,brithday) VALUES(2,'李四','1234','1212@qq.com','2020-8-10'); INSERT INTO users(id,`name`,`password`,email,brithday) VALUES(3,'王五','1234','1212@qq.com','2020-8-10'); INSERT INTO users(id,`name`,`password`,email,brithday) VALUES(4,'张三','1234','1212@qq.com','2020-8-10'); INSERT INTO users(id,`name`,`password`,email,brithday) VALUES(5,'张三','1234','1212@qq.com','2020-8-10'); 3. 测试:
public class TestJdbc { public static void main(String[] args) throws ClassNotFoundException, SQLException { //配置信息         String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC";         String userName = "root";         String password = "root"; //加载驱动         DriverManager.registerDriver(new Driver()); //        Class.forName("com.mysql.cj.jdbc.Driver"); // 创建连接         Connection connection = DriverManager.getConnection(url, userName, password); //向数据库发送SQL的对象statement :CURD         Statement statement = connection.createStatement(); //sql语句         String sql = "select * from users"; //执行SQL语句         ResultSet res = statement.executeQuery(sql); while (res.next()){             System.out.println(res.getObject("name"));             System.out.println(res.getObject("password"));             System.out.println(res.getObject("email"));             System.out.println(res.getObject("brithday")); } //关闭连接         res.close();         statement.close();         connection.close(); } } 注意:
1. mysql 8 后面要加时区
serverTimezone=UTC 2.statement是执行SQL的对象
ResultSet res = statement.executeQuery(sql); int i = statement.executeUpdate(sql); ResultSet executeQuery(String sql) throws SQLException; int executeUpdate(String sql) throws SQLException; 3.结果集ResultSet
直接看源码中的注释:
 * <code>ResultSet</code> object  maintains a cursor pointing  * to its current row of data.  Initially the cursor is positioned  * before the first row. The <code>next</code> method moves the  * cursor to the next row, and because it returns <code>false</code> * when there are no more rows in the <code>ResultSet</code> object, * it can be used in a <code>while</code> loop to iterate through  * the result set. 翻译:
<code>ResultSet</code> 对象维护游标指向到当前数据行。最初定位光标在第一行之前的一个位置。当<code>next</code>方法后移时会先检查下一行是否还有数据,如果没有,就返回false。 所以我们可使用<code>while</code>循环去遍历结果集。  while (res.next()){             System.out.println(res.getObject("name"));             System.out.println(res.getObject("password"));             System.out.println(res.getObject("email"));             System.out.println(res.getObject("brithday")); } 
源码:
/** The actual rows */ protected ResultsetRows rowData; protected Resultset nextResultset = null;  @Override public boolean next() throws SQLException { synchronized (checkClosed().getConnectionMutex()) { boolean b; if (!hasRows()) { throw SQLError.createSQLException(Messages.getString("ResultSet.ResultSet_is_from_UPDATE._No_Data_115"),                         MysqlErrorNumbers.SQL_STATE_GENERAL_ERROR, getExceptionInterceptor()); } if (this.rowData.size() == 0) {                 b = false; } else { this.thisRow = this.rowData.next(); if (this.thisRow == null) {                     b = false; } else { clearWarnings();                     b = true; } } setRowPositionValidity(); return b; } } 4. jdbc固定套路
5. sql注入问题
Select * From users Where id =’用户名’ And password=’密码’ Select * From users Where id = 1 And password= 1 or 1 
 
竟然把所有的数据全部查出来了!!!!!
解决方法:PreparedStatement
 public static void main(String[] args) throws ClassNotFoundException, SQLException { //配置信息         String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC";         String userName = "root";         String password = "root"; //加载驱动         DriverManager.registerDriver(new Driver()); //        Class.forName("com.mysql.cj.jdbc.Driver"); // 创建连接         Connection connection = DriverManager.getConnection(url, userName, password);          String SQL = "Select * From users Where id = ? And password= ?"; //向数据库发送SQL的对象statement :CURD         PreparedStatement statement = connection.prepareStatement(SQL);         statement.setInt(1,1);         statement.setString(2,"1 or 1");         ResultSet res = statement.executeQuery(); while (res.next()){             System.out.println(res.getObject("name"));             System.out.println(res.getObject("password"));             System.out.println(res.getObject("email"));             System.out.println(res.getObject("brithday")); }          statement.close();         connection.close(); } 
 
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算
 官方软件产品操作指南 (170)
官方软件产品操作指南 (170)