JDBC入门(一)

JDBC介绍

jdbc就是java程序连接数据库的一种方式,就像是学校需要去买菜,那么学校到买菜的地方就需要有一条通道,有了通道之后还需要一辆可以拉菜的车才能买到菜

JDBC操作步骤

这里以java连接mysq为例l
- 导入jar包mysql-connector-java-5.1.32.jar
- 加载驱动
- 创建连接
- 执行sql语句
- 判断是否执行成功或把执行结果存入结果集


这里写图片描述
我们就查询这张数据库表

  • 执行查询语句
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement pstmt =null;
        ResultSet rs = null;
        try {
            //导入外部驱动包
            //加载驱动
            Class.forName("com.mysql.jdbc.Driver");
            //建立连接 url:全球资源定位
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/bankmanager", "root", "123456");
            //创建preparedstatement对象 传入sql语句
            String sql = "select * from test";      
            pstmt = conn.prepareStatement(sql);
            //执行sql语句 并返回结果集
            rs = pstmt.executeQuery();
            while (rs.next()) {
                System.out.println(rs.getInt(1)+"--"+rs.getString(2)+"--"+rs.getDouble(3));
            }
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                //关闭资源
                rs.close();
                pstmt.close();
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }


  • 执行修改语句

        //导入jar包
        Connection conn = null;
        Statement stmt = null;
        try {
            //加载驱动
            Class.forName("com.mysql.jdbc.Driver");
            //创建连接
            String url = "jdbc:mysql://localhost:3306/bankmanager;"
            String user = "root";
            String password = "123456";
            conn = DriverManager.getConnection(url, user, password);
            //检查是否连接成功
            // System.out.println(conn); 
            //执行sql语句
            stmt = conn.createStatement();
            String sql = "update user set name = '张无忌'where id = 1";
            //执行成功返回false
            System.out.println(stmt.execute(sql));
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                stmt.close();
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

如果执行成功返回false
但是这种情况也会出现问题,出现修改后的名字是乱码,这是编码不同导致的
我们需要对代码加以修改

String url = "jdbc:mysql://localhost:3306/bankmanager?useUnicode=true&characterEncoding=utf-8";

在url后面加上 ?useUnicode=true&characterEncoding=utf-8 问题可以解决


  • 执行条件查询语句


    public static void main(String[] args) throws Exception {
        Class.forName("com.mysql.jdbc.Driver");//创建连接
        String url = "jdbc:mysql://localhost:3306/bankmanager?useUnicode=true&characterEncoding=utf-8";
        String user = "root";
        String password = "123456";
        Connection conn = DriverManager.getConnection(url, user, password);

        Statement stmt = conn.createStatement();

        String sql = "select * from login where name='张无忌' and pwd='1234'";
        ResultSet rs = stmt.executeQuery(sql);
        while (rs.next()) {
            System.out.println(rs.getString("name")+":"+rs.getString("pwd"));
        }
    }

使用createStatement()方法还会出现一个严重的问题 就是sql注入

什么是SQL注入

所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
密码 后面输入 or 1=1 能够查询出所有数据。

String sql = "select * from login where name='张无忌' and pwd='12345'or 1=1;";

通过上述的语句 可以查到所有数据库中的数据。

所以这里不推荐使用createStatement()方法 为了防止SQL注入我们可以使用prepareStatement()方法。
代码如下:



    public static void main(String[] args) throws Exception {
        Class.forName("com.mysql.jdbc.Driver");

        String url = "jdbc:mysql://localhost:3306/bankmanager?useUnicode=true&characterEncoding=utf-8";//创建连接
        String user = "root";
        String password = "123456";
        Connection conn = DriverManager.getConnection(url, user, password);     
        String sql = "select * from login where name=? and pwd=?;";
        PreparedStatement stmt = conn.prepareStatement(sql);
        stmt.setString(1, "张无忌");
        stmt.setString(2, "1234 or 1=1");

        ResultSet rs = stmt.executeQuery();
        while (rs.next()) {
            System.out.println(rs.getString("name")+":"+rs.getString("pwd"));
        }
    }

这种方法就可以防止SQL注入的问题,在pwd后面加上 “1=1” 页无法查询到数据库数据,保证了数据库的安全性


String sql = "select * from login where name=? and pwd=?;";

这段代码中 “?”代表占位符 再用PreparedStatement类型的变量调用 get+数据库数据类型(索引,参数)的方法传值
注意: 方法中索引从1开始。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值