JDBC初体验(二)

一、SQL注入

1.1 SQL注入原理

利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在web表单中输入(恶意的)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句

1.2 防止SQL注入的方法

  • 过滤用户输入的数据中是否包含非法字符
  • 分步校验,先使用用户名来查询用户,如果查到了,再比较密码
  • 使用PreparedStatement接口

二、PreparedStatement接口

PreparedStatement接口是Statement的子接口,可以使用该接口来替换Statement接口

PreparedStatement的使用

  • 使用Connection对象的preparedStatement(String sql):即创建它时就让它与一条SQL语句绑定
  • 编写SQL语句时,如果存在参数,就是用?作为数据占位符
  • 调用PreparedStatement的setXXX()系列方法为占位符设置值,索引从1开始
  • 调用executeUpdated()或executeQuery()方法,但要注意,要调用没有参数的方法

三、增、删、改、查操作代码演示

3.1 User类

package day02.pojo;/*** @desc:User类*/public class User {private int id;private String userName;private String userPass;private int role;public User(int id, String userName, String userPass, int role) {this.id = id;this.userName = userName;this.userPass = userPass;this.role = role;}public User() {}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getUserPass() {return userPass;}public void setUserPass(String userPass) {this.userPass = userPass;}public int getRole() {return role;}public void setRole(int role) {this.role = role;}@Overridepublic String toString() {return "User{" +"id=" + id +", userName='" + userName + '\'' +", userPass='" + userPass + '\'' +", role=" + role +'}';}
}

3.2 JDBC/增删改查类

