JDBC

JDBC

目录
  • JDBC
    • 1. 数据库驱动
    • 2. JDBC
    • 3. 第一个JDBC程序
    • 4. DriveManager
    • 5. URL
    • 6. Statement
      • 1. CRUD操作-create
      • 2. CRUD操作-delete
      • 3. CRUD操作-update
      • 4. CRUD操作-read
      • 5. 代码实现
        • 1. 提取工具类
        • 2. 编写增删改的方法,使用executeUpdate方法
        • 4. 查询
    • 7. ResultSet
    • 8. 释放资源
    • 9. SQL注入的问题

1. 数据库驱动

驱动:声卡,显卡,数据库

graph TB id1[应用程序] --> id2[MySQL驱动] id1 --> id3[Oracle驱动] id2 --> id4[数据库] subgraph 数据库厂商 id2 id3 end id3 --> id4

我们的程序会通过数据库驱动,和数据库打交道

2. JDBC

SUN公司为了简化开发人员对数据库的统一操作,提供了一个JAVA操作数据库的规范,俗称JDBC

这些规范的实现由具体的厂商去做

对于开发人员来说,我们只需要掌握JDBC的接口操作即可!

graph TB id1[应用程序] --> id2[JDBC] id2 --> id3[MySQL驱动] id2 --> id4[Oracle驱动] id3 --> id5[数据库] id4 --> id5 subgraph 开发人员 id2 end subgraph 数据库厂商 id3 id4 end

java.sql

javax.sql

还需要导入一个数据库驱动包 mysql-connector-java-5.1.48.jar

3. 第一个JDBC程序

  1. 创建测试数据库

    create database jdbcStudy character set utf8 collate utf8_general_ci;
    
    use jdbcStudy;
    
    create table `users`(
    id int primary key,
    name varchar(40),
    password varchar(40),
    email varchar(60),
    birthday date
    );
    
    insert into `users`(id,name,password,email,birthday)
    values(1,'zhansan','123456','[email protected]','1980-12-04'),
    (2,'lisi','123456','[email protected]','1981-12-04'),
    (3,'wangwu','123456','[email protected]','1979-12-04')
    
  2. 创建一个普通项目

  3. 导入数据库驱动

    注意,创建lib目录并复制jar包后,需要进行以下的操作才能导入!

    JDBC_第1张图片

  4. 编写测试代码

package com.wang.lesson01;

import java.sql.*;

//我的第一个jdbc程序
public class jdbcFirstDemon01 {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //1.加载驱动
        Class.forName("com.mysql.jdbc.Driver");     //固定写法,加载驱动

        //2.用户信息和URL
        //URL ?前的内容是jdbc:使用的数据库厂商://主机名:端口号/数据库的名称
        //URL ?后的内容 useUnicode=true&characterEncoding=utf8&useSSL=true
        //第一个参数:使用unicode编码,可以显示中文
        //第二个参数:设定字符集为utf-8
        //第三个参数:使用安全的的连接
        String url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true";
        String username = "root";
        String password = "123456";

        //3.连接成功,数据库对象 Connection代表数据库
        Connection connection = DriverManager.getConnection(url, username, password);   //al + enter

        //4.执行SQL的对象 Statement执行SQL的对象
        Statement statement = connection.createStatement();

        //5.执行SQL的对象 去执行SQL,可能存在结果,返回查看结果
        

        ResultSet resultSet = statement.executeQuery(sql);  //返回的结果集,结果集中封装了我们全部查询出来的结果

        while (resultSet.next()) {
            System.out.println(("id=" + resultSet.getObject("id")));
            System.out.println(("name=" + resultSet.getObject("name")));
            System.out.println(("password=" + resultSet.getObject("password")));
            System.out.println(("email=" + resultSet.getObject("email")));
            System.out.println(("birthday=" + resultSet.getObject("birthday")));
            System.out.println("====================================");
        }

        //6.释放连接
        resultSet.close();
        statement.close();
        connection.close();
    }
}

步骤总结:

  1. 加载驱动

  2. 连接数据库DriverManager

  3. 获得自信sql的对象 Statement

  4. 获得返回的结果集

  5. 释放连接

