Java基础之JDBC

JDBC概述

1.JDBC为访问不同的数据库提供了统一的接口,为使用者屏蔽了细节问题。
2.Java程序员使用JDBC,可以连接任何提供了JDBC驱动程序的数据库系统,从而完成对数据库的各种操作。
3.JDBC的基本原理

Java基础之JDBC

JDBC带来的好处

1.JDBC带来的好处示意图
2.说明,JDBC是Java提供一套用于数据库操作的接口API,JAVA程序员只需要面向这套接口编程即可,不同的数据库厂商需要针对这套接口,提供不同实现

Java基础之JDBC

JDBC程序编写步骤

1.注册驱动-加载Driver类
2.获取连接-得到Conection
3.执行增删改查-发送SQL给mysql执行
4.释放资源-关闭相关连接

package com.hspedu.jdbc;

import com.mysql.jdbc.Driver;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/**
 * @author 山河与you皆无恙
 * 这是第一个jdbc程序完成简单的操作
 */

public class Jdbc01 {
    public static void main(String[] args) throws SQLException {
        //1.注册驱动
        Driver driver = new Driver();
        //2.得到连接
        //1.说明:jdbc:mysql:// 规定好表示协议,通过jdbc的方式连接mysql
        //2.localhost 主机,可以是ip地址,
        //3.3306 表示mysql监听的端口
        //4.db02 连接到 mysql dbms 的哪个数据库
        //5.mysql的连接本质就是前面学过的socket连接
        String url = "jdbc:mysql://localhost:3306/db02";
        //将用户名和密码放到properties
        Properties properties = new Properties();
        properties.setProperty("user","root");//用户
        properties.setProperty("password","root");//密码
        Connection connect = driver.connect(url, properties);
        //3.执行sql
        //String sql = "insert into actor values(null,'刘德华','男','1970-11-11','110')";
        //String sql ="update actor set name='周星驰' where id =1";
        String sql ="delete from actor where id =1";
        //
        Statement statement = connect.createStatement();
        int rows = statement.executeUpdate(sql);//如果是dml语句,返回的就是影响行数
        System.out.println(rows>0"成功":"失败");
        //4.关闭连接资源
        statement.close();
        connect.close();
    }
}

获取数据库连接5种方式

  • 提示:
    1.mysql驱动5.1.6可以无需Class.forName(“com.mysql.jdbc.Driver”)
    2.从jdk1.5以后使用了jdbc4,不再需要显示调用Class.forName()注册驱动而是自动调用驱动jar包下的META-INFservicejava.sql.Driver文本类中的类名称去注册
    3.建议还是写上Class.forName(com.mysql.jdbc.Driver),更加明确。
package com.hspedu.jdbc;

import com.mysql.jdbc.Driver;
import org.junit.Test;

import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

/**
 * @author 山河与you皆无恙
 * 分析java的五种方式
 */

public class JdbcConn {
    //方式1
    @Test
    public void connect01() throws SQLException {
        //1.注册驱动
        Driver driver = new Driver();
        String url = "jdbc:mysql://localhost:3306/db02";
        //将用户名和密码放到properties
        Properties properties = new Properties();
        properties.setProperty("user","root");//用户
        properties.setProperty("password","root");//密码
        Connection connect = driver.connect(url, properties);
        System.out.println(connect);
    }
    //方式2
    @Test
    public void connect02() throws ClassNotFoundException, IllegalAccessException, InstantiationException, SQLException {
        //使用反射创建Driver类 动态加载更加灵活,减少依赖性
        Class<?> aClass = Class.forName("com.mysql.jdbc.Driver");
        Driver driver = (Driver) aClass.newInstance();
        String url = "jdbc:mysql://localhost:3306/db02";
        //将用户名和密码放到properties
        Properties properties = new Properties();
        properties.setProperty("user","root");//用户
        properties.setProperty("password","root");//密码
        Connection connect = driver.connect(url, properties);
        System.out.println("方式2="+connect);
    }
    //方式3 使用 DriverManager 替代driver
    @Test
    public void connect03() throws ClassNotFoundException, IllegalAccessException, InstantiationException, SQLException {
        //使用反射创建Driver类 动态加载更加灵活,减少依赖性
        Class<?> aClass = Class.forName("com.mysql.jdbc.Driver");
        Driver driver = (Driver) aClass.newInstance();
        String url = "jdbc:mysql://localhost:3306/db02";
        String user = "root";
        String password = "root";
        DriverManager.registerDriver(driver);//注册driver驱动
        Connection connection = DriverManager.getConnection(url, user, password);
        System.out.println("方式3="+connection);
    }
    //方法4:使用Class.forName 自动完成注册驱动,简化代码
    //这种方式获取连接是使用的最多的,推荐使用
    @Test
    public void connect04() throws ClassNotFoundException, IllegalAccessException, InstantiationException, SQLException {
        //使用反射创建Driver类 动态加载更加灵活,减少依赖性
        Class<?> aClass = Class.forName("com.mysql.jdbc.Driver");
        /*
            1.静态代码块,在类加载时,会执行一次
            2.DriverManager.registerDriver(new Driver()
            2.因此注册driver的工作已经完成
        static {
            try {
                DriverManager.registerDriver(new Driver());
            } catch (SQLException var1) {
                throw new RuntimeException("Can't register driver!");
            }
        }
        */

        Driver driver = (Driver) aClass.newInstance();
        String url = "jdbc:mysql://localhost:3306/db02";
        String user = "root";
        String password = "root";
        Connection connection = DriverManager.getConnection(url, user, password);
        System.out.println("方式4="+connection);
    }
    //方式5,在方式4的基础上改进,增加配置文件,让连接mysql更加灵活
    @Test
    public void connect05() throws SQLException, ClassNotFoundException, IOException {
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\mysql.properties"));
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
        String url = properties.getProperty("url");
        String driver = properties.getProperty("driver");
        Connection connection = DriverManager.getConnection(url, user, password);
        Class.forName(driver);
        System.out.println("方式5="+connection);
    }
}

