MySQL数据库——JDBC五个对象详解(Java)

目录

一、DriverManager:驱动管理对象

1. 注册驱动:告诉程序该使用哪一个数据库驱动jar 

2. 获取数据库连接:

二、Connection:数据库连接对象

1、 获取执行sql 的对象

2、管理事务:

三、Statement:执行sql的对象

1、boolean execute(String sql) :

2、int executeUpdate(String sql) :

3、ResultSet executeQuery(String sql)  :

四、ResultSet:结果集对象,封装查询结果

boolean next():

getXxx(参数):获取数据

用法:              

五、PreparedStatement:执行sql的对象

1. SQL注入问题:

2. 解决sql注入问题:

3. 预编译的SQL:

4. 步骤:


先看如下代码了解前四个对象:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class JDBCDemo {
    public static void main(String[] args) throws Exception{
        //注册驱动
//        Class.forName("com.mysql.jdbc.Driver");               //JDBC5之后可以不用注册驱动
        //获取数据库连接对象
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1","root","root");
        //定义sql语句
        String sql = "select * from db1.emp";
        //获取执行sql的对象Statement
        Statement stmt = conn.createStatement();
        //执行sql
        ResultSet resultSet = stmt.executeQuery(sql);
        //处理结果
        while(resultSet.next()) {                                     //让游标移动到下一行,true 表示有数据行,可以到下一行
            int id = resultSet.getInt(1);                    //获取id
            String name = resultSet.getString("ename");             //获取姓名
            System.out.println("id:" + id + " name:" + name);
        }
        //释放资源
        stmt.close();
        conn.close();
    }
}

一、DriverManager:驱动管理对象

1. 注册驱动:告诉程序该使用哪一个数据库驱动jar 

static void registerDriver(Driver driver) :注册于给定的驱动程序 DriverManager 。 写代码使用: Class.forName("com.mysql.jdbc.Driver");

通过查看源码发现:在com.mysql.jdbc.Driver类中存在静态代码块,

static {
       try {
           java.sql.DriverManager.registerDriver(new Driver());
            } catch (SQLException E) {
                  throw new RuntimeException("Can't register driver!");
            }
}

所以可以直接这样来写:

Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1","root","root");

注意:mysql5之后的驱动jar包可以省略注册驱动的步骤。

2. 获取数据库连接:

  1. 方法:static Connection getConnection(String url, String user, String password)  
  2. 参数:

         * url:指定连接的路径
                   语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
                   例子:jdbc:mysql://localhost:3306/db3
                   细节:如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称
           * user:用户名
           * password:密码 

二、Connection:数据库连接对象

1、 获取执行sql 的对象

                * Statement createStatement()

Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1","root","root");
Statement stmt = conn.createStatement();

                * PreparedStatement prepareStatement(String sql)  

                        用法详见

                        五、PreparedStatement:执行sql的对象

2、管理事务:

  • 开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务

                在执行sql之前开启事务

  • 提交事务:commit() 

                当所有sql都执行完提交事务

  • 回滚事务:rollback() 

               在catch中回滚事务

catch (Exception e) {
      try {
            if(conn != null)
                conn.rollback();          //若发生异常则回滚事务
           } 

三、Statement:执行sql的对象

1、boolean execute(String sql) :

可以执行任意的sql (了解) 

2、int executeUpdate(String sql) :

执行DML(insert、update、delete)语句、DDL(create,alter、drop)语句

               * 返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功 返回值>0的则执行成功,反之,则失败,如下面代码段:

Statement stmt = conn.createStatement();
int count = stmt.executeUpdate("update db1.account set balance = 1500 where id = 2");
if (count > 0)
    System.out.println("转账成功");
else
    System.out.println("转账失败");

3、ResultSet executeQuery(String sql)  :

执行DQL(select)语句:用法见ResultSet对象

四、ResultSet:结果集对象,封装查询结果

  • boolean next():

游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据),如果是,则返回false,如果不是则返回true

  • getXxx(参数):获取数据

            * Xxx:代表数据类型   如: int getInt() ,    String getString()
            * 参数:
                1. int:代表列的编号,从1开始   如: getString(1)
                2. String:代表列名称。 如: getDouble("balance")
            * 使用步骤:
                1. 游标向下移动一行
                2. 判断是否有数据
                3. 获取数据 

