Java学习日记3----JDBC

2023.3.29学习Java打卡

JDBC

JDBC(Java Databse Connectivity),Java-数据库连接,用Java语言操作数据库。

本质:是sun公司定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。

  • 使用JDBC步骤

    1. 导入驱动jar包
    2. 注册驱动
    3. 获取数据库的连接对象 Connection
    4. 定义sql语句
    5. 获取执行sql语句的对象Statement
    6. 执行sql,接收返回结果
    7. 处理结果
    8. 释放资源
  • DriverManager:驱动管理对象

    1. 功能:

      • 注册驱动:告诉程序该使用哪一个程序jar包

      • static void registerDriver(Driver driver):注册与给定的驱动程序DriverManager。
        写代码使用:Class.forName("com.mysql.cj.jdbc.Driver")
        #通过查看源码查看发现:在com.mysql.cj.jdbc.Driver类中存在静态代码块。
        
      • 注意:mysql5之后的驱动jar包可以省略注册驱动的步骤。

    2. 获取数据库连接

      • 方法:static Connection getConnection(String url, String user, String password)
        
      • 语法:jdbc:mysql://ip地址(域名) : 端口号 / 数据库名称

        注:若连接为本机mysql服务器,且其默认端口为3306,则url可简写为jdbc:mysql:///数据库名。

  • Connection:数据库连接对象

    1. 功能:

      • 获取执行sql的对象

        1.Statement createStatement()
        2.PrepareStatement prepareStatement(String sql)
        
      • 管理事务:

        1.开启事务:void setAutoCommit(boolean autoCommit):调用该方法设置参数为false,即开启事务。
        2.提交事务:void commit()
        3.回滚事务:void rollback()
        
  • Statement:执行sql的对象

    1. 执行sql:

      方法:

      (不常用)1.boolean execute(String sql):可以执行任意的sql
      *******2.int executeUpdate(String sql):执行DML(增insert,删delete,改update)语句,DDL(create,alter,drop)语句←---不常用。这个返回值为int,是影响的行数,可以通过这个返回值行数的值DML语句是否执行成功。
      *******3.ResultSet executeQuery(Strng sql):执行DQL(select查询)语句
      
    2. 练习:

  • ResultSet:结果集对象,封装

    1. next():游标向下移动一行,判断当前行是否是最后一行末尾,如果是,则返回false,如果不是则返回true。

    2. getxxx(参数)获取数据:

      • xxx:代表数据类型,如int getInt() 、 String getString()
      • 参数:
        1. Int:代表编号,从1开始,如getString(1)
        2. String:代表名称。如getDouble(”name“)
    3. 注意:

      • 使用步骤
        1. 游标向下移动一行

        2. 判断是否有数据

          while(rs.next()){
                          //获取数据
                          int id = rs.getInt(1);
                          String name = rs.getString("name");
                          int age = rs.getInt(3);
                          String email = rs.getString("email");
          
                          System.out.println(id + "---" + name + "---" + age + "---" + email);
                      }
          
        3. 获取数据

    4. 练习:

      • 查询demo02表的数据将其封装为对象,装载集合,返回,打印输出。
        1. 定义Demo类
        2. 定义方法 public List findAll(){}
        3. 实现方法 select * from demo01;
  • 抽取JDBC工具类:JDBCUtils

    • 目的:简化书写

    • 分析

      1. 注册驱动也抽取
      2. 抽取一个方法获取连接对象
        • 保证工具类的通用性,不传参。
        • 解决方法:定义配置文件(jdbc.properties),其中url=xxxx,user=xxx,password = xxx。
      3. 抽取方法释放资源
    • 练习:通过键盘录入用户名和密码,判断用户是否登陆成功

      select * from user where username = "xxx " and password = “xxx”

      如果这个sql有查询结果,则成功,反之则失败

      1. 创建数据库表user

        create table user(id int primary key auto_increment, username varchar(32), password varchar(32));
        insert into user values (null, '张三', '123');
        insert into user values (null, '李四', '1234');
        insert into user values (null, '王五', '12356');
        select * from user;
        
      2. 创建登录方法

      3. 接受输入数据,判断是否登录成功。

  • PrepareStatement:执行sql的对象

    1. sql注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接,会造成一些安全性问题。

      • 输入任意用户名,输入密码:a’ or ‘a’ = 'a

      • select * from user where username = 'dasjdja' and password = '
        a' or 'a' = 'a'
        
    2. 解决sql注入问题:使用PrepareStatement对象来解决

    3. 预编译的SQL:参数使用占位符?

    4. 步骤:

      • 导入驱动jar包
      • 注册驱动
      • 获取数据库的连接对象 Connection
      • 定义sql语句
        • 注意:sql的参数使用?作为占位符。如:select * from user where username = ? and password = ?;
      • 获取执行sql语句的对象PrepareStatement
        • Connection.prepareStatement(String sql)
      • 给?赋值:
        • 方法:setxxx(参数1,参数2)参数1:?的位置编号,从1开始;参数2:?的值。
      • 执行sql,接收返回结果,不需要传递sql语句了
      • 处理结果
      • 释放资源
    5. 注意:后期都会使用PreparedStatement来完成增删改查的所有操作

      • 可以防止SQL注入
      • 效率更高
  • JDBC控制事务:

    1. 事务:包含多个步骤的业务操作。如果这和业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败。
    2. 操作:
      • 开启事务
      • 提交事务
      • 回滚事务
    3. 使用Connection对象来管理事务
      • 开启事务:void setAutoCommit(boolean autoCommit)
        • 在执行sql之前开启事务,也就是在获取连接后就要开启。
      • 提交事务:void commit()
        • 当所有sql都执行完提交事务
      • 回滚事务:void rollback()
        • 在catch中回滚事务
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本文为AI自动生成,未进行人工编辑。 1. 第一天 今天是我在一家软件公司实习的第一天。在公司门口,我看到一个高大的胡子男子在等我。他是我的导师,名叫张老师。他带我参观了整个公司,介绍了公司的业务和发展历程。然后,他给我分配了一个任务,让我编写一个简单的Java程序。尽管任务很简单,我还是花了很长时间才完成它。我意识到我需要更多的实践经验和知识。 2. 第二天 今天,我继续学习Java编程语言,学习Java基础知识,如变量、数据类型、运算符和控制语句等。我还学习了面向对象编程的基础知识,如类、对象、封装、继承和多态等。我在跟随张老师完成了一个小项目,这让我更深入地了解了Java的编程语言和应用。 3. 第三天 今天,我开始学习Java的高级编程概念。我了解了Java的异常处理机制,包括如何捕获和处理异常。我还学习Java的集合框架,包括ArrayList、LinkedList、HashSet和HashMap等。我也学习Java的线程编程,包括如何创建和管理线程,并使用同步和互斥机制保证线程安全。 4. 第四天 今天,我学习Java的网络编程知识。我了解了如何使用Java Socket API建立客户端和服务器端网络连接,并进行数据传输。我还学习Java的GUI编程,包括如何使用Swing和AWT库创建GUI应用程序。我通过完成一个小项目,将学到的知识应用到实际项目中。 5. 第五天 今天,我开始学习Java Web编程。我了解了如何使用Java Servlet和Java Server Pages(JSP)技术开发Web应用程序,并使用Tomcat服务器部署和运行它们。我还学习Java数据库编程,包括如何使用Java Database Connectivity(JDBC)API连接和操作数据库。我通过完成一个小项目,将学到的知识应用到实际项目中。 6. 第六天 今天,我继续学习Java Web编程。我了解了如何使用Java框架,如Spring和Hibernate,来简化Web应用程序的开发和管理。我还学习了如何使用Java的XML编程技术,包括如何使用DOM和SAX解析XML文档。我通过完成一个小项目,将学到的知识应用到实际项目中。 7. 第七天 今天,我开始学习Java的安全编程知识。我了解了Java的安全机制,包括如何使用数字证书和SSL协议来保护网络通信。我还学习Java的加密和解密机制,包括如何使用对称加密和非对称加密技术来保护数据安全。我通过完成一个小项目,将学到的知识应用到实际项目中。 8. 第八天 今天,我学习了如何使用Java的开发工具和集成开发环境(IDE)。我了解了Eclipse和IntelliJ IDEA等常用的Java IDE,并学习了如何使用它们来开发Java应用程序。我还学习了如何使用Maven和Gradle等自动化构建工具来管理Java项目的依赖和构建过程。我通过完成一个小项目,将学到的知识应用到实际项目中。 9. 第九天 今天,我开始学习Java的优化和调试技术。我了解了如何使用Java虚拟机(JVM)的监视工具来诊断和解决Java应用程序的性能问题。我还学习了如何使用Java的调试工具来定位和修复Java应用程序中的错误。我通过完成一个小项目,将学到的知识应用到实际项目中。 10. 第十天 今天是我实习的最后一天。我感谢我的导师张老师,在他的帮助下我学到了很多关于Java编程的知识和技能。我还感谢我的同事们,他们对我的帮助和支持让我更好地适应公司的工作环境。在这个月的实习中,我学到了很多关于Java编程的知识和技能,并将这些知识应用到实际项目中。我相信这个实习经历将成为我未来职业生涯的宝贵资产。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值