当前位置: 首页 > news >正文

沈阳网站建设小工作室上海搜索推广

沈阳网站建设小工作室,上海搜索推广,个人网站的制作代码,关注网站建设📋 个人简介 💖 作者简介:大家好,我是阿牛,全栈领域优质创作者。😜📝 个人主页:馆主阿牛🔥🎉 支持我:点赞👍收藏⭐️留言&#x1f4d…

📋 个人简介

  • 💖 作者简介:大家好,我是阿牛,全栈领域优质创作者。😜
  • 📝 个人主页:馆主阿牛🔥
  • 🎉 支持我:点赞👍+收藏⭐️+留言📝
  • 📣 系列专栏:java 小白到高手的蜕变🍁
  • 💬格言:要成为光,因为有怕黑的人!🔥
    请添加图片描述

目录

    • 📋 个人简介
  • 前言
    • JDBC简介
    • JDBC快速入们
    • JDBC API 详解
      • DriverManager
      • Connection
      • Statement
      • ResultSet
      • PreparedStatement - SQL注入演示
  • 结语

前言

一个项目肯定是离不开数据库的,每种语言都有涉及到操作数据库的内容,本节来看看java语言中如何使用JDBC如何操作数据库!

JDBC简介

就是使用java语言操作关系型数据库的一套API。
请添加图片描述

JDBC快速入们

主要有7步,当然在这之前肯定要先在当前项目或者模块中导入java操作mysql的jar包。对于这个jar包的下载不再总结!
在这里插入图片描述
如图,在模块中新建一个libs目录,将这个jar包放到里面。然后我们要让这个模块识别这个jar包:
在这里插入图片描述
在这里插入图片描述
我们选择模块有效就可以,然后就可以写代码了!
这7步我注视到代码里:

