用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);

  1. import java.sql.Connection;
  2. import java.sql.DriverManager;
  3. import java.sql.PreparedStatement;
  4. import java.sql.ResultSet;
  5. import java.sql.SQLException;
  6. import java.sql.Statement;
  7.  
  8. public class MysqlDemo1 {
  9.  
  10. public static void main(String[] args) {
  11. selectAll();
  12. //System.out.println(selectByUsernamePassword2("zs","123"));
  13. //sql注入
  14. //System.out.println(selectByUsernamePassword2("zs","12347'or'1'='1"));
  15.  
  16. }
  17. public static void selectAll(){
  18. // TODO Auto-generated method stub
  19. Connection con=null;
  20. Statement stmt=null;
  21. ResultSet rs=null;
  22. try {
  23. Class.forName("com.mysql.jdbc.Driver");//选择注册驱动
  24. String url="jdbc:mysql://localhost:3306/dy?useUnicode=true&characterEncoding=utf-8&useSSL=false";
  25. String user="root";
  26. String password="root";
  27. con=DriverManager.getConnection(url,user,password);//建立和mysql数据库的连接
  28. stmt = con.createStatement();
  29. String SqlRequest = "select * from student";
  30. rs= stmt.executeQuery(SqlRequest);
  31. while(rs.next()){
  32. System.out.println(rs.getString(1)+" "+rs.getString(2)+" "+rs.getString(3)+" "+rs.getString(4));//数值类型也可以用String类型进行获取输出
  33. //System.out.println(rs.getString("id")+" "+rs.getString("stu_name")+" "+rs.getString("stu_sex")+" "+rs.getString("stu_score"));//这种输出格式也可以正确输出
  34. }
  35.  
  36. } catch (Exception e) {
  37. // TODO Auto-generated catch block
  38. e.printStackTrace();
  39. }finally{
  40.  
  41. try {
  42. if(rs!=null)
  43. rs.close();
  44. } catch (SQLException e) {
  45. // TODO Auto-generated catch block
  46. e.printStackTrace();
  47. }
  48.  
  49. try {
  50. if(stmt!=null)
  51. stmt.close();
  52. } catch (SQLException e) {
  53. // TODO Auto-generated catch block
  54. e.printStackTrace();
  55. }
  56.  
  57. try {
  58. if(con!=null)
  59. con.close();
  60. } catch (SQLException e) {
  61. // TODO Auto-generated catch block
  62. e.printStackTrace();
  63. }
  64. }
  65.  
  66. }
  67.  
  68. public static boolean selectByUsernamePassword(String username,String password){//存在sql注入问题
  69.  
  70. Connection con=null;
  71. Statement stmt=null;
  72. ResultSet rs=null;
  73.  
  74. try {
  75. Class.forName("com.mysql.jdbc.Driver");//注册对应的驱动
  76. //url,"root","root"
  77. String url= "jdbc:mysql://localhost:3306/dy?useUnicode=true&characterEncoding=utf-8&useSSL=false";
  78. con = DriverManager.getConnection(url,"root","root");
  79.  
  80. stmt = con.createStatement();
  81. String requestSql="select * from user where u_name='"+username+"'and u_password='"+password+"'";
  82. rs = stmt.executeQuery(requestSql);
  83. if(rs.next()){
  84. return true;
  85. }else{
  86. return false;
  87. }
  88.  
  89. } catch (Exception e) {
  90. // TODO Auto-generated catch block
  91. e.printStackTrace();
  92. }finally{
  93. try {
  94. if(rs!=null)
  95. rs.close();
  96. } catch (SQLException e) {
  97. // TODO Auto-generated catch block
  98. e.printStackTrace();
  99. }
  100.  
  101. try {
  102. if(stmt!=null)
  103. stmt.close();
  104. } catch (SQLException e) {
  105. // TODO Auto-generated catch block
  106. e.printStackTrace();
  107. }
  108.  
  109. try {
  110. if(con!=null)
  111. con.close();
  112. } catch (SQLException e) {
  113. // TODO Auto-generated catch block
  114. e.printStackTrace();
  115. }
  116.  
  117. }
  118.  
  119. return false;
  120.  
  121. }
  122.  
  123. public static boolean selectByUsernamePassword2(String username,String password){//解决sql注入
  124.  
  125. Connection con=null;
  126. PreparedStatement stmt=null;
  127. ResultSet rs=null;
  128.  
  129. try {
  130. Class.forName("com.mysql.jdbc.Driver");//注册对应的驱动
  131. //url,"root","root"
  132. String url= "jdbc:mysql://localhost:3306/dy?useUnicode=true&characterEncoding=utf-8&useSSL=false";
  133. con = DriverManager.getConnection(url,"root","root");
  134. String RequestSql="select *from user where u_name=? and u_password=? ";
  135. pstmt = con.prepareStatement(RequestSql);
  136.  
  137. pstmt.setString(1, username);
  138. pstmt.setString(2,password);
  139. rs = pstmt.executeQuery();
  140. if(rs.next()){
  141. return true;
  142. }else{
  143. return false;
  144. }
  145.  
  146. } catch (Exception e) {
  147. // TODO Auto-generated catch block
  148. e.printStackTrace();
  149. }finally{
  150. try {
  151. if(rs!=null)
  152. rs.close();
  153. } catch (SQLException e) {
  154. // TODO Auto-generated catch block
  155. e.printStackTrace();
  156. }
  157.  
  158. try {
  159. if(pstmt!=null)
  160. pstmt.close();
  161. } catch (SQLException e) {
  162. // TODO Auto-generated catch block
  163. e.printStackTrace();
  164. }
  165.  
  166. try {
  167. if(con!=null)
  168. con.close();
  169. } catch (SQLException e) {
  170. // TODO Auto-generated catch block
  171. e.printStackTrace();
  172. }
  173.  
  174. }
  175.  
  176. return false;
  177.  
  178. }
  179. }

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学习一半的代码的更多相关文章

  1. JDBC学习笔记(2)——Statement和ResultSet

    Statement执行更新操作 Statement:Statement 是 Java 执行数据库操作的一个重要方法,用于在已经建立数据库连接的基础上,向数据库发送要执行的SQL语句.Statement ...

  2. JDBC学习笔记(1)——JDBC概述

    JDBC JDBC API是一个Java API,可以访问任何类型表列数据,特别是存储在关系数据库中的数据.JDBC代表Java数据库连接. JDBC库中所包含的API任务通常与数据库使用: 连接到数 ...

  3. 【转】JDBC学习笔记(2)——Statement和ResultSet

    转自:http://www.cnblogs.com/ysw-go/ Statement执行更新操作 Statement:Statement 是 Java 执行数据库操作的一个重要方法,用于在已经建立数 ...

  4. 【转】JDBC学习笔记(1)——JDBC概述

    转自:http://www.cnblogs.com/ysw-go/ JDBC JDBC API是一个Java API,可以访问任何类型表列数据,特别是存储在关系数据库中的数据.JDBC代表Java数据 ...

  5. JDBC 学习笔记(十一)—— JDBC 的事务支持

    1. 事务 在关系型数据库中,有一个很重要的概念,叫做事务(Transaction).它具有 ACID 四个特性: A(Atomicity):原子性,一个事务是一个不可分割的工作单位,事务中包括的诸操 ...

  6. JDBC 学习笔记(十)—— 使用 JDBC 搭建一个简易的 ORM 框架

    1. 数据映射 当我们获取到 ResultSet 之后,显然这个不是我们想要的数据结构. 数据库中的每一个表,在 Java 代码中,一定会有一个类与之对应,例如: package com.gerrar ...

  7. JDBC 学习笔记(六)—— PreparedStatement

    1. 引入 PreparedStatement PreparedStatement 通过 Connection.createPreparedStatement(String sql) 方法创建,主要用 ...

  8. JDBC学习笔记二

    JDBC学习笔记二 4.execute()方法执行SQL语句 execute几乎可以执行任何SQL语句,当execute执行过SQL语句之后会返回一个布尔类型的值,代表是否返回了ResultSet对象 ...

  9. JDBC学习笔记一

    JDBC学习笔记一 JDBC全称 Java Database Connectivity,即数据库连接,它是一种可以执行SQL语句的Java API. ODBC全称 Open Database Conn ...

