Java数据库的连接—JDBC(一)

一.JDBC的简介

1.1 ODBC的出现

        早期的数据库应用程序开发,因为没有通用的针对与数据库的编程接口,所以,开发人员需要学习相关数据库的API,才可以进行应用程序,这样增加了学习成本和开发周期。因此整个开发市场一直在呼吁有一套通用的编程接口。

        因为有市场需要,微软定义了一组用于数据库应用程序的编程接口ODBC(open database connectivity)。这一套方案大大缩短了程序的开发周期,可以让开发人员只需要调用同一套编程接口,无需考虑具体实现。

ODBC分为四个部分:

  1. 应用程序:开发人员所写的代码,ODBC提供的调用接口

  2. 驱动程序管理器:用于管理驱动程序的。

  3. 驱动程序:对接口的实现部分,各个数据库厂商来完成的。

  4. 数据源:就是连接数据库的一些参数:url,username,password

1.2 JDBC简介 

        Sun公司参考了ODBC方案,制定了一组专门为java语言连接数据库的通用接口JDBC。方便了java开发人员,开发人员不需要考虑特定的数据库的DBMS。JDBC不直接依赖于DBMS,而是通过驱动程序将sql语句转发给DBMS,由DBMS进行解析并执行,处理结果返回。

        简单点说,它为Java开发者提供了一种标准的方法来连接和操作各种关系型数据库。

        注意:驱动程序:由数据库厂商自己实现,程序员只需要拿来使用即可。

 1.3 JDBC的工作原理

 第一步:注册驱动程序 
 第二步: 请求连接 
 第三步: 获取执行sql语句的对象,发送给DBMS 
 第四步:返回结果集,程序员进行处理 
 第五步: 关闭连接操作

 1.4 JDBC中常用的API 

        JDBC API包含了一组类和接口,这些类和接口使得Java程序能够连接到数据库,执行SQL语句,并处理结果。

java.sql.DriverManager
java.sql.Connection
java.sql.Statement
java.sql.Result

1)DriverManager

        JDBC的驱动管理类,负责加载和注册驱动,会根据所提供的连接信息(如URL、用户名和密码)自动选择合适的驱动程序。其提供了用于连接数据库的方法getConnection(…)

常用方法:

getConnection(String url, String user, String password)

方法参数解析:

- url:  连接指定数据库的地址            (比如,jdbc:mysql://ip:port/dbname)
- user:  连接用户名
- password:  密码

2)Connection。

        是一个接口,代表了与数据库的一个会话;通过DriverManager的getConnection方法,程序可以建立与数据库的连接,返回该接口的一个实现类对象。可以用来获取Statement、PreparedStatement和CallableStatement等对象。

常用方法:

Statement createStatement();
作用:用于获取Statement对象

3)Statement相关

Statement:也是一个接口,用于执行静态SQL语句。每次执行都会解析、编译和执行SQL语句,效率较低,但灵活性高。

常用方法:

execute(String sql):通常用于DDL
executeUpdate(String sql):通常用于DML
executeQuery(String sql):用于DQL

PreparedStatement:用于执行预编译的SQL语句。预编译的SQL语句只需要解析、编译一次,之后可以多次执行,提高了执行效率。适用于需要多次执行相同或类似SQL语句的场景。

常用方法:

execute() ;------用于DDL和DML
executeUpdate();-----用于DML
executeQuery();-----用于DQL

CallableStatement:用于执行存储过程和函数。它可以接收参数、返回结果集和处理输出参数。

4)ResultSet

是一个接口,表示从数据库执行DQL语句时返回的结果集。其内部维护了一个指针,该指针默认指向的是第一行之前的位置。next方法用于移动指针到下一行。 指针指向某一行时,就可以调用相关的方法获取这一行上的所有列数据。

常用方法:

next():光标方法,向下移动一行,

getDate(int columnIndex)
getDate(String columnLabel)

getString(int columnIndex)
getString(String columnLabel)

getInt(int columnIndex)
getInt(String columnLabel)

getDouble(int columnIndex)
getDouble(String columnLabel)

二.原生JDBC入门编程 

2.1 编写步骤

在编写JDBC的原生代码时,先创建好项目,加载好相应的静态资源,如图片、第三方jar包等,

==注意==:jar包要添加到Library里

然后编写步骤如下:

  1. 注册驱动

  2. 建立连接

  3. 获取执行对象

  4. 处理结果集

  5. 关闭连接

2.2 案例1:JDBC更新数据 

public static void main1(String[] args) throws ClassNotFoundException, SQLException {
    //第一步:加载驱动
    Class.forName("com.mysql.jdbc.Driver");
    //第二步:建立连接
    Connection conn =DriverManager
    .getConnection("jdbc:mysql://localhost:3306/bd1901","root","123456");
    //第三步:获取执行对象Statement
    Statement stat = conn.createStatement();
    String sql = "update emp set sal = 10000,comm = 500 where empno = 9000";
    //第四步:调用方法执行sql,即发送sql
    int num = stat.executeUpdate(sql);
    System.out.println("受影响的记录数目:"+num);
    //第五步:关闭连接
    conn.close();
}