ResultSet

1.表示数据库结果集的数据表,通常通过执行查询数据库的语句生成
2.ResultSet对象保持一个光标指向当前的数据行。最初,光标位于第一行之前
3.next方法将光标移动到下一行,并且由于在ResultSet对象中没有更多行时返回false,因此可以在while循环中使用循环来遍历结果集

package com.hspedu.jdbc.resultset_;

import org.junit.Test;

import java.io.FileInputStream;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;

/**
 * @author 山河与you皆无恙
 */

@SuppressWarnings({"all"})
public class ResultSet_ {
    public static void main(String[] args) throws IOException, SQLException, ClassNotFoundException {
        //通过properties对象获取配置文件信息
        Properties properties = new Properties();
        properties.load(new FileInputStream("D:/idea_workspace/chapter25/src/mysql.properties"));
        //获取相关的值
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
        String url = properties.getProperty("url");
        String driver = properties.getProperty("driver");
        //1.注册驱动
        Class.forName(driver);
        //2.得到连接
        Connection connection = DriverManager.getConnection(url, user, password);
        //3.得到statement
        Statement statement = connection.createStatement();
        //4.组织sql
        String sql = "select id, name,sex,borndate from actor";
        ResultSet resultSet = statement.executeQuery(sql);
        //5.使用while取出数据
        while (resultSet.next()){
            String id = resultSet.getString(1);
            String name = resultSet.getString(2);
            String sex = resultSet.getString(3);
            String date = resultSet.getString(4);
            System.out.println("id"+"t"+name+"t"+sex+"t"+date+"t");
        }
        //6.关闭连接
        resultSet.close();
        statement.close();
        connection.close();
        System.out.println("方式5="+connection);
    }

    @Test
    public void m1() throws IOException, ClassNotFoundException, SQLException {
        //通过properties对象获取配置文件信息
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\mysql.properties"));
        //获取相关的值
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
        String url = properties.getProperty("url");
        String driver = properties.getProperty("driver");
        //1.注册驱动u
        Class.forName(driver);
        //2.得到连接
        Connection connection = DriverManager.getConnection(url, user, password);
        //3.得到statement
        Statement statement = connection.createStatement();
        //4.组织sql
        String sql = "select id, name,sex,borndate from actor";
        ResultSet resultSet = statement.executeQuery(sql);
        //5.使用while取出数据
        while (resultSet.next()){
            String id = resultSet.getString(1);
            String name = resultSet.getString(2);
            String sex = resultSet.getString(3);
            String date = resultSet.getString(4);
            System.out.println("id"+"t"+name+"t"+sex+"t"+date+"t");
        }
        //6.关闭连接
        resultSet.close();
        statement.close();
        connection.close();
        System.out.println("方式5="+connection);
    }
}

Statement

1.Statement对象用于执行静态SQL语句并返回其生成结果的对象
2.在连接建立后,需要对数据库进行访问,执行命令或是SQL语句,可以通过

  • Statement[存在SQL注入问题]
  • PreparedStatement[预处理]
  • CableStatement[存储过程]

