jdbc基础

本文详细介绍了如何使用JDBC完成数据库的创建、更新、读取和删除(CURD)操作,包括技术分析、操作步骤、代码示例及SQL注入攻击的预防方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

案例1-通过jdbc完成单表的curd操作:

CURD即创建(create),更新(update),读取(retrieve),删除(delete)

需求:

 对分类表完成操作.

技术分析:

 jdbc

///////////////////////

jdbc:

 java操作数据库.jdbc是oracle公司指定的一套规范(一套接口)

 驱动:jdbc的实现类.由数据库厂商提供.

 我们就可以通过一套规范操作不同的数据库了(多态)

 jdbc作用:

  连接数据库

 发送sql语句

  处理结果

jdbc操作步骤:★

1.数据库和表

 2.创建一个项目

3.导入驱动jar包

4.编码:

注册驱动

 获取连接

 编写sql

创建预编译的语句执行者

设置参数

执行sql

处理结果

 释放资源

import java.sql.Connection;

        import java.sql.DriverManager;

        import java.sql.ResultSet;

        import java.sql.SQLException;

        import java.sql.Statement;

class DBConnection {

    public static void main(String[] args) {

        String driver = "com.mysql.jdbc.Driver";

//localhost指本机,也可以用本地ip地址代替,3306为MySQL数据库的默认端口号,“user”为要连接的数据库名

        String url = "jdbc:mysql://localhost:3306/user";

//填入数据库的用户名跟密码

        String username = "test";

        String password = "test";

        String sql = "select * from user";//编写要执行的sql语句,此处为从user表中查询所有用户的信息

        try {

            Class.forName(driver);//加载驱动程序,此处运用隐式注册驱动程序的方法

        } catch (ClassNotFoundException e) {

            e.printStackTrace();

        }

        try {

            Connection con = DriverManager.getConnection(url, username, password);//创建连接对象

            Statement st = con.createStatement();//创建sql执行对象

            ResultSet rs = st.executeQuery(sql);//执行sql语句并返回结果集

            while (rs.next())//对结果集进行遍历输出

            {

                System.out.println("username: " + rs.getString(1));//通过列的标号来获得数据

                System.out.println("useradd: " + rs.getString("useradd"));//通过列名来获得数据

                System.out.println("userage: " + rs.getInt("userage"));

            }

//关闭相关的对象 从最外层 开始关闭

            if (rs != null) {

                try {

                    rs.close();

                } catch (SQLException e) {

                    e.printStackTrace();

                }

            }

            if (st != null) {

                try {

                    st.close();

                } catch (SQLException e) {

                    e.printStackTrace();

                }

            }

            if (con != null) {

                try {

                    con.close();

                } catch (SQLException e) {

                    e.printStackTrace();

                }

            }

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }

}

 初始化数据库和表:
 

 CREATE DATABASE day07;

  USE day07;

  create table category(

   cid varchar(20) primary key,

   cname varchar(20)

  );

  insert into category values('c001','电器');

  insert into category values('c002','服饰');

  insert into category values('c003','化妆品');

  insert into category values('c004','书籍');

 IDE(集成开发环境)打开之后

1.修改字符集 utf-8

  2.新建 java项目

  3.使用的jdk为自己的jdk 不用使用内置

 使用junit单元测试

  要求:

   1.方法是public void xxx(){}

   2.在方法上添加 @Test

   3.在@Test 按下 ctrl+1(快速锁定错误)

   4.在方法上右键 run as -->junit 就可以执行方法了

jdbc-api详解:

 所有的包 都是 java.sql 或者 javax.sql

 DriverManager:管理了一组jdbc的操作 类

  常用方法:

   了解:注册驱动

    static void registerDriver(Driver driver) :

     通过查看 com.mysql.jdbc.Driver的源码 有如下代码

       static {

       try {

        java.sql.DriverManager.registerDriver(new Driver());//这段代码我们已经写过

       } catch (SQLException E) {

        throw new RuntimeException("Can't register driver!");

       }

      }

     驱动注册了两次.我们只需要将静态代码块执行一次,类被加载到内存中会执行静态代码块,并且只执行一次.