4. DriveManager

//建议写第二种写法
//DriverManager.registerDriver(new com.mysql.jdbc.Driver());
Class.forName("com.mysql.jdbc.Driver");     //固定写法,加载驱动

//Connection代表数据库
Connection connection = DriverManager.getConnection(url, username, password); 
//数据库设置自动提交
connection.setAutoCommit();
//事务提交
connection.commit();
//事务回滚
connection.rollback();

5. URL

String url = "jdbc:mysql://localhost:3306/jdbcstudy?
    useUnicode=true&characterEncoding=utf8&useSSL=true";

//mysql默认port 3306
//协议://主机地址:端口号/数据库名?参数1&参数2&参数3    

//orale默认端口1521
//jdbc:oracle:thin:@localhost:1521:sid    

6. Statement

执行SQL的对象

String sql = "select * from users";	//编写SQL

statement.executeQuery();   //查询操作 返回ResultSet
statement.execute();        //执行任何SQL
statement.executeUpdate();  //更新,插入,删除都是用这个,返回一个受影响的行数

jdbc中的statement对象用于向数据库发送SQL语句,想完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查语句即可。

Statement对象的executeUpdate方法,用于向数据库发送增、删。改的SQL语句,executeUpdate执行完后,将会返回一个整数(级增删改语句导致了数据库几行数据发生了变化)。

Statement。executeQuery方法用于向数据库发送查询语句,executeQuery方法返回代表查询结果的ResultSet对象

1. CRUD操作-create

使用executeUpdate(String sql)完成数据添加的操作

Statement st = conn.createStatement();
String sql = "insert into user (`XXX`,`XXX`,...) values (XXX,XXX,...)";
int num = st.executeUpdate(sql);
if(num > 0) {
    System.out.println("insert successfully!");		//如果受影响的行数大于1,则说明插入成功
}

2. CRUD操作-delete

使用executeUpdate(String sql)方法完成数据删除操作

Statement st = conn.createStatement();
String sql = "delete from user where id = 1";
int num = st.executeUpdate(sql);
if(num > 0) {
    System.out.println("delete successfully!");		//如果受影响的行数大于1,则说明删除成功
}

3. CRUD操作-update

使用executeUpdate(String sql)方法完成数据修改操作

Statement st = conn.createStatement();
String sql = "update user set name = '' where name = ''";
int num = st.executeUpdate(sql);
if(num > 0) {
    System.out.println("delete successfully!");		//如果受影响的行数大于1,则说明更新成功
}

4. CRUD操作-read

使用executeQuery(String sql)方法完成数据查询操作

Statement st = conn.createStatement();
String sql = "select * from user where id = 1";
ResultSet rs = st.executeQuery(sql);
while(re.next()) {
    //根据获取列的数据类型,分别调用rs的相应方法映射到Java对象中
}

5. 代码实现

1. 提取工具类

driver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true
username = root
password = 123456
package com.wang.lesson02.utils;

import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

public class JdbcUtils {

    private static String driver = null;
    private static String url = null;
    private static String username = null;
    private static String password = null;

    static {
        try {
            InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties");
            Properties properties = new Properties();
            properties.load(in);

            driver = properties.getProperty("driver");
            url = properties.getProperty("url");
            username = properties.getProperty("username");
            password = properties.getProperty("password");

            //1.驱动只用加载一次
            Class.forName(driver);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //获取连接
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url, username, password);
    }


    //释放连接资源
    public static void release(Connection conn, Statement st, ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }

        if (st != null) {
            try {
                st.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }

        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }
}

2. 编写增删改的方法,使用executeUpdate方法

package com.wang.lesson02;

import com.wang.lesson02.utils.JdbcUtils;

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

