cgb2108-day06 女爷i 2022-09-14 11:29 184阅读 0赞 ### 文章目录 ### * * 一,JDBC * * \--1,创建工具类 * \--2,模拟用户登录 * \--3,JDBC的练习 * \--4,JDBC的总结 * \--5,修改释放资源的代码 * 二,HTML * * \--1,概述 * \--2,入门案例 ## 一,JDBC ## ### –1,创建工具类 ### package cn.tedu.jdbc; import java.sql.Connection; import java.sql.DriverManager; //提供丰富的方法,方便的jdbc操作 public class JDBCUtils { //1,获取数据库的连接(注册驱动+获取连接) /** * 获取数据库的连接 * @return 数据库的连接对象Connection * @throws Exception */ static public Connection getConnection() throws Exception{ //1,注册驱动 Class.forName("com.mysql.jdbc.Driver");//全路径 //2,获取数据库的连接(用户名/密码) //jdbc连接mysql数据库的协议//本机:端口号/数据库的名字 解决中文乱码 指定时区 关闭权限检验 String url="jdbc:mysql://localhost:3306/cgb2108?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false" ; Connection c = DriverManager.getConnection( url,"root","root"); return c ;//返回给调用者 } } ### –2,模拟用户登录 ### package cn.tedu.jdbc; import java.sql.*; import java.util.Scanner; //需求:利用JDBC,查询tb_user表里的数据 /* 1,创建表,并插入数据 2,利用JDBC,查询数据 CREATE TABLE tb_user( id int PRIMARY KEY auto_increment, name varchar(20) default NULL, password varchar(20) default NULL ) insert into tb_user values(null,'jack','321') */ public class Test2 { public static void main(String[] args) throws Exception { // method();//查询tb_user表里的数据 // method2();//模拟用户登录 method3();//解决SQL攻击问题 } //解决SQL攻击问题 private static void method3() throws Exception { //1,注册驱动 2,获取连接 Connection c = JDBCUtils.getConnection(); //3,执行SQL String a = new Scanner(System.in).nextLine();//用户名 String b = new Scanner(System.in).nextLine();//密码 //如果动态的拼接字符串时,数据在中间的位置 "+a+" // String sql="select * from tb_user where name='jack' and password='321'" ; // String sql="select * from tb_user where name='"+a+"' and password='"+b+"'" ; //SQL骨架:用?代替了参数的位置,?叫占位符,好处:简洁(避免了SQL拼接参数) String sql="select * from tb_user where name=? and password=?" ; //4,获取传输器 // Statement s = c.createStatement(); PreparedStatement s = c.prepareStatement(sql); //设置SQL参数--setXxx()设置不同类型的参数 s.setString(1,a);//?的索引,要给?设置的值 s.setString(2,b);//?的索引,要给?设置的值 //TODO 当用户名输入jack'#时还会发生SQL攻击吗??? ResultSet r = s.executeQuery(); //5,解析结果集 if(r.next()){ //查到数据了吗?查到了就登录成功 System.out.println("登录成功~"); }else{ System.out.println("用户名或者密码输入错误,登录失败~"); } //6,关闭资源 r.close(); s.close(); c.close(); } //查询tb_user表里的数据 private static void method() throws Exception{ //调用工具类的方法 Connection c = JDBCUtils.getConnection(); //3,获取传输器 Statement s = c.createStatement(); //4,执行SQL ResultSet r = s.executeQuery("select * from tb_user"); //5,解析结果集 while(r.next()){ //判断r有数据 //获取r的数据 int a = r.getInt("id");//获取表里的id字段的值 String b = r.getString("name");//获取表里的name字段的值 String c1 = r.getString("password");//获取表里的password字段的值 System.out.println(a+b+c1); } //6,释放资源 r.close();//释放结果集 s.close();//释放传输器 c.close();//释放连接器 } /* 模拟用户登录 1,发起SQL:select * from tb_user where name='jack' and password='321' 2,判断result,如果有结果就登录成功,没结果就登录失败 问题: SQL攻击/SQL注入, 本质上就是因为SQL语句中出现了特殊符号(#,注释掉了一些条件),导致了SQL语义改变了 解决方案:Statement低级的传输器,不安全,低效 换成PreparedStatement高级,安全 */ private static void method2() throws Exception { //1,注册驱动 2,获取连接 Connection c = JDBCUtils.getConnection(); //3,获取传输器 Statement s = c.createStatement(); //4,执行SQL String a = new Scanner(System.in).nextLine();//用户名 String b = new Scanner(System.in).nextLine();//密码 //如果动态的拼接字符串时,数据在中间的位置 "+a+" // String sql="select * from tb_user where name='jack' and password='321'" ; String sql="select * from tb_user where name='"+a+"' and password='"+b+"'" ; ResultSet r = s.executeQuery(sql); //5,解析结果集 if(r.next()){ //查到数据了吗?查到了就登录成功 System.out.println("登录成功~"); }else{ System.out.println("用户名或者密码输入错误,登录失败~"); } //6,关闭资源 r.close(); s.close(); c.close(); } } ### –3,JDBC的练习 ### package cn.tedu.jdbc; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; //JDBC的练习 public class Test3 { public static void main(String[] args) throws Exception{ // method();//查询部门表的<100数据 method2();//向dept表里插入数据 } //向dept表里插入数据 private static void method2() throws Exception { Connection c = JDBCUtils.getConnection(); //插入数据时怎么决定要几个问号? 要看表里有几个字段需要设置值 String sql = "insert into dept values(?,?,?)" ; PreparedStatement p = c.prepareStatement(sql); //设置SQL的参数 p.setObject(1,666); p.setObject(2,"软件测试部"); p.setObject(3,"大山西"); //执行SQL p.executeUpdate();//执行增删改的SQL //TODO 会返回结果集吗?返回了的是啥? } //查询部门表的<100数据 private static void method() throws Exception{ Connection c = JDBCUtils.getConnection();//利用工具类,获取数据库的连接 //获取传输器,执行SQL骨架 String sql = "select * from dept where deptno < ?"; PreparedStatement s = c.prepareStatement(sql); //设置SQL的参数 s.setInt(1,100);//给第一个?设置100 ResultSet r = s.executeQuery();//执行查询的SQL语句 //处理结果集 while(r.next()){ //next()判断有数据吗 //获取数据getXxx()--获取表里的dname字段的值,并打印 String str = r.getString("dname"); System.out.println(str); } //关闭资源 r.close(); s.close(); c.close(); } } ### –4,JDBC的总结 ### 1, 什么是JDBC? java程序连接数据库的标准方案,全称是java database connectivity 2, 使用JDBC步骤? 导入jar包,注册驱动,获取数据库的连接,获取传输器,执行SQL,解析结果集(查询),关闭资源 3, 传输器Statement和PreparedStatement有什么区别? Statement不安全(可能发生SQL攻击),而且低效 4, Statement和PreparedStatement有什么关系? public interface PreparedStatement extends Statement ,是父子接口 5, SQL攻击? 原因是:SQL中出现了特殊符号\#(注释符号)改变了SQL的语义 解决方案:使用新的传输器PreparedStatement 6, 执行SQL: 先执行SQL骨架,然后再给SQL设置参数 executeUpdate(): 用来执行增删改的SQL语句,并且返回了影响行数 executeQuery(): 用来执行查的SQL语句,并且返回了结果集ResultSet ### –5,修改释放资源的代码 ### package cn.tedu.jdbc; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; //JDBC的练习 public class Test3 { public static void main(String[] args) throws Exception{ method();//查询部门表的<100数据 // method2();//向dept表里插入数据 } //向dept表里插入数据 //为了资源一定会被释放? // 把释放资源的代码放入finally里+扩大变量的作用范围 // +在try里修改变量的默认值null+在finally里进行try catch private static void method2(){ //扩大变量的作用范围?因为想让finally也使用 Connection c = null ; PreparedStatement p = null; try{ c = JDBCUtils.getConnection(); //插入数据时怎么决定要几个问号? 要看表里有几个字段需要设置值 String sql = "insert into dept values(?,?,?)" ; p = c.prepareStatement(sql); //设置SQL的参数 p.setObject(1,666); p.setObject(2,"软件测试部"); p.setObject(3,"大山西"); //执行SQL int rows = p.executeUpdate();//执行增删改的SQL //TODO 会返回结果集吗?返回了的是啥? System.out.println("影响的行数是: "+rows); }catch (Exception e){ System.out.println("出错啦~"); }finally { //资源的释放是一定要执行的 //关闭资源 try{ p.close(); }catch (Exception e){ e.printStackTrace(); } try { c.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } } //查询部门表的<100数据 private static void method() { Connection c =null; PreparedStatement s =null; ResultSet r =null; try{ c = JDBCUtils.getConnection();//利用工具类,获取数据库的连接 //获取传输器,执行SQL骨架 String sql = "select * from dept where deptno < ?"; s = c.prepareStatement(sql); //设置SQL的参数 s.setInt(1,100);//给第一个?设置100 r = s.executeQuery();//执行查询的SQL语句 //处理结果集 while(r.next()){ //next()判断有数据吗 //获取数据getXxx()--获取表里的dname字段的值,并打印 String str = r.getString("dname"); System.out.println(str); } }catch (Exception e){ //项目上线阶段,给出的解决方案,比如输出 System.out.println("数据库连接出错~~"); //项目开发调试阶段,给出的解决方案,根据报错信息 e.printStackTrace(); }finally { //关闭资源 try { r.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } try { s.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } try { c.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } } } ## 二,HTML ## ### –1,概述 ### 全称是超文本标记语言 超文本:可以向网页中插入的元素类型丰富(图片,视频,音频,文字…) 标记: HTML提供了各种标记表示是不同类型的元素img video 语法: 由很多的标签组成的, 标签要一对的写要写开始标签和结束标签. ### –2,入门案例 ### 1,创建项目:新建项目–设置项目名称–选择存放路径–创建 2,创建HTML文件: 选中项目–右键–新建–HTML文件–输入文件名–创建 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>这是测试文件</title> </head> <body> 你好 html~ <br/> 你好 html~ <br/> 你好 ht ml~ 你好 html~ 你好 html~ 你好 html~ 你好 html~ </body> </html>
相关 cgb2108-day07 文章目录 一,改造JDBC释放资源 \--1,完善工具类 \--2,修改测试类 二,HTML 绝地灬酷狼/ 2022年09月14日 15:27/ 0 赞/ 178 阅读
相关 cgb2108-day01 文章目录 一,数据库 \--1,概述 \--2,安装 \--3,数据库结构 二, 雨点打透心脏的1/2处/ 2022年09月12日 13:57/ 0 赞/ 140 阅读
相关 cgb2107-day06 文章目录 一,作业 \--1,需求: 模拟用户登录现象 \--2,测试 \--3,标准的释放资 淡淡的烟草味﹌/ 2021年09月11日 03:34/ 0 赞/ 303 阅读
还没有评论,来说两句吧...