package day02.IncreaseDeleteChangeQuery;import day02.pojo.User;import java.sql.*;/*** @desc:JDBC类、增删改查类*/public class UserDao {Connection connection =null;Statement statement =null;PreparedStatement ps = null;ResultSet resultSet =null;/*** 用户登录* @param userName 用户名* @param userPass 用户密码* @return User*/public User toLogin(String userName,String userPass){//1.获取连接对象getConnection();//2.编写SQL语句String sql = "select ID,USERNAME,ROLE from user where userName = ? and userPass = ?";System.out.println("要执行的SQL语句是:" + sql);//3.创建statement对象User user = null;try {// 创建PreparedStatement对象 发送SQL语句并预执行ps = connection.prepareStatement(sql);//3.1处理参数ps.setString(1,userName);ps.setString(2,userPass);//4.执行并解析结果resultSet = ps.executeQuery();while (resultSet.next()){user = new User();user.setId(resultSet.getInt(1));user.setUserName(resultSet.getString(2));user.setRole(resultSet.getInt(3));}} catch (SQLException e) {e.printStackTrace();}finally {closeResource();}return user;}/*** 增删改查——查*/public User login(String userName,String userPass){//1.获取连接对象getConnection();//2.编写SQL语句String sql = "select ID,USERNAME,ROLE from user where userName = '"+userName+"' and userPass = '"+userPass+"'";System.out.println("要执行的SQL语句是:" + sql);//3.创建statement对象User user = null;try {statement = connection.createStatement();resultSet = statement.executeQuery(sql);//4.解析结果while (resultSet.next()){user = new User();user.setId(resultSet.getInt(1));user.setUserName(resultSet.getString(2));user.setRole(resultSet.getInt(3));}} catch (SQLException e) {e.printStackTrace();}finally {closeResource();}return user;}public User login2(String userName,String userPass){//1.获取连接对象getConnection();//2.编写SQL语句String sql = "select ID,USERNAME,USERPASS,ROLE from user where userName = '"+userName+"'";System.out.println("要执行的SQL语句是:" + sql);//3.创建statement对象User user = null;try {statement = connection.createStatement();resultSet = statement.executeQuery(sql);//4.解析结果while (resultSet.next()){user = new User();user.setId(resultSet.getInt(1));user.setUserName(resultSet.getString(2));user.setUserPass(resultSet.getString(3));user.setRole(resultSet.getInt(4));}if(userPass.equals(user.getUserPass())){return user;}} catch (SQLException e) {e.printStackTrace();}finally {closeResource();}return null;}/*** 增删改查——增*/public int saveUser(User user) {int line = 0;//1、获取连接对象getConnection();//2、编写SQL语句String sql = "insert into user values(default,?,?,?)";try {ps = connection.prepareStatement(sql);ps.setString(1, user.getUserName());ps.setString(2,user.getUserPass());ps.setInt(3,user.getRole());//3、执行     增删改的执行方法是excuteUpdate()//返回一个整数,表示受影响的行数line = ps.executeUpdate();} catch (SQLException e) {e.printStackTrace();} finally {closeResource();}return line;}/*** 增删改查——改*/public int updateUser(User user) {int line = 0;//1、获取连接对象getConnection();//2、编写SQL语句String sql = "update user set USERNAME=?,USERPASS=?,ROLE=? where ID=?";try {ps = connection.prepareStatement(sql);ps.setString(1, user.getUserName());ps.setString(2,user.getUserPass());ps.setInt(3,user.getRole());ps.setInt(4,user.getId());//3、执行     增删改的执行方法是excuteUpdate()//返回一个整数,表示受影响的行数line = ps.executeUpdate();} catch (SQLException e) {e.printStackTrace();} finally {closeResource();}return line;}/*** 增删改查——删*/public  int deleteUser(int id) {int line = 0;//1、获取连接对象getConnection();//2、编写SQL语句String sql = "delete from user where id = ?";try {ps = connection.prepareStatement(sql);ps.setInt(1,id);//3、执行     增删改的执行方法是excuteUpdate()//返回一个整数,表示受影响的行数line = ps.executeUpdate();} catch (SQLException e) {e.printStackTrace();} finally {closeResource();}return line;}//↓↓↓以下两部分代码是固定的,不需要改动,所以封装起来/*** 加载驱动和建立连接*/public Connection getConnection(){try {//1.加载驱动Class.forName("com.mysql.jdbc.Driver");//2.建立连接connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/myschool?useSSL=false","root","zkz2002513>");} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}return connection;}/*** 关闭资源*/public void closeResource(){if(resultSet!=null){try {resultSet.close();} catch (SQLException e) {e.printStackTrace();}}if(ps!=null){try {ps.close();} catch (SQLException e) {e.printStackTrace();}}if(statement!=null){try {statement.close();} catch (SQLException e) {e.printStackTrace();}}if(connection!=null){try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}}

3.3 增删改查——增

package day02.IncreaseDeleteChangeQuery;import day02.pojo.User;/*** @desc:增删改查操作——增加main方法*/public class IncreaseMain {public static void main(String[] args) {UserDao userDao = new UserDao();User user = new User();user.setUserName("诸葛亮");user.setUserPass("9087666");user.setRole(3);int line = userDao.saveUser(user);System.out.println(line > 0 ? "添加成功": "添加失败");}
}

3.4 增删改查——删

package day02.IncreaseDeleteChangeQuery;/*** @desc:增删改查操作——删除main方法*/public class DeleteMain {public static void main(String[] args) {UserDao userDao = new UserDao();int line = userDao.deleteUser(11);System.out.println(line > 0 ? "删除成功": "删除失败");}
}

3.5 增删改查——改

package day02.IncreaseDeleteChangeQuery;import day02.pojo.User;import java.util.Scanner;/*** @desc:增删改查操作——改main方法*/public class ChangeMain {public static void main(String[] args) {
/*        Scanner sc = new Scanner(System.in);System.out.println("请输入要修改的用户id:");int id = sc.nextInt();System.out.println("请输入要修改的用户名:");String username = sc.next();System.out.println("请输入新的的密码:");String password = sc.next();System.out.println("请输入角色类型:");int role = sc.nextInt();User user = new User(id, username, password, role);UserDao userDao = new UserDao();*/UserDao userDao = new UserDao();User user = new User(8,"赵云","24678",2);int line = userDao.updateUser(user);System.out.println(line > 0 ? "修改成功" : "修改失败");}
}

3.6 增删改查——查

package day02.IncreaseDeleteChangeQuery;import day02.pojo.User;import java.util.Scanner;/*** @desc:增删改查操作——查询main方法*/public class QueryMain {public static void main(String[] args) {Scanner sc = new Scanner(System.in);UserDao userDao = new UserDao();System.out.println("****************************************");System.out.println("\t\t\t\t\t用户管理系统");System.out.println("****************************************");System.out.print("请输入用户名:");String userName = sc.next();System.out.print("请输入密码:");String userPass = sc.next();User user = userDao.toLogin(userName,userPass);if (user == null) {System.out.println("登录失败,用户名或密码错误!");} else {System.out.println("登录成功,欢迎【" + user.getUserName() + "】!");}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/344342.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

stable diffusion使用相关

IP Adapter,我愿称之它为SD垫图 IP Adapter是腾讯lab发布的一个新的Stable Diffusion适配器,它的作用是将你输入的图像作为图像提示词,本质上就像MJ的垫图。 IP Adapter比reference的效果要好,而且会快很多,适配于各种…

EasyBill账单易版本更新--支持Alibaba Cloud阿里云国际站分销模式

EasyBill账单易针对进行阿里云国际站reseller模式分销业务的分销伙伴需求,现推出全新版本。阿里国际业务满足适配最新版Alibaba Cloud Channel Platform 平台,自动获取账单。此外还提供国际版常用地址,常用银行,汇率,税…

AMEYA360报导:瑞萨宣布收购Transphorm,大举进军GaN

全球半导体解决方案供应商瑞萨电子与全球氮化镓(GaN)功率半导体供应商Transphorm, Inc.(以下“Transphorm”)于今天宣布双方已达成最终协议,根据该协议,瑞萨子公司将以每股5.10美元现金收购Transphorm所有已发行普通股,较Transphorm在2024年1…

一文读懂ERP、OMS、WMS、TMS(1/2)

目录 一、ERP、OMS、WMS、TMS的定义 1.1 ERP(Enterprise Resource Planning) 1.2 OMS(Order Management System) 1.3 WMS(Warehouse Management System) 1.4 TMS (Transportation Manageme…

一款非常好用的语音转文字工具介绍

最近发现一款非常好用的语音转文字的工具Whisper,支持将视频和语音转换成文字,同时记录语音的位置信息,支持语言的翻译,可以将英文转换成中文。同时支持实时的语音自动采集录制。 下面是下载的地址: 【免费】视频、语…

《2024 年 Web3.0 数字资产趋势报告》(一)

撰文:方军、周芳鸽、李祺虹、张睿彬,Uweb 编辑:Nona,Techub News 点击关注公众号获取完整报告 接下来我们将继续和大家分享《2024 年 Web3.0 数字资产趋势报告》中的六大趋势。

MySQL的体系结构(超全总结版)

MySQL组成 连接池组件管理服务和工具组件SQL接口组件查询分析器组件优化器组件缓冲组件插件式存储引擎物理文件 存储引擎 InnoDB存储引擎 主要面向OLTP(在线事务处理)方面的应用,特点是行锁设计、支持外键,默认情况下读取操作不会产生锁。通过使用多…

Qt QListWidget列表框控件

文章目录 1 属性和方法1.1 外观1.2 添加条目1.3 删除条目1.4 信号和槽 2 实例2.1 布局2.2 代码实现 Qt中的列表框控件,对应的类是QListWidget 它用于显示多个列表项,列表项对应的类是QListWidgetitem 1 属性和方法 QListWidget有很多属性和方法&#xf…

观测云产品更新 | 日志、场景仪表板、监控器等

观测云更新 用户访问监测 (RUM ) 公网 Dataway 支持 ip 转换成地理位置信息。 日志 > 查看器详情页 1、新增 BPF 网络日志采集及日志详情页,支持 Json 格式转化; 2、上述 1 中的日志详情页中新增可读的展示模式&#xff0c…

突然又对 Go 感兴趣,GOPATH entry cannot start with shell metacharacter 错误

打发无聊时间,水文一篇~ 事情是这样的,因为我们上架的渠道包基本是定制化混淆出包, 混淆出包有一个关键点就是指定映射文件,映射文件的内容有一部分是使用外部工具在打包前按照一定规律随机生成包名、类名&#xff0c…

OpenAI推出GPT商店,以充分利用ChatGPT在消费者市场上的成功

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

前端项目优化:减少webpack打包体积

前言 最近自己买个云服务器,把之前搭建的webpack-vue项目进行了部署,现在项目已经成功了。 项目地址:GitHub - wjt162286793/webpack----vue: 使用webpack配置一个脚手架,对照文档,纯手打 线上地址:IAM架构资产管理系统 不过是没有经过任何优化的,虽然项目体积和业务不是很复…