• MySQL 数据库 JDBC编程


    目录

    什么是JDBC编程???

    JDBC使用步骤

    插入

    修改

    删除

    查询


    什么是JDBC编程???

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

    JDBC优势:

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

    JDBC使用步骤

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

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

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

    1. //设置url(网址)
    2. ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSL=false");
    3. //设置用户名
    4. ((MysqlDataSource)dataSource).setUser("root");
    5. //设置密码
    6. ((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连接时,只需要修改实例化的一小段代码就可以,可扩展性高.

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

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

    • 构建sql ,创建statement对象用来保存要执行的sql
    1. //用字符串构造sql语句 完成数据库插入操作
    2. String sql = "insert into student values (?,?)";
    3. //用statement对象 来描述一个sql语句 sql语句是..... 与.....(dataSource描述与哪个数据库
    4. // 建立连接-->connection 对象也保存这个数据库服务器的数据源 然后返回给statement对象)数据库连接
    5. 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
    1. //通过executeUpdate 执行sql语句 同时返回要执行的行数
    2. int n = statement.executeUpdate();
    3. System.out.println("n = " + n);//打印要执行的行数

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

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

    这里的7 就是要返回的 

    • 处理结果集

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

    • 释放资源(关闭资源)

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

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

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

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

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

    插入

    • sql语句这里插入的值可以用 ? 占位符表示 ,然后后面使用preparedStatement对象调用方法来设置要插入的值 (比如 statement.setInt(),statement.setString());
    • 对于执行sql语句 插入(insert),(修改)update,delete(删除) 调用的是statement对象的executeUpdate方法  而对于查询select 方法来说调用的是executeQuery()方法
    • 释放资源要先释放后打开的资源然后依次往外释放
    1. public static void main(String[] args) throws SQLException {
    2. //操作数据库就要连接数据库服务器 ->就要描述数据库服务器的位置
    3. //创建数据源 - >用来描述数据库服务器的位置
    4. DataSource dataSource = new MysqlDataSource();
    5. //需要设置 url(网址(网络协议 ip 地址 数据库名)) user(用户名) password(密码)
    6. //jdbc:mysql:--->协议
    7. //127.0.0.1 -->ip地址
    8. //3306 -->数据库服务器默认端口号
    9. //java -->数据库名
    10. //characterEncoding=utf8 ---->设置字符集为utf8
    11. //useSSL=false -->表示不加密
    12. //这里向下转型的原因是 dataSource接口,在次换数据库操作只需修改实例化代码
    13. //而MysqlDataSource 只针对Mysql类型,再次换数据库操作 需要修改所有为MysqlDataSource的地方
    14. ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSL=false");
    15. //设置用户名
    16. ((MysqlDataSource)dataSource).setUser("root");
    17. //设置密码
    18. ((MysqlDataSource)dataSource).setPassword("123456");
    19. //接下来建立与数据库建立连接
    20. //调用dataSource的getConnection建立连接 返回给一个connection的对象
    21. Connection connection = dataSource.getConnection();//-->这里要throws数据库异常
    22. //输入要插入表中的信息
    23. Scanner scan = new Scanner(System.in);
    24. System.out.println("请输入你要插入的用户名 id : ");
    25. int id = scan.nextInt();
    26. Scanner scan1 = new Scanner(System.in);
    27. System.out.println("请输入你要插入的用户名 name : ");
    28. String name = scan1.nextLine();
    29. //用字符串构造sql语句 完成数据库插入操作
    30. String sql = "insert into student values (?,?)";
    31. //用statement对象 来描述一个sql语句 sql语句是..... 与.....(dataSource描述与哪个数据库
    32. // 建立连接-->connection 对象也保存这个数据库服务器的数据源 然后返回给statement对象)数据库连接
    33. PreparedStatement statement = connection.prepareStatement(sql);
    34. //将输入的要插入的数据 设置到sql中
    35. statement.setInt(1,id);
    36. statement.setString(2,name);
    37. //执行sql语句
    38. //通过executeUpdate 执行sql语句 同时返回要执行的行数
    39. int n = statement.executeUpdate();
    40. System.out.println("n = " + n);//打印要执行的行数
    41. //释放连接资源
    42. //从后往前释放 --> 先释放里面的 在释放外面的
    43. statement.close();
    44. connection.close();
    45. }

    修改

    • sql语句这里插入的值可以用 ? 占位符表示 ,然后后面使用preparedStatement对象调用方法来设置要插入的值 (比如 statement.setInt(),statement.setString());
    • 对于执行sql语句 插入(insert),(修改)update,delete(删除) 调用的是statement对象的executeUpdate方法  而对于查询select 方法来说调用的是executeQuery()方法
    • 释放资源要先释放后打开的资源然后依次往外释放
    1. public class UpdateJDBC {
    2. public static void main(String[] args) throws SQLException {
    3. DataSource dataSource = new MysqlDataSource();
    4. ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSL=false");
    5. ((MysqlDataSource)dataSource).setUser("root");
    6. ((MysqlDataSource)dataSource).setPassword("123456");
    7. //输入信息
    8. Scanner scan = new Scanner(System.in);
    9. System.out.println("请输入你要修改的id :");
    10. int id = scan.nextInt();
    11. Scanner scan1 = new Scanner(System.in);
    12. System.out.println("请输入你要修改的名字 : ");
    13. String name = scan1.nextLine();
    14. //建立连接
    15. Connection connection = dataSource.getConnection();
    16. //构建sql
    17. String sql = "update student set name = ? where id = ?";
    18. PreparedStatement statement = connection.prepareStatement(sql);
    19. statement.setString(1,name);
    20. statement.setInt(2,id);
    21. int n = statement.executeUpdate();
    22. System.out.println("n = " + n);
    23. //释放连接资源
    24. statement.close();
    25. connection.close();
    26. }
    27. }

    删除

    1. public class DeleteJDBC {
    2. public static void main(String[] args) throws SQLException {
    3. DataSource dataSource = new MysqlDataSource();
    4. ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSL=false");
    5. ((MysqlDataSource)dataSource).setUser("root");
    6. ((MysqlDataSource)dataSource).setPassword("123456");
    7. //建立连接
    8. Connection connection = dataSource.getConnection();
    9. //输入信息
    10. Scanner scan = new Scanner(System.in);
    11. System.out.println("请输入你要删除的id ");
    12. int id = scan.nextInt();
    13. //构建sql语句
    14. String sql = "delete from student where id = ?";
    15. PreparedStatement statement = connection.prepareStatement(sql);
    16. statement.setInt(1,id);
    17. int n = statement.executeUpdate();
    18. System.out.println("n = "+ n);
    19. statement.close();
    20. connection.close();
    21. }
    22. }

    查询

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

    • 执行sql时调用的是executeQuery()方法,不再是向增删改那样返回的是执行的行数,因为我们要查询嘛,返回的是一张临时表,我们用resultSet来接收这个临时表 ->就相当于"迭代器";
    • 使用resultSet调用get方法得到每一行的列的值
    • 通过调用resultSet的next()方法使移动到下一行.
    • 最后打开了三个资源 resultSet ,statement,connection,我们都要释放资源.
    1. public class SelectJDBC {
    2. public static void main(String[] args) throws SQLException {
    3. DataSource dataSource = new MysqlDataSource();
    4. ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSL=false");
    5. ((MysqlDataSource)dataSource).setUser("root");
    6. ((MysqlDataSource)dataSource).setPassword("123456");
    7. Connection connection = dataSource.getConnection();
    8. String sql = "select * from student";
    9. PreparedStatement statement = connection.prepareStatement(sql);
    10. //返回一个临时表
    11. ResultSet resultSet = statement.executeQuery();
    12. //要查询这个临时表 我们可以把这个resultSet 当做一个 "迭代器" ->利用它来遍历这个临时表
    13. while(resultSet.next()){
    14. int id = resultSet.getInt("id");
    15. String name = resultSet.getString("name");
    16. System.out.println("用户id :"+ id + "用户名 : " + name);
    17. }
    18. //释放资源
    19. resultSet.close();
    20. statement.close();
    21. connection.close();
    22. }
    23. }

  • 相关阅读:
    阿里云通义千问开源两款语音基座模型分别是SenseVoice和CosyVoice
    递归——深度优先搜索(DFS)——以滑雪问题为例(自顶而下)
    Allegro中导入中文或者logo操作指导
    Java集合类(笔记)
    Go语言入门【8】函数
    代碼隨想錄算法訓練營|第四十一天|第九章 动态规划 理论基础 、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯。刷题心得(c++)
    spark on yarn-cluster在生产环境 部署 spark 任务, 同时支持读取外部可配置化文件
    三、Maven-单一架构案例(搭建环境:辅助功能,业务功能:登录)
    Java基础知识:字符串和字符的加操作与自增自减运算符(笔记)
    Spring 当中的Bean 作用域
  • 原文地址:https://blog.csdn.net/m0_61210742/article/details/125882030