     现在只需要将类加载到内存中即可:

      方式1:

       ★Class.forName("全限定名");//包名+类名 com.mysql.jdbc.Driver

      方式2:

       类名.class;

      方式3:

       对象.getClass();

   掌握:获取连接

    static Connection getConnection(String url, String user, String password)

     参数1:告诉我们连接什么类型的数据库及连接那个数据库

        协议:数据库类型:子协议 参数

      mysql: jdbc:mysql://localhost:3306/数据库名称

      oracle: jdbc:oracle:thin@localhost:1521@实例

     参数2:账户名 root

     参数3:密码

 (了解)Driver:java.sql 接口 驱动

 Connection:连接 接口

  常用方法:

   获取语句执行者:

    (了解)Statement createStatement() :获取普通的语句执行者 会出现sql注入攻击问题

当应用程序使用输入内容来构造动态sql语句以访问数据库时,会发生sql注入攻击。如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生sql注入。sql注入可能导致攻击者使用应用程序登陆在数据库中执行命令。相关的SQL注入可以通过测试工具pangolin进行。如果应用程序使用特权过高的帐户连接到数据库,这种问题会变得很严重。在某些表单中,用户输入的内容直接用来构造动态sql命令,或者作为存储过程的输入参数,这些表单特别容易受到sql注入的攻击。而许多网站程序在编写时,没有对用户输入的合法性进行判断或者程序中本身的变量处理不当,使应用程序存在安全隐患。这样,用户就可以提交一段数据库查询的代码,根据程序返回的结果,获得一些敏感的信息或者控制整个服务器,于是sql注入就发生了。

    ★PreparedStatement prepareStatement(String sql) :获取预编译语句执行者(可以防止sql注入攻击)

    (了解)CallableStatement prepareCall(String sql):获取调用存储过程的语句执行者

   了解:

    setAutoCommit(false) :手动开启事务

    commit():提交事务

    rollback():事务回滚

 Statement:语句执行者 接口

 PreparedStatement:预编译语句执行者 接口

  常用方法:

  设置参数:

    setXxx(int 第几个问号,Object 实际参数);

     常见的方法:

       setInt

       setString

       setObject

   执行sql:

     ResultSet executeQuery() :执行 r 语句 返回值:结果集

     int executeUpdate() :执行cud 语句 返回值:影响的行数

 ResultSet:结果集 接口

  执行查询语句之后返回的结果

   常用方法:

    boolean next():判断是否有下一条记录,若有返回true且将光标移到下一行,若没有呢则返回false

     光标一开始处于第一条记录的上面

    获取具体内容

     getXxx(int|string)

      若参数为int :第几列

      若参数为string:列名(字段名)

例如:

      获取cname的内容可以通过

       getString(2)

       getString("cname")

     常用方法:

      getInt

      getString 也可以获取int值

      getObject 可以获取任意

///////////////////////

常见的配置文件格式:

 1.properties

  里面内容的格式 key=value

 2.xml

/////////////////

若我们的配置文件为properties,并且放在src目录下.

我们可以通过 ResourceBundle工具快速获取里面的配置信息

 使用步骤:

  1.获取ResourceBundle 对象:

   static ResourceBundle getBundle("文件名称不带后缀名")

  2.通过ResourceBundle 对象获取配置信息

   String getString(String key) :通过执行key获取指定的value

////////////////////

案例2-通过连接池(数据源)优化我们的操作.

需求:

 用jdbc的时候,每操作一次都需要获取连接(创建)用完之后把连接释放掉了(销毁),通过连接池来优化curd操作.

技术分析:

 连接池

////////////////////

连接池概述:

 管理数据库的连接,

 作用:

  提高项目的性能.

 就是在连接池初始化的时候存入一定数量的连接,用的时候通过方法获取,不用的时候归还连接即可.

 所有的连接池必须实现一个接口 javax.sql.DataSource接口

 获取连接方法:

  Connection getConnection()

 归还连接的方法就是以前的释放资源的方法.调用connection.close();

自定义一个连接池(理解思想)

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值