用法:              

//处理结果
ResultSet rs = stmt.executeQuery("update db1.account set balance = 1500 where id = 2");              
//循环判断游标是否是最后一行末尾。
while(rs.next()) {              //让游标移动到下一行,true 表示有数据行,可以到下一行
    int id = rs.getInt(1);                    //获取id
    String name = rs.getString("name");             //获取姓名
    double balance = rs.getDouble(3);              //获取工资
    System.out.println("id:" + id + " 姓名:" + name + " 工资:" + balance);
}

五、PreparedStatement:执行sql的对象

1. SQL注入攻击:

在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性问题,如输入用户随便,输入密码:a' or 'a' = 'a(万能密码),如:
           sql:select * from user where username = 'fhdsjkf' and password = 'a' or 'a' = 'a' 

数据库并没用这样的用户名密码,但是可以正常查询到。

public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.println("请输入用户名:");
        String username = in.nextLine();
        System.out.println("请输入密码:");
        String password = in.nextLine();
        boolean flag = new Sign().login2(username,password);
        if(flag)
            System.out.println("登录成功!");
        else
            System.out.println("用户名或密码错误!");
    }
public boolean login(String username ,String password){
        if(username == null || password == null){
            return false;
        }
        //连接数据库判断是否登录成功
        Connection conn = null;
        Statement stmt =  null;
        ResultSet rs = null;
        //1.获取连接
        try {
            conn =  JDBCUtils.getConnection();
            //2.定义sql
            String sql = "select * from db1.user where username = '"+username+"' and password = '"+password+"' ";
            System.out.println(sql);
            //3.获取执行sql的对象
            stmt = conn.createStatement();
            //4.执行查询
            rs = stmt.executeQuery(sql);
            return rs.next();//如果有下一行,则返回true

        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtils.close(rs,stmt,conn);
        }
        return false;
    }

 2. 解决sql注入问题:

使用PreparedStatement对象来解决

3. 预编译的SQL:

参数使用?作为占位符

4. 步骤:

1. 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar
2. 注册驱动
3. 获取数据库连接对象 Connection
4. 定义sql
                * 注意:sql的参数使用?作为占位符。 如:select * from user where username = ? and password = ?;
5. 获取执行sql语句的对象 PreparedStatement  Connection.prepareStatement(String sql) 
6. 给?赋值:
                * 方法: setXxx(参数1,参数2)
                    * 参数1:?的位置编号 从1 开始
                    * 参数2:?的值
7. 执行sql,接受返回结果,不需要传递sql语句
8. 处理结果
9. 释放资源

5、用法:

修改login方法:

public boolean login(String username,String password) {
        if (username == null || password == null)
            return false;
        Connection conn = null;
        PreparedStatement pstmt = null;                //防止sql注入问题
        ResultSet rs = null;
        try {
            conn = JDBCUtils.getConnection();         //用自己写的JDBCUtils连接数据库
            String sql = "select * from db1.user where username = ? and password = ?";
            pstmt = conn.prepareStatement(sql);                            //获取sql的对象
            pstmt.setString(1,username);          //给?赋值
            pstmt.setString(2,password);
            rs = pstmt.executeQuery();                          //执行查询
            return rs.next();                          //如果有下一行则返回true
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtils.close(rs,pstmt,conn);               //用自己写的JDBCUtils释放资源
        }
        return false;
}

注意:后期都会使用PreparedStatement来完成增删改查的所有操作
            1. 可以防止SQL注入
            2. 效率更高

猜你喜欢

转载自blog.csdn.net/weixin_51418964/article/details/122956912