3.Statement对象执行SQL语句存在SQL注入风险
4.SQL注入是利用某些系统没有对用户输入的数据进行充分的检查,而在用户输入数据中注入非法的SQL语句段或命令,恶意攻击数据库
5.要防范SQL注入,只要用PreparedStatement取代Statement就可以了

PreparedStatement

1.PreparedStatement执行SQL语句中的参数用(?)表示,调用PreparedStatement对象的setXXX()方法来设置这些参数,setXXX()方法有两个参数,第一个参数是要设置的SQL语句中的索引(从1开始),第二个是设置的SQL语句中参数的值
2.调用executeQuery(),返回ResultSet对象
3.调用executeUpdate():执行更新,包括增、删、修改

package com.hspedu.jdbc.preparedstatement_;

import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;
import java.util.Scanner;

/**
 * @author 山河与you皆无恙
 */

@SuppressWarnings({"all"})
public class PreparedStatement_ {
    public static void main(String[] args) throws Exception {
        Scanner scanner = new Scanner(System.in);
        //让用户输入管理员名和密码
        System.out.println("请输入管理员的名字");//next():当接收到空格或者'表示结束
        String admin_name =scanner.nextLine();//如果需要看到SQL注入,这里需要用nextLine
        System.out.println("请输入管理员的密码");
        String admin_password =scanner.nextLine();
        //通过properties对象获取配置文件信息
        Properties properties = new Properties();
        properties.load(new FileInputStream("D:/idea_workspace/chapter25/src/mysql.properties"));
        //获取相关的值
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
        String url = properties.getProperty("url");
        String driver = properties.getProperty("driver");
        //1.注册驱动
        Class.forName(driver);
        //2.得到连接
        Connection connection = DriverManager.getConnection(url, user, password);
        //3.得到statement
        //3.1.组织sql Sql语句的?就相当于占位符
        String sql = "select  name,pwd from admin where name =? and pwd =?";
        //3.3preparedStatement对象实现了PreparedStatement接口的实现类的对象
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
       //3.3给?赋值
        preparedStatement.setString(1,admin_name);
        preparedStatement.setString(2,admin_password);
        //这里执行 executeQuery(),不要再写sql
        ResultSet resultSet = preparedStatement.executeQuery();
        if (resultSet.next()){//如果查询到一条记录,则说明该管理存在
            System.out.println("恭喜,登录成功");
        }else {
            System.out.println("对不起,登录失败");
        }
        //关闭连接
        resultSet.close();
        preparedStatement.close();
        connection.close();
    }
}
package com.hspedu.jdbc.preparedstatement_;

import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.util.Properties;
import java.util.Scanner;

/**
 * @author 山河与you皆无恙
 */

@SuppressWarnings({"all"})
public class PreparedStatementDML_ {
    public static void main(String[] args) throws Exception {
        Scanner scanner = new Scanner(System.in);
        //让用户输入管理员名和密码
        System.out.println("请输入管理员的名字");//next():当接收到空格或者'表示结束
        String admin_name =scanner.nextLine();//如果需要看到SQL注入,这里需要用nextLine
        System.out.println("请输入管理员的密码");
        String admin_password =scanner.nextLine();
        //通过properties对象获取配置文件信息
        Properties properties = new Properties();
        properties.load(new FileInputStream("D:/idea_workspace/chapter25/src/mysql.properties"));
        //获取相关的值
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
        String url = properties.getProperty("url");
        String driver = properties.getProperty("driver");
        //1.注册驱动
        Class.forName(driver);
        //2.得到连接
        Connection connection = DriverManager.getConnection(url, user, password);
        //3.得到statement
        //3.1.组织sql Sql语句的?就相当于占位符
        //添加记录
        String sql = "insert into admin values (?,?)";
        //String sql = "update admin set  pwd=? where name =?";
        //String sql = "delete  from admin  where name =?";
        //String sql = "select  name,pwd from admin where name =? and pwd =?";
        //3.3preparedStatement对象实现了PreparedStatement接口的实现类的对象
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
       //3.3给?赋值
       // preparedStatement.setString(1,admin_password);
        preparedStatement.setString(1,admin_name);

        //执行 dml语句使用 executeUpdate()
        int rows = preparedStatement.executeUpdate();
        System.out.println(rows>0?"执行成功":"执行失败");

        //关闭连接
        preparedStatement.close();
        connection.close();
    }
}

预处理好处

1.不再使用+拼接sql语句,减少语法错误
2.有效解决了SQL注入问题
3.大大减少了编译次数,效率较高

视频链接:
https://www.bilibili.com/video/BV1zv41157NC?spm_id_from=333.999.0.0


Java基础之JDBC


原文始发于微信公众号(itmkyuan):Java基础之JDBC

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/39541.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!