package JdbcDemo;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;public class JDBCDemo {public static void main(String[] args){try {methods();} catch (Exception e) {e.printStackTrace();}}public static void methods() throws Exception{// 1.注册驱动Class.forName("com.mysql.cj.jdbc.Driver");// 2.获取连接String url = "jdbc:mysql://127.0.0.1:3306/myclasswork";String name = "root";String password = "...";Connection conn = DriverManager.getConnection(url,name,password);// 3.定义sqlString sql = "update spj set QTY = 400 where SNO = 'S1'";// 4.获取执行sql的对象StatementStatement stmt = conn.createStatement();// 5. 执行sqlint count = stmt.executeUpdate(sql); //返回更新的数据条数// 6.输出执行结果System.out.println("受影响行数:" + count);// 7.释放资源stmt.close();  //关闭执行sql的对象conn.close(); //关闭连接}
}

在这里插入图片描述

JDBC API 详解

DriverManager

DriverManager (驱动管理类)作用:

  1. 注册驱动
  2. 获取数据库的连接

在这里插入图片描述
但是,我们上面的案例代码中,并没有使用registerDriver来注册驱动,而是使用反射的方式加载Driver类,这个类里面用到了这个方法,来看看源码:
在这里插入图片描述
当然,mysql 5.0之后的jar包,注册驱动的这行代码可以不用写了:

Class.forName("com.mysql.cj.jdbc.Driver");

因为这个jar包中有文件记录了这个类名,会读取文件自动加载!
在这里插入图片描述

Connection

Connection的参数说明:
请添加图片描述
Connection(数据库连接对象)作用

  1. 获取执行sql的对象

请添加图片描述

  1. 管理事务

请添加图片描述

package Demo;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;/*** @Author:Aniu* @Date:2023/2/26 14:16* @description TODO*/
public class Demo {public static void main(String[] args){try {methods();} catch (Exception e) {e.printStackTrace();}}public static void methods() throws Exception{// 1.注册驱动Class.forName("com.mysql.cj.jdbc.Driver");// 2.获取连接String url = "jdbc:mysql://127.0.0.1:3306/myclasswork";String name = "root";String password = "...";Connection conn = DriverManager.getConnection(url,name,password);// 3.定义sqlString sql1 = "update spj set QTY = 450 where SNO = 'S1'";String sql2 = "update spj set QTY = 250 where SNO = 'S2'";// 4.获取执行sql的对象StatementStatement stmt = conn.createStatement();try {// 开启事务conn.setAutoCommit(false);// 5. 执行sqlint count1 = stmt.executeUpdate(sql1); //返回更新的数据条数// 6.输出执行结果System.out.println("受影响行数:" + count1);// 5. 执行sqlint count2 = stmt.executeUpdate(sql2); //返回更新的数据条数// 6.输出执行结果System.out.println("受影响行数:" + count2);// 提交事务conn.commit();} catch (Exception e) {// 回滚事务conn.rollback();e.printStackTrace();}// 7.释放资源stmt.close();  //关闭执行sql的对象conn.close(); //关闭连接}
}

在这里插入图片描述
开启事务的目的就是当发生异常的时候回滚,让这几条sql操作都不执行,这里不再多说!

Statement

Statement 的作用

  • 执行sql操作
    请添加图片描述

ResultSet

ResultSet (结果集对象)作用
1.封装了DQL查询语句的结果

ResultSet stmt.execute(sql)  //执行DQL语句,返回ResultSet对象

在这里插入图片描述
请添加图片描述
例:

package Test;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;/*** @Author:Aniu* @Date:2023/2/26 14:50* @description ResultSet*/
public class Test {public static void main(String[] args) throws Exception {// 1.注册驱动Class.forName("com.mysql.cj.jdbc.Driver");// 2.获取连接String url = "jdbc:mysql://127.0.0.1:3306/myclasswork";String name = "root";String password = "...";Connection conn = DriverManager.getConnection(url,name,password);// 3.定义sqlString sql = "select * from spj";// 4.获取Statement对象Statement stmt = conn.createStatement();// 5.执行sqlResultSet rs = stmt.executeQuery(sql);// 6.处理结果,遍历rs中的所有数据while(rs.next()){String sno = rs.getString("SNO");String pno = rs.getString("PNO");String jno = rs.getString("JNO");int qty = rs.getInt("QTY");System.out.println(sno);System.out.println(pno);System.out.println(jno);System.out.println(qty);System.out.println("------------");}// 7.释放资源rs.close();stmt.close();  //关闭执行sql的对象conn.close(); //关闭连接}
}

在这里插入图片描述

PreparedStatement - SQL注入演示

PreparedStatement 作用:

  • 预编译SQL语句并执行:预防SQL注入问题

SQL注入

  • SQL注入是通过操作输入来修改事先定义的SQL语句,用以达到执行代码对服务器进行攻击的方法。

进行这个案例,我们要先创建一张用户表:

CREATE TABLE `user` (`uid` bigint NOT NULL AUTO_INCREMENT COMMENT '用户uid', `login_name` varchar(20) NOT NULL COMMENT '登录用户名',`login_pwd` varchar(32) NOT NULL COMMENT '登录密码',PRIMARY KEY (`uid`)
) 

在这里插入图片描述

package Login;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;/*** @Author:Aniu* @Date:2023/2/26 15:36* @description TODO*/
public class UserLogin {public static void main(String[] args) throws Exception {Class.forName("com.mysql.cj.jdbc.Driver");String url = "jdbc:mysql://127.0.0.1:3306/myclasswork";String name = "root";String password = "...";Connection conn = DriverManager.getConnection(url,name,password);// 模拟用户输入的值String login_name = "aniu";String login_pwd = "123456";String sql = "select * from user where login_name = '" + login_name + "' and login_pwd = '" + login_pwd + "'";System.out.println(sql);Statement stmt = conn.createStatement();ResultSet rs = stmt.executeQuery(sql);// 判断是否登录成功if(rs.next()){System.out.println("登录成功!");}else{System.out.println("登录失败!");}}
}

在这里插入图片描述
现在我们模拟sql注入,即使密码错误也可以登录成功!

public static void main(String[] args) throws Exception {Class.forName("com.mysql.cj.jdbc.Driver");String url = "jdbc:mysql://127.0.0.1:3306/myclasswork";String name = "root";String password = "...";Connection conn = DriverManager.getConnection(url,name,password);// 模拟用户输入的值(演示sql注入,用户名和密码随便写)String login_name = "aniu666";String login_pwd = "' or '1' = '1";String sql = "select * from user where login_name = '" + login_name + "' and login_pwd = '" + login_pwd + "'";System.out.println(sql);Statement stmt = conn.createStatement();ResultSet rs = stmt.executeQuery(sql);// 判断是否登录成功if(rs.next()){System.out.println("登录成功!");}else{System.out.println("登录失败!");}// 释放资源rs.close();stmt.close();  //关闭执行sql的对象conn.close(); //关闭连接}

在这里插入图片描述
即使用户明和密码错误我们也可以登录,这是因为这个sql是恒等式所导致的!

那么怎么避免这个问题呢?就是通过这个PreparedStatement来解决!

请添加图片描述

public class UserLogin {public static void main(String[] args) throws Exception {Class.forName("com.mysql.cj.jdbc.Driver");String url = "jdbc:mysql://127.0.0.1:3306/myclasswork";String name = "root";String password = "...";Connection conn = DriverManager.getConnection(url,name,password);// 模拟用户输入的值(演示sql注入,用户名和密码随便写)String login_name = "aniu666";String login_pwd = "' or '1' = '1";String sql = "select * from user where login_name = ? and login_pwd = ?";PreparedStatement pstmt = conn.prepareStatement(sql);// 设置?的值pstmt.setString(1,login_name);pstmt.setString(2,login_pwd);ResultSet rs = pstmt.executeQuery();// 判断是否登录成功if(rs.next()){System.out.println("登录成功!");}else{System.out.println("登录失败!");}// 7.释放资源rs.close();pstmt.close();  //关闭执行sql的对象conn.close(); //关闭连接}
}

在这里插入图片描述
此时则显示登陆失败,避免了sql注入!本质上就是将sql中单引号进行了转义
’ \’ ',使用prepareStatement预编译sql性能更高!当然你要开启预编译,给Connection的url加参数:

String url = "jdbc:mysql://127.0.0.1:3306/myclasswork?useServerPrepStmts=true";

结语

如果你觉得博主写的还不错的话,可以关注一下当前专栏,博主会更完这个系列的哦!也欢迎订阅博主的其他好的专栏。

🏰系列专栏
👉软磨 css
👉硬泡 javascript
👉flask框架快速入门

http://www.hengruixuexiao.com/news/21854.html

相关文章:

  • 营销型网站建设考试答案网站优化包括对什么优化
  • 中国建设银行网站首页 定投百度搜索排名
  • 莱芜房产网站短视频营销的优势
  • 机械做卖产品网站西安seo盐城
  • 凡科网站建设步骤seo文章是什么
  • 广州天河区做网站的公司近期国际新闻热点大事件
  • 微网站怎么样做线下活动吸粉网站快速排名优化价格
  • 郑州好的网站建设公司appstore关键词优化
  • 衡水哪个公司做网站好c盘优化大师
  • 网站下载不了视频设计网站排行
  • 提供网站制作公司地址脚本外链生成工具
  • 如何架设一个网站互联网网络推广公司
  • 国内摄影作品网站网络营销ppt怎么做
  • 网站制作公司哪家正规外包网站有哪些
  • 制作电子商务网站页面建站企业网站
  • 做网站网页维护 手机App 开发域名收录查询
  • 台州专业网站设计系统百度推广电话销售话术
  • 做网站技术好学嘛网络营销怎么推广
  • 易班网站建设的意义产品软文范例100字
  • 长沙网站seo天津天狮网络营销课程
  • 文明网站建设情况报告seo广告投放
  • 广州手机网站建设点击精灵seo
  • 淄博网站建设哪家专业短信营销平台
  • 电商网站如何存储图片2023年最新新闻简短摘抄
  • 东台网站开发做搜索引擎推广多少钱
  • 沧州营销型网站建设湘潭网页设计
  • 北京网站制作西安深圳全网营销型网站
  • 一个人做网站要多久app推广拉新
  • 用css做网站的好处识图
  • wordpress主题 kingseo服务公司怎么收费