MySQL 数据库 JDBC编程

目录

什么是JDBC编程???

JDBC使用步骤

插入

修改

删除

查询


什么是JDBC编程???

JDBC又称为数据库连接池,是一种执行SQL语句的一套java的API.

JDBC优势:

  • Java语言访问数据库操作完全面向抽象接口编程
  • 开发数据库应用不用限定在特定数据库厂商的API
  • 程序的可移植性大大增强

JDBC使用步骤

  1. 创建数据源  建立数据库连接
  2. 构建sql ,创建statement对象用来保存要执行的sql
  3. 执行sql
  4. 处理结果集
  5. 释放(关闭)资源
  • 创建数据源 ,建立数据库连接
//操作数据库就要连接数据库服务器 ->就要描述数据库服务器的位置
//创建数据源 - >用来描述数据库服务器的位置
DataSource dataSource = new MysqlDataSource();

首先需要与数据库服务器建立连接,第一步就需要创建数据源--->主要用来表述数据库服务器所在位置,在JDBC中使用DataSource来创建数据源,DataSource是一个接口,而MysqlDataSource类实现了这个接口.

DataSource提供数据库连接池的支持,既然是池化技术,建立数据库连接可以复用.

//设置url(网址)
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSL=false");
//设置用户名
((MysqlDataSource)dataSource).setUser("root");
//设置密码
((MysqlDataSource)dataSource).setPassword("123456");
  • setUrl

jdbc:mysql : 代表协议名 ,告诉我们jdbc是用来连接MySQL用的

127.0.0.1 : 数据可以默认iP地址

3306 : 数据库服务器默认端口号

java  : 数据库名

characterEncoding=utf8 : 设置字符集为UTF8

useSSL=false : 代表不加密;

  • setUser

设置用户名 默认为root

  • setPassword

设置自己数据库的密码  --> 这里如果输入错误会报错

  • 为啥使用向下转型???  可不可以直接用datasourse 不用强转?

答案可以利用datasource不用强转,但是代码的可复用性,可扩展性就下降.

原因是直接使用datasource得到的数据元素mysqlDataSource数据源,如果后期更换其他数据库,需要将所有与mysqkDataSource有关的代码都需要进行修改,可扩展性极低.

如果使用mysqlDataSource将DataSource得到的数据源是DataSource类型,DataSource是通用的接口,未来更换任何关系型数据库(JDBC只能连接关系型数据库)使用JDBC连接时,只需要修改实例化的一小段代码就可以,可扩展性高.

//接下来建立与数据库建立连接
//调用dataSource的getConnection建立连接 返回给一个connection的对象
Connection connection = dataSource.getConnection();//-->这里要throws数据库异常

根据创建的DataSource数据源,通过调用DataSource的getConnection方法来与数据库服务器创建连接,将返回结果返回到connection这个对象中

  • 构建sql ,创建statement对象用来保存要执行的sql
//用字符串构造sql语句  完成数据库插入操作
String sql = "insert into student values (?,?)";

//用statement对象 来描述一个sql语句  sql语句是.....  与.....(dataSource描述与哪个数据库
// 建立连接-->connection 对象也保存这个数据库服务器的数据源 然后返回给statement对象)数据库连接
PreparedStatement statement = connection.prepareStatement(sql);

构建sql : 将SQL语句放到字符串中用sql变量保存 -->这样就构建好了一个sql语句

注意这里在构建sql时可以使用?->占位符 在创建完statement方法之后,可以利用statement来进行设置,下标从1开始.

PreparedStatement statement = connection.prepareStatement(sql);

这个statement对象描述这个sql语句是什么 ,将要与哪个数据库服务器建立连接,由于connection来自DataSource,而这里调用connection的方法就知道与刚才创建的数据源进行连接.

  • PreparedStatement

占位符不能使用多值

占位符 ?  下标从 1 开始

阻止常见sql注入攻击  --->(比如在构建SQL里把SQL语句写死)

参数化SQL查询

SQL预编译

性能比statement高

  • 执行sql
//通过executeUpdate 执行sql语句  同时返回要执行的行数
int n = statement.executeUpdate();
System.out.println("n = " + n);//打印要执行的行数

通过prepareStatement的executeUpdate 来执行对应的 insert ,update,delete方法,而如果想要select查询那秀需要调用prepareStatement的executeQuery方法

调用方法返回的是 要执行的行数

这里的7 就是要返回的 

  • 处理结果集

这里注意在执行select查询语句时需要进行处理结果集,由于select查询时返回的是一张临时表,通过resultSet类似于"迭代器",遍历这个临时表,通过这个resultSet的get方法来得到这个列的内容

  • 释放资源(关闭资源)

我们将网络分为有连接(接电话-->需要建立连接两个人才能进行沟通).

无连接(发微信->不需要建立连接)

而采用JDBC编程是使用有连接(我们第一步就是创建数据源),既然有连接就需要 关闭连接(如果不关闭连接 比如两个人打电话就会一直扣话费-->消耗资源),所以我们就要释放资源

//释放连接资源
//从后往前释放  --> 先释放里面的  在释放外面的
statement.close();
connection.close();

通过close()方法来关闭资源,注意这里要从后往前关闭资源,先打开的资源要先关闭,后打开的要后关闭.

插入

  • sql语句这里插入的值可以用 ? 占位符表示 ,然后后面使用preparedStatement对象调用方法来设置要插入的值 (比如 statement.setInt(),statement.setString());
  • 对于执行sql语句 插入(insert),(修改)update,delete(删除) 调用的是statement对象的executeUpdate方法  而对于查询select 方法来说调用的是executeQuery()方法
  • 释放资源要先释放后打开的资源然后依次往外释放
