iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >【JDBC】笔记(3)-
  • 861
分享到

【JDBC】笔记(3)-

【JDBC】笔记(3)- 2015-01-20 18:01:47 861人浏览 猪猪侠
摘要

1.Statement 编译一次,只执行一次,PreparedStatement 编译一次,可执行n次,所以 PreparedStatement 效率较高...... 一.实现功能:    

【JDBC】笔记(3)-

1.Statement 编译一次,只执行一次,PreparedStatement 编译一次,可执行n次,所以 PreparedStatement 效率较高......

一.实现功能:

    1.解决“应用Statement的登录系统”存在的sql注入问题
    2.用户信息表
    +----+-----------+----------+----------+
    | id | loginName | loginPwd | realName |
    +----+-----------+----------+----------+
    |  1 | abc       | 123      | 张三     |
    |  2 | wwe       | 456      | 李四     |
    +----+-----------+----------+----------+

 

二.代码实现:

 

import java.sql.*;
import java.util.*;

public class JDBCTest02 {
    public static void main(String[] args) {
        //初始化界面(用户输入账号和密码)
        Map userLoginInfo = initUI();
        //验证用户名和密码(JDBC)
        boolean loginSuccess = login(userLoginInfo);
        //显示结果:
        System.out.println(loginSuccess==true?"登录成功":"登录失败");
    }

    
    private static boolean login(Map userLoginInfo) {
        //打标记(登录结果)
        boolean loginSuccess = false;

        Connection connection = null;
        PreparedStatement ps = null;
        ResultSet resultSet = null;
        try {
            //1、注册驱动
            Class.forName("com.Mysql.cj.jdbc.Driver");

            //2、获取连接
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/bjpowernode",
                    "root","888");

            //3、获取预编译的数据库操作对象
            //一个?代表一个占位符,一个?接受一个“值”
            String sql = "select * from t_user where loginName = ? and loginPwd = ? ";
            //程序执行到此处,会发送sql语句框子给DBMS,然后DBMS进行sql的编译
            ps = connection.prepareStatement(sql);
            //给占位符传值(第一个?下标是1,第二个?下标是2,JDBC的的下标从1开始)
            ps.setString(1,userLoginInfo.get("loginName"));
            ps.setString(2,userLoginInfo.get("loginPwd"));

            //4、执行sql
            resultSet = ps.executeQuery();

            //5、处理结果集
            //不需要while结果集,因为查询结果不是 无 就是 1条记录
            if (resultSet.next()){
                loginSuccess = true;
            }

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            //从小到大分别关闭三个资源
            if (resultSet != null) {
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (ps != null) {
                try {
                    ps.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

        }
        //最后返回 登录结果(boolean)
        return loginSuccess;
    }

    
    private static Map initUI() {
        Scanner s=new Scanner(System.in);

        System.out.println("用户名:");
        String loginName = s.nextLine();

        System.out.println("密码:");
        String loginPwd = s.nextLine();

        //用 HashMap(键值对的方式)存储用户输入的 账号和密码
        Map userLoginInfo = new HashMap<>();
        userLoginInfo.put("loginName",loginName);
        userLoginInfo.put("loginPwd",loginPwd);

        return userLoginInfo;
    }
}

 

三.效果展示:

1.使用 PreparedStatement 解决了SQL注入问题:

用户名:
yyds
密码:
yyds" or "1"="1
登录失败

Process finished with exit code 0

2.注意:

1)JDBC代码部分的第三步 --- 获取预编译的数据库操作对象(不同于Statement):

先写好sql语句模型:

String sql = "select * from t_user where loginName = ? and loginPwd = ? ";

发送sql语句框子给DBMS,然后DBMS准备进行sql的编译:

ps = connection.prepareStatement(sql);

给占位符传值:?的值为String就setString,?的值为int就setInt ...

ps.setString(1,userLoginInfo.get("loginName"));
ps.setString(2,userLoginInfo.get("loginPwd"));

 

四.Statement 与 PreparedStatement 对比:

1.Statement 编译一次执行一次,PreparedStatement 编译一次,可执行n次,所以 PreparedStatement 效率较高;

2.PreparedStatement 比 Statement 更加安全

3.Statement 可以完成根据用户的意愿,通过输入sql语句来实现相应的功能,比如:升序(asc)/降序(desc):

1)假设使用 PreparedStatement:

用户想通过按“账号首字母”升序的方式看到用户的信息,所以向?传入“asc”,但这样运行是会报错的,因为实际执行的sql语句是:
select * from t_user order by loginName "asc" //那这俩单引号是什么鬼嘛,执行肯定报错啊,所以这时只能选择 Statement

String sql = "select * from t_user order by loginName ?";
ps = connection.prepareStatement(sql);
ps.setString(1,"asc");
resultSet = ps.executeQuery();

2)假设使用 Statement:

statement = connection.createStatement();
String sql = "select * from t_user order by loginName asc";
resultSet = statement.executeQuery(sql);
    while (resultSet.next()) {
    System.out.println(resultSet.getString("loginName"));
}

这样就可以根据 loginName 首字母大小升序的方式来输出 loginName:

abc
wwe

Process finished with exit code 0

 

您可能感兴趣的文档:

--结束END--

本文标题: 【JDBC】笔记(3)-