2.3 案例2:JDBC查询数据 

public void test2(){
    Connection conn = null;
    Statement stat = null;
    ResultSet rs = null;
    try{
        //注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //建立连接
        conn = DriverManager
        .getConnection("jdbc:mysql://localhost:3306/bd1901","root","123456");
        //获取执行对象,执行sql
        stat = conn.createStatement();
        //返回结果集
        rs = stat.executeQuery("select * from emp");
        while(rs.next()){
            int empno = rs.getInt(1);
            String ename = rs.getString("ename");
            Date hiredate = rs.getDate("hiredate");
            double salary = rs.getDouble("sal");
            System.out.println(empno+","+ename+","+hiredate+","+salary);
        }
    }catch (Exception e){
        e.printStackTrace();
    }finally {
        try {
            rs.close();
            stat.close();
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

2.4 DBUtil工具类的封装 

第一步:编写配置文件properties

#低版本的mysql的驱动和url
#driver=com.mysql.jdbc.Driver
#url=jdbc:mysql://localhost:3306/bd1906?useUnicode=true&characterEncoding=utf8

#高版本的mysql的驱动和url
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mydb?serverTimezone=Asia/Shanghai&useTimezone=true
username=root
passwd=mmforu

第二步:定义工具类DBUtil,读取配置文件,定义连接方法,关闭方法等

/** 封装了一些对数据库的连接和关闭操作*/
public class DBUtil {
    private static String driver;
    private static String url;
    private static String username;
    private static String password;
    static{

        try{
            //读取配置文件:
            InputStream is = DBUtil.class.getClassLoader()
            .getResourceAsStream("db.properties");
            //获取Properties对象
            Properties p = new Properties();
            //把流里的内容加载到p对象中
            p.load(is);
            //取value值
            driver = p.getProperty("driver");
            url = p.getProperty("url");
            username = p.getProperty("username");
            password = p.getProperty("pwd");
            //注册驱动
            Class.forName(driver);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    /**
     * 连接数据库的方法
     * @return Connection对象
     */
    public static Connection getConnection() throws SQLException{
        Connection conn = DriverManager.getConnection(url,username,password);
        return conn;
    }

    /**
     * 关闭连接操作
     *  关闭ResultSet对象
     *  关闭Statement对象
     *  关闭Connection对象
     */
    public static void closeConnection(Connection conn, Statement stat, ResultSet rs){
        try {
            if(rs!=null){
                rs.close();
            }
            if(stat!=null){
                stat.close();
            }
            if(conn !=null){
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws SQLException {
        Connection conn = getConnection();
        System.out.println(conn);
        closeConnection(conn,null,null);
    }
}`

 第三步:调用DBUtil工具类,进行测试

1)update代码的修改

public static void main(String[] args) throws ClassNotFoundException, SQLException {
        Connection conn = DBUtil.getConnection();
        //第三步:获取执行对象Statement
        Statement stat = conn.createStatement();
        String sql = "update emp set sal = 10000,comm = 500 where empno = 9000";
        //第四步:调用方法执行sql,即发送sql
        int num = stat.executeUpdate(sql);
        System.out.println("受影响的记录数目:"+num);
        //第五步:关闭连接
        DBUtil.closeConnection(conn,stat,null);
}

 2)DQL代码的修改

public void test1(){
        Connection conn = null;
        Statement stat = null;
        ResultSet rs = null;
        try{
            conn = DBUtil.getConnection();
            //获取执行对象,执行sql
            stat = conn.createStatement();
            //返回结果集
            rs = stat.executeQuery("select * from emp");
            while(rs.next()){
               int empno = rs.getInt(1);
               String ename = rs.getString("ename");
               Date hiredate = rs.getDate("hiredate");
               double salary = rs.getDouble("sal");
               System.out.println(empno+","+ename+","+hiredate+","+salary);
           }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
           DBUtil.closeConnection(conn,stat,rs);
        }
}

三.SQL注入问题 

3.1 登录案例

需求分析以及数据准备:

1.需求:实现输入用户名和密码后,实现跳转到主页面的功能
2.逻辑分析:
    - 客户端:接收用户名和密码,并将这些信息发送到服务端
    - 服务端:接收到客户端传过来的用户名和密码后,进行数据库校验是否存在这样的数据,如果存在,就将
            用户名对应的这一条记录返回,并封装成一个User对象。返回给客户端。
    - 客户端收到返回信息后,判断Account对象是否存在,如果存在,就实现跳转

3.2 SQL注入问题(安全隐患) 

Statament对象发送的语句可以被改变结构,即如果之前在where中设置的是两个条件,那么可以通过一些参数 比如 添加or 后面再跟其他条件。此时,where子句中是三个条件。

这种情况就叫做SQL注入。有安全隐患问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值