public class TestInsert {
    public static void main(String[] args) {

        Connection conn = null;
        Statement st = null;
        ResultSet rs = null;

        try {
            conn = JdbcUtils.getConnection();  //获取数据库连接
            st = conn.createStatement();      //获得sql的执行对象
            String sql = "insert into users(id,`name`,`password`,`email`,`birthday`)"
                    + "values(4,'wang','123456','[email protected]','2020-01-01')";

            int i = st.executeUpdate(sql);
            if (i > 0) {
                System.out.println("插入成功!");
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {

            JdbcUtils.release(conn, st, rs);
        }
    }
}
package com.wang.lesson02;

import com.wang.lesson02.utils.JdbcUtils;

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

public class TestDelete {
    public static void main(String[] args) {

        Connection conn = null;
        Statement st = null;
        ResultSet rs = null;

        try {
            conn = JdbcUtils.getConnection();  //获取数据库连接
            st = conn.createStatement();      //获得sql的执行对象
            String sql = "delete from `users` where id = 1";

            int i = st.executeUpdate(sql);
            if (i > 0) {
                System.out.println("删除成功!");
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {

            JdbcUtils.release(conn, st, rs);
        }
    }
}
package com.wang.lesson02;

import com.wang.lesson02.utils.JdbcUtils;

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

public class TestUpdate {
    public static void main(String[] args) {

        Connection conn = null;
        Statement st = null;
        ResultSet rs = null;

        try {
            conn = JdbcUtils.getConnection();  //获取数据库连接
            st = conn.createStatement();      //获得sql的执行对象
            String sql = "update users set `name` = 'wang_sky' where id = 4";

            int i = st.executeUpdate(sql);
            if (i > 0) {
                System.out.println("更新成功!");
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {

            JdbcUtils.release(conn, st, rs);
        }
    }
}

4. 查询

package com.wang.lesson02;

import com.wang.lesson02.utils.JdbcUtils;

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

public class TestSelect {
    public static void main(String[] args) {

        Connection conn = null;
        Statement st = null;
        ResultSet rs = null;

        try {
            conn = JdbcUtils.getConnection();  //获取数据库连接
            st = conn.createStatement();      //获得sql的执行对象
            String sql = "select * from users where id = 2";

            rs = st.executeQuery(sql);  //查询完毕会返回一个结果集

            while (rs.next()) {
                System.out.println(rs.getString("name"));
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {

            JdbcUtils.release(conn, st, rs);
        }
    }
}

7. ResultSet

查询的结果集:封装了所有的查询结果

获得指定的数据类型

resultSet.getObject();  //在不知道列类型的情况下使用
//如果知道列的类型就使用指定的类型
resultSet.getString();  
resultSet.getInt();
resultSet.getFloat();
resultSet.getDate();
...

遍历,指针

resultSet.beforeFirst();    //移动到最前面
resultSet.afterLast();      //移动到最后面
resultSet.next();           //移动到下一个数据
resultSet.previous();       //移动到前一行
resultSet.absolute(row);    //移动到指定行(row)

8. 释放资源

//6.释放连接
resultSet.close();
statement.close();
connection.close();		//耗资源,用完关掉

9. SQL注入的问题

sql存在漏洞,会被攻击导致数据泄露

本质:SQL会被拼接or

package com.wang.lesson02;

import com.wang.lesson02.utils.JdbcUtils;

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

public class SQLInject {
    public static void main(String[] args) {
        //login("lisi", "123456");
        login(" 'or '1=1", "' or '1=1");
    }

    //登陆业务
    public static void login(String username, String password) {

        Connection conn = null;
        Statement st = null;
        ResultSet rs = null;
        try {
            conn = JdbcUtils.getConnection();
            st = conn.createStatement();

            //SQL
            //select * from users where `name` = 'lisi' and `password` = '123456';
            //select * from users where `name` = '' or '1=1' and `password` = '' or '1 = 1';
            //上面语句中'' or '1 = 1'为null 或 true,保证永远为真
            String sql = "select * from users where `name` = '"
                    + username + "' and `password` = '" + password
                    + "'";

            rs = st.executeQuery(sql);

            while (rs.next()){
                System.out.println(rs.getString("name"));
                System.out.println(rs.getString("password"));
                System.out.println("=========================");
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            JdbcUtils.release(conn, st, rs);
        }
    }
}

你可能感兴趣的:(JDBC)