随机推荐

  1. Ubuntu18 mongodb 离线安装

    环境 Ubuntu 18 + mongodb 4.0.10 1.下载版本所需库 https://www.mongodb.com/download-center/community https://re ...

  2. mongodb副本集仲裁节点搭建

    服务器准备: 主节点192.168.100.106 从节点192.168.100.107 仲裁节点192.168.100.108 三台服务器: 关闭防火墙 service iptables stop ...

  3. ASP.NET学习记录点滴

    1.判读是否是第一次请求,有表单的页面,第一次请求时get请求,而不是post请求,所以可以用来判断请求是否是get,在apsx页面中,有微软封装的属性IsPostBack来判断是否是get还是pos ...

  4. 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 ...

  5. windows下的环境搭建配置redis

    http://blog.csdn.net/spring21st/article/details/11176723

  6. nginx反向代理实战之轮询、Ip_hash、权重

    实验环境 192.168.200.111 web1 centos7 192.168.200.112 web2 centos7 192.168.200.113 wev3 centos7 三台主机环境: ...

  7. 编译安装nginx错误解决!

    编译安装执行 ./configure --prefix=/root/web/nginx --sbin-path=/root/web/nginx/sbin/nginx --conf-path=/root ...

  8. sftp和FTP

    sftp 是一个交互式安全文件传输协议的传输程式.它类似于 ftp也叫internet网络文件协议, 但它进行加密传输,比FTP有更高的安全性.下边就简单介绍一下如何远程连接主机,进行文件的上传和下 ...

  9. win10 安装"pip install orange3" 出现LINK : fatal error LNK1158: cannot run 'rc.exe' 错误的解决办法

    解决办法: 从(本例使用的是64位的python3.6 注意:如果python的版本是32位,则使用x86:如果是64位,则使用x64;) 复制一下两个文件 rc.exe rcdll.dll 到

  10. php基础 php 全局变量

    $_GET ----->get传送方式 $_POST ----->post传送方式 $_REQUEST ----->可以接收到get和post两种方式的值 $GLOBALS ---- ...