jdbc学习一半的代码
用java连接MySQL的准备工作
1.下载MySQL(了解MySQL的基本语法)
2.下载java的和MySQL的连接
3.在程序中加入2中下载的jar包
写java程序连接数据库的基本步骤:
1.注册(加载)相应数据库的驱动
Class.forName("com.mysql.jdbc.Driver");//选择注册驱动
2.建立java和数据库的连接
Connection con=DriverManager.getConnection(url,user,password);//建立和mysql数据库的连接
3.创建可以执行数据库语句的变量
Statement stmt = con.createStatement();
stmt.executeQuery(SqlRequest);//返回结果
4.存储结果的变量
ResultSet rs= stmt.executeQuery(SqlRequest);
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.sql.Statement;
- public class MysqlDemo1 {
- public static void main(String[] args) {
- selectAll();
- //System.out.println(selectByUsernamePassword2("zs","123"));
- //sql注入
- //System.out.println(selectByUsernamePassword2("zs","12347'or'1'='1"));
- }
- public static void selectAll(){
- // TODO Auto-generated method stub
- Connection con=null;
- Statement stmt=null;
- ResultSet rs=null;
- try {
- Class.forName("com.mysql.jdbc.Driver");//选择注册驱动
- String url="jdbc:mysql://localhost:3306/dy?useUnicode=true&characterEncoding=utf-8&useSSL=false";
- String user="root";
- String password="root";
- con=DriverManager.getConnection(url,user,password);//建立和mysql数据库的连接
- stmt = con.createStatement();
- String SqlRequest = "select * from student";
- rs= stmt.executeQuery(SqlRequest);
- while(rs.next()){
- System.out.println(rs.getString(1)+" "+rs.getString(2)+" "+rs.getString(3)+" "+rs.getString(4));//数值类型也可以用String类型进行获取输出
- //System.out.println(rs.getString("id")+" "+rs.getString("stu_name")+" "+rs.getString("stu_sex")+" "+rs.getString("stu_score"));//这种输出格式也可以正确输出
- }
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }finally{
- try {
- if(rs!=null)
- rs.close();
- } catch (SQLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- try {
- if(stmt!=null)
- stmt.close();
- } catch (SQLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- try {
- if(con!=null)
- con.close();
- } catch (SQLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- public static boolean selectByUsernamePassword(String username,String password){//存在sql注入问题
- Connection con=null;
- Statement stmt=null;
- ResultSet rs=null;
- try {
- Class.forName("com.mysql.jdbc.Driver");//注册对应的驱动
- //url,"root","root"
- String url= "jdbc:mysql://localhost:3306/dy?useUnicode=true&characterEncoding=utf-8&useSSL=false";
- con = DriverManager.getConnection(url,"root","root");
- stmt = con.createStatement();
- String requestSql="select * from user where u_name='"+username+"'and u_password='"+password+"'";
- rs = stmt.executeQuery(requestSql);
- if(rs.next()){
- return true;
- }else{
- return false;
- }
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }finally{
- try {
- if(rs!=null)
- rs.close();
- } catch (SQLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- try {
- if(stmt!=null)
- stmt.close();
- } catch (SQLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- try {
- if(con!=null)
- con.close();
- } catch (SQLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- return false;
- }
- public static boolean selectByUsernamePassword2(String username,String password){//解决sql注入
- Connection con=null;
- PreparedStatement stmt=null;
- ResultSet rs=null;
- try {
- Class.forName("com.mysql.jdbc.Driver");//注册对应的驱动
- //url,"root","root"
- String url= "jdbc:mysql://localhost:3306/dy?useUnicode=true&characterEncoding=utf-8&useSSL=false";
- con = DriverManager.getConnection(url,"root","root");
- String RequestSql="select *from user where u_name=? and u_password=? ";
- pstmt = con.prepareStatement(RequestSql);
- pstmt.setString(1, username);
- pstmt.setString(2,password);
- rs = pstmt.executeQuery();
- if(rs.next()){
- return true;
- }else{
- return false;
- }
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }finally{
- try {
- if(rs!=null)
- rs.close();
- } catch (SQLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- try {
- if(pstmt!=null)
- pstmt.close();
- } catch (SQLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- try {
- if(con!=null)
- con.close();
- } catch (SQLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- return false;
- }
- }
sql注入的产生:因为利用Statement的过程是我们自己进行字符串拼接(我们没有对密码进行特殊的处理),所以有些用户利用我们自己拼接字符串的漏洞就可以
例:System.out.println(selectByUsernamePassword2("zs","12347'or'1'='1"));将这句话和我们的字符串拼接之后输出的话是select * from user where u_name='zs'and u_password='12347'or'1'='1'
这句话在判断之后就会返回true
sql注入的解决:我们不进行字符串拼接,让系统的其他类帮我们完成类似的工作,我们舍弃之前的Statement转而用PreparedStatement,它是通过方法setString对用户的姓名和密码进行处理。
jdbc学习一半的代码的更多相关文章
- JDBC学习笔记(2)——Statement和ResultSet
Statement执行更新操作 Statement:Statement 是 Java 执行数据库操作的一个重要方法,用于在已经建立数据库连接的基础上,向数据库发送要执行的SQL语句.Statement ...
- JDBC学习笔记(1)——JDBC概述
JDBC JDBC API是一个Java API,可以访问任何类型表列数据,特别是存储在关系数据库中的数据.JDBC代表Java数据库连接. JDBC库中所包含的API任务通常与数据库使用: 连接到数 ...
- 【转】JDBC学习笔记(2)——Statement和ResultSet
转自:http://www.cnblogs.com/ysw-go/ Statement执行更新操作 Statement:Statement 是 Java 执行数据库操作的一个重要方法,用于在已经建立数 ...
- 【转】JDBC学习笔记(1)——JDBC概述
转自:http://www.cnblogs.com/ysw-go/ JDBC JDBC API是一个Java API,可以访问任何类型表列数据,特别是存储在关系数据库中的数据.JDBC代表Java数据 ...
- JDBC 学习笔记(十一)—— JDBC 的事务支持
1. 事务 在关系型数据库中,有一个很重要的概念,叫做事务(Transaction).它具有 ACID 四个特性: A(Atomicity):原子性,一个事务是一个不可分割的工作单位,事务中包括的诸操 ...
- JDBC 学习笔记(十)—— 使用 JDBC 搭建一个简易的 ORM 框架
1. 数据映射 当我们获取到 ResultSet 之后,显然这个不是我们想要的数据结构. 数据库中的每一个表,在 Java 代码中,一定会有一个类与之对应,例如: package com.gerrar ...
- JDBC 学习笔记(六)—— PreparedStatement
1. 引入 PreparedStatement PreparedStatement 通过 Connection.createPreparedStatement(String sql) 方法创建,主要用 ...
- JDBC学习笔记二
JDBC学习笔记二 4.execute()方法执行SQL语句 execute几乎可以执行任何SQL语句,当execute执行过SQL语句之后会返回一个布尔类型的值,代表是否返回了ResultSet对象 ...
- JDBC学习笔记一
JDBC学习笔记一 JDBC全称 Java Database Connectivity,即数据库连接,它是一种可以执行SQL语句的Java API. ODBC全称 Open Database Conn ...
随机推荐
- Ubuntu18 mongodb 离线安装
环境 Ubuntu 18 + mongodb 4.0.10 1.下载版本所需库 https://www.mongodb.com/download-center/community https://re ...
- mongodb副本集仲裁节点搭建
服务器准备: 主节点192.168.100.106 从节点192.168.100.107 仲裁节点192.168.100.108 三台服务器: 关闭防火墙 service iptables stop ...
- ASP.NET学习记录点滴
1.判读是否是第一次请求,有表单的页面,第一次请求时get请求,而不是post请求,所以可以用来判断请求是否是get,在apsx页面中,有微软封装的属性IsPostBack来判断是否是get还是pos ...
- Codeforces Round #620 (Div. 2) A. Two Rabbits
Being tired of participating in too many Codeforces rounds, Gildong decided to take some rest in a p ...
- windows下的环境搭建配置redis
http://blog.csdn.net/spring21st/article/details/11176723
- nginx反向代理实战之轮询、Ip_hash、权重
实验环境 192.168.200.111 web1 centos7 192.168.200.112 web2 centos7 192.168.200.113 wev3 centos7 三台主机环境: ...
- 编译安装nginx错误解决!
编译安装执行 ./configure --prefix=/root/web/nginx --sbin-path=/root/web/nginx/sbin/nginx --conf-path=/root ...
- sftp和FTP
sftp 是一个交互式安全文件传输协议的传输程式.它类似于 ftp也叫internet网络文件协议, 但它进行加密传输,比FTP有更高的安全性.下边就简单介绍一下如何远程连接主机,进行文件的上传和下 ...
- win10 安装"pip install orange3" 出现LINK : fatal error LNK1158: cannot run 'rc.exe' 错误的解决办法
解决办法: 从(本例使用的是64位的python3.6 注意:如果python的版本是32位,则使用x86:如果是64位,则使用x64;) 复制一下两个文件 rc.exe rcdll.dll 到
- php基础 php 全局变量
$_GET ----->get传送方式 $_POST ----->post传送方式 $_REQUEST ----->可以接收到get和post两种方式的值 $GLOBALS ---- ...