public static void main(String[] args) throws SQLException {
        //操作数据库就要连接数据库服务器 ->就要描述数据库服务器的位置
        //创建数据源 - >用来描述数据库服务器的位置
        DataSource dataSource = new MysqlDataSource();
        //需要设置 url(网址(网络协议 ip 地址 数据库名)) user(用户名) password(密码)
        //jdbc:mysql:--->协议
        //127.0.0.1 -->ip地址
        //3306 -->数据库服务器默认端口号
        //java -->数据库名
        //characterEncoding=utf8 ---->设置字符集为utf8
        //useSSL=false  -->表示不加密
        //这里向下转型的原因是  dataSource接口,在次换数据库操作只需修改实例化代码
        //而MysqlDataSource 只针对Mysql类型,再次换数据库操作 需要修改所有为MysqlDataSource的地方
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSL=false");
        //设置用户名
        ((MysqlDataSource)dataSource).setUser("root");
        //设置密码
        ((MysqlDataSource)dataSource).setPassword("123456");

        //接下来建立与数据库建立连接
        //调用dataSource的getConnection建立连接 返回给一个connection的对象
        Connection connection = dataSource.getConnection();//-->这里要throws数据库异常

        //输入要插入表中的信息
        Scanner scan = new Scanner(System.in);
        System.out.println("请输入你要插入的用户名 id : ");
        int id = scan.nextInt();
        Scanner scan1 = new Scanner(System.in);
        System.out.println("请输入你要插入的用户名 name : ");
        String name = scan1.nextLine();
        //用字符串构造sql语句  完成数据库插入操作
        String sql = "insert into student values (?,?)";

        //用statement对象 来描述一个sql语句  sql语句是.....  与.....(dataSource描述与哪个数据库
        // 建立连接-->connection 对象也保存这个数据库服务器的数据源 然后返回给statement对象)数据库连接
        PreparedStatement statement = connection.prepareStatement(sql);
        //将输入的要插入的数据 设置到sql中
        statement.setInt(1,id);
        statement.setString(2,name);
        //执行sql语句
        //通过executeUpdate 执行sql语句  同时返回要执行的行数
        int n = statement.executeUpdate();
        System.out.println("n = " + n);//打印要执行的行数

        //释放连接资源
        //从后往前释放  --> 先释放里面的  在释放外面的
        statement.close();
        connection.close();

    }

修改

  • sql语句这里插入的值可以用 ? 占位符表示 ,然后后面使用preparedStatement对象调用方法来设置要插入的值 (比如 statement.setInt(),statement.setString());
  • 对于执行sql语句 插入(insert),(修改)update,delete(删除) 调用的是statement对象的executeUpdate方法  而对于查询select 方法来说调用的是executeQuery()方法
  • 释放资源要先释放后打开的资源然后依次往外释放
public class UpdateJDBC {

    public static void main(String[] args) throws SQLException {
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("123456");

        //输入信息
        Scanner scan = new Scanner(System.in);
        System.out.println("请输入你要修改的id :");
        int id = scan.nextInt();
        Scanner scan1 = new Scanner(System.in);
        System.out.println("请输入你要修改的名字 : ");
        String name  = scan1.nextLine();

        //建立连接
        Connection connection = dataSource.getConnection();
        //构建sql
        String sql = "update student set name = ? where id = ?";

        PreparedStatement statement = connection.prepareStatement(sql);
        statement.setString(1,name);
        statement.setInt(2,id);

        int n = statement.executeUpdate();
        System.out.println("n = " + n);

        //释放连接资源
        statement.close();
        connection.close();
    }
}

删除

public class DeleteJDBC {

    public static void main(String[] args) throws SQLException {
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("123456");

        //建立连接
        Connection connection = dataSource.getConnection();

        //输入信息
        Scanner scan = new Scanner(System.in);
        System.out.println("请输入你要删除的id ");
        int id = scan.nextInt();


        //构建sql语句
        String sql = "delete from student where id = ?";
        PreparedStatement statement = connection.prepareStatement(sql);

        statement.setInt(1,id);

        int n = statement.executeUpdate();

        System.out.println("n = "+ n);

        statement.close();
        connection.close();
    }

}

查询

对于查询这里与前面的增删改不一样

  • 执行sql时调用的是executeQuery()方法,不再是向增删改那样返回的是执行的行数,因为我们要查询嘛,返回的是一张临时表,我们用resultSet来接收这个临时表 ->就相当于"迭代器";
  • 使用resultSet调用get方法得到每一行的列的值
  • 通过调用resultSet的next()方法使移动到下一行.
  • 最后打开了三个资源 resultSet ,statement,connection,我们都要释放资源.
public class SelectJDBC {

    public static void main(String[] args) throws SQLException {
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("123456");

        Connection connection = dataSource.getConnection();

        String sql = "select * from student";
        PreparedStatement statement = connection.prepareStatement(sql);

        //返回一个临时表
        ResultSet resultSet = statement.executeQuery();
        //要查询这个临时表 我们可以把这个resultSet 当做一个 "迭代器" ->利用它来遍历这个临时表
        while(resultSet.next()){
            int id = resultSet.getInt("id");
            String name = resultSet.getString("name");
            System.out.println("用户id :"+ id + "用户名 : " + name);
        }
        //释放资源
        resultSet.close();
        statement.close();
        connection.close();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值