--1,概述 用来通过java程序 连接 数据库的技术 --2,使用 导入jar包(丰富的工具类) 获取和数据库的连接(用户名、密码) 通过程序执行SQL 通过程序处理结果 --3,向IDEA里导入jar包(丰富的工具类) --创建project:File-New-Project-选java-next-next-输入工程名-finish --创建lib目录:选中project-右键-new-directory-输入lib-回车 --把jar包粘贴进lib里:cv大法 --!!!编译jar包: File-Project Structure-选Libraries-点加号-找到jar包的位置-ok-选你要使用的位置-Apply-ok --检查: jar包前面有了小箭头,能展开源码就可以了 --4,入门案例 package cn.tedu.jdbc; import java.sql.*; //测试 jdbc //需求:查询cgb2104库里的students表里的所有数据 public class Test1 { public static void main(String[] args) throws Exception { //1,注册驱动 Class.forName("com.mysql.jdbc.Driver"); //2,获取和数据库的连接 //String url= "jdbc:mysql://localhost:3306/cgb2104?characterEncoding=utf8";//指定要连接哪个数据库 String url= "jdbc:mysql:///cgb2104?characterEncoding=utf8";//指定要连接哪个数据库 String user= "root" ; //使用的用户名 String pwd= "root" ; //使用的密码 Connection conn = DriverManager.getConnection(url, user, pwd); //3,获取传输器,执行SQL Statement st = conn.createStatement(); //4,执行SQL ResultSet rs = st.executeQuery("select * from students"); //5,解析结果集 while( rs.next() ){//next()判断结果集中是否有数据 for (int i = 1; i <= 5 ; i++) { //获取每列的值并打印 System.out.println( rs.getString(i) ); } } //6,释放资源 rs.close(); //关闭结果集 st.close();//关闭传输器 conn.close();//关闭连接 } } --5,SQL注入攻击的解决方案 package cn.tedu.jdbc; import java.sql.*; import java.util.Scanner; //测试 jdbc /*总结: 作用: java程序和数据库连接的技术 SQL注入攻击问题:拼接SQL时,出现了特殊符号#,只需要输入用户名而不需要密码都可以登录 SQL注入攻击解决方案:不用Statement,换成了PreparedStatement, 新的工具类的好处:不用自己拼SQl的字符串了,安全,高效 PreparedStatement的解决过程:先把SQL骨架发给数据库,数据库进行预编译 等到设置好了参数,再和骨架一起执行,避免了人为的恶意的拼串造成的隐患 */ public class Test2 { public static void main(String[] args) { // method(); // login();//SQL注入攻击问题 login2();//解决SQL注入攻击的方案 } //解决SQL注入攻击的方案 private static void login2() { try{ Class.forName("com.mysql.jdbc.Driver"); String url="jdbc:mysql:///cgb2104?characterEncoding=utf8"; Connection conn = DriverManager.getConnection(url, "root", "root"); // Statement st = conn.createStatement();不行,不安全,会被SQL攻击 String user = new Scanner(System.in).nextLine();//jack'# String pwd = new Scanner(System.in).nextLine(); //?叫占位符 ,SQL的骨架 String sql ="select * from user2 where name=? and password=?"; //先把SQL骨架发给数据库执行 PreparedStatement ps = conn.prepareStatement(sql); //给SQL里的? 设置参数 ps.setString(1,user); ps.setString(2,pwd); ResultSet rs = ps.executeQuery();//执行查询的SQL,返回结果集 if(rs.next()){ System.out.println("登录成功~"); }else{ System.out.println("登录失败~"); } ps.close(); conn.close(); }catch(Exception e){ e.printStackTrace();//有异常,直接打印异常信息 //System.out.println("执行失败。。。");//上线 } } /*自己准备user2表(id/name/password),准备数据 CREATE TABLE `user2` ( `id` int(11) PRIMARY KEY auto_increment, `name` varchar(10) default NULL, `password` varchar(10) default NULL ) ; */ //需求:利用jdbc,根据用户名和密码查询cgb2104库里的user表 //SQL注入攻击问题 private static void login() { try{ Class.forName("com.mysql.jdbc.Driver"); String url="jdbc:mysql:///cgb2104?characterEncoding=utf8"; Connection conn = DriverManager.getConnection(url, "root", "root"); Statement st = conn.createStatement(); // String sql ="select * from user2 where name='jack' and password='123456'";//写死了 String user = new Scanner(System.in).nextLine();//jack'# String pwd = new Scanner(System.in).nextLine(); //SQL注入攻击问题:本质上是因为SQL语句中出现了特殊符号#,改变了SQL语义 String sql ="select * from user2 where name='"+user+"' and password='"+pwd+"'"; ResultSet rs = st.executeQuery(sql);//执行查询的SQL,返回结果集 if(rs.next()){ System.out.println("登录成功~"); }else{ System.out.println("登录失败~"); } st.close(); conn.close(); }catch(Exception e){ e.printStackTrace();//有异常,直接打印异常信息 //System.out.println("执行失败。。。");//上线 } } //需求:cgb2104库里的dept表里插入数据 private static void method() { try{ Class.forName("com.mysql.jdbc.Driver"); String url="jdbc:mysql:///cgb2104?characterEncoding=utf8"; Connection conn = DriverManager.getConnection(url, "root", "root"); Statement st = conn.createStatement(); // ResultSet rs = st.executeQuery();//执行查询的SQL,返回结果集 //int rows = st.executeUpdate();//执行增删改的SQL,返回影响行数 int rows = st.executeUpdate("insert into dept values(null,'php开发部','北京')"); System.out.println(rows);//打印影响的行数 st.close(); conn.close(); }catch(Exception e){ e.printStackTrace();//有异常,直接打印异常信息 //System.out.println("执行失败。。。");//上线 } } }
JDBC SQL注入攻击的解决方案
最新推荐文章于 2024-01-19 15:50:02 发布