欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JDBC入门(一)

程序员文章站 2022-05-03 08:58:05
...

JDBC介绍

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

JDBC操作步骤

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


JDBC入门(一)
我们就查询这张数据库表

  • 执行查询语句
    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开始。

相关标签: JDBC