本文链接: https://www.lsjlt.com/news/9039.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • CCSP笔记3
      IPSec ×××原理 使用×××带来的××× l 数据安全 data security l 带宽保证 lack of edicated bandwith between sites ×××技术分类 二层××× (Layer 2 ×××...
    99+
    2023-01-31
    笔记 CCSP
  • EIGRP笔记(3)
    关于Graceful shutdown   优雅重启动一个路由器要down时发送goodbye1、goodbye消息以hello分组方式发送2、goodbye消息的K值都是2553、no router eigrp as-number、no ...
    99+
    2023-01-31
    笔记 EIGRP
  • PS笔记3
     PS基础概念: PS: 是一款针对位图图像进行处理的软件。   位图: 由像素构成的图像 (优点:画面细腻,色彩丰富,缺点:放大失真) 矢量图:由运算方式(数学函数方式)得到的图像(特点:放大不失真)         (AI,CDR,由贝...
    99+
    2023-01-31
    笔记 PS
  • samba 笔记@3
     samba   samba 服务器软件包 samba-client 客户端软件包 samba-common 通用工具和库   安装: yum –y install samba rpm –qa |grep samba   # -q quer...
    99+
    2023-01-31
    笔记 samba
  • 我的笔记(3)
     23.OSPF中汇总的方法:外部路由汇只可以在ASBR上进行的,内部路由汇只能在ABR上进行的。   24:OSPF中的LSA的公共头部    附:路由器的Router LSA中有一个1字节VBE...
    99+
    2023-01-31
    笔记
  • 学习笔记(3)
    1.* 匹配零个或多个字符(通配符中)2.ls 的-d选项不仅仅可以显示指定目录的信息,还可以用来表示不递归子文件夹。  # ls -dl /etc 显示/etc目录的信息  # ls -d /etc 只显示/etc下面的文件夹3.显示/v...
    99+
    2023-01-31
    学习笔记
  • 学习笔记3
    一文件查找和压缩1文件查找locate 搜索依赖于数据库,非实时搜索,搜索新建文件需手动更新,适于搜索稳定不频繁修改文件 find 实时搜索,精确搜索,默认当前目录递归搜索 find用法 -maxdepth...
    99+
    2023-01-31
    学习笔记
  • Python基础笔记3
    1.Python内置了很多有用的函数,我们可以直接调用。要调用一个函数,需要知道函数的名称和参数,比如求绝对值的函数abs,只有一个参数。可以直接从Python的官方网站查看文档:http://docs.python.org/3/libra...
    99+
    2023-01-31
    基础 笔记 Python
  • PowerShell 学习笔记(3)
    获取对象的过程中,最好先筛选出对象,再进行操作。(即筛选在排序左边)不区分大小写get-process | where {$_.handles –ge 1000}使用where获取所有对象,用对象执行大括号里的代码,如果...
    99+
    2023-01-31
    学习笔记 PowerShell
  • PHP 学习笔记 (3)
    昨天笔记2说道了PHP的标记以及短标记,今天记录下如何吧PHP从HTML分离手册参考:http://www.php.net/manual/zh/language.basic-syntax.phpmode.phpPHP手册告诉我们,PHP凡是...
    99+
    2023-01-31
    学习笔记 PHP
  • 网管笔记(3)8.25
                 第五天了,感觉真的有点郁闷。明天真的是在这浪费时间啊,试用期一个星期,过了 一半了,我也不可能走不,每天除了上网就是发呆了。网吧里全是新的机子,跟本一般不会出什么问题!我在这我学的东西一点都用不上啊!时间久了,我不...
    99+
    2023-01-31
    网管 笔记
  • CCNP学习笔记(3)
    一、RIPv2:Routing Information Protocol 路由信息协议 1.特性: ①属于“距离矢量”路由协议 ②定期发送路由更新(30S一次,路由表中所有路由) ③依据“跳数”衡量路径好坏 ...
    99+
    2023-01-31
    学习笔记 CCNP
  • python学习笔记(3)
    在大概了解了程序之后,我也买了本python书学习一下,因为现在新版的python3.4.0已经不再兼容2.x.x的内容,书虽然很新,但是有些例子还是用的过去的。1.比如在3.0中print 42不能再产生输出了,要改成print(42)&...
    99+
    2023-01-31
    学习笔记 python
  • cisco学习笔记(3)
    1. 交换机支持的命令:交换机基本状态: switch: ;ROM状态, 路由器是rommon>hostname> ;用户模式hostname# ;特权模式...
    99+
    2023-01-31
    学习笔记 cisco
  • perl学习笔记(3)
    条件结构: if(...){       ...; }elsif(...){       ...; }else{       ...; } 数值关系运算符 ==,>...
    99+
    2023-01-31
    学习笔记 perl
  • maven实战笔记-3
        3.1  pom.xml示例       <project xmlns="http://maven.apache.org/POM/4.0.0"                  xmlns:xsi="http://www...
    99+
    2023-01-31
    实战 笔记 maven
  • shell学习笔记(3)
    一、if基础 1、单分支 1.1 语法 if语句语法 单分支结构语法: if [条件]; then 指令 fi 或 if [条件] then ...
    99+
    2023-01-31
    学习笔记 shell
  • ARM入门笔记(3)
    第三章 点亮我的LED ――I/O输出实验 一.背景 当完成上述实验后,我就可以像使用51单片机那样,在C文件的main()函数中通过设置相应的寄存器来达到对相应外设(如I/O的输入、输出等)的控制目的。 二.实验目的 通过控制PIO的相关...
    99+
    2023-01-31
    入门 笔记 ARM
  • shell 学习笔记3
    ####shell结构 #!指定执行脚本的shell #注释行 命令和控制结构  第一步:创建一个包含命令和控制结构的文件  第二步:修改这个文件的权限使它可以执行,chmod u+x...
    99+
    2023-01-31
    学习笔记 shell
  • GEF学习笔记3
    八、创建嵌套的视图 前面的步骤,创建了公司视图,下面再创建一个国家视图用来容纳公司视图。这就需要按前面的方法把MVC都重新创建一遍。 Model View(Figure) Control(EditPart) 注意重写红框中标...
    99+
    2023-01-31
    学习笔记 GEF
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作