JDBC(Java DataBase Connectivity)

  • JDBC(Java DataBase Connectivity)
    • 简介
      • Java和数据库之间的一个桥梁,是一个规范而不是一个实现,能够执行SQL语句。它由一组用Java语言编写的类和接口组成。本质上就是一堆的API. 由于操作步骤复杂 , 将来会被框架封装.
        • 各种不同类型的数据库都有相应的实现
    • JDBC编程步骤
      • 1.装载相应数据库的JDBC驱动并进行初始化
        • 导入专用的jar包(不同的数据库需要的jar包不同)
          • 导包步骤: 右键project->property->java build path->libaries->add external jars
            • mysql-connector-java-5.0.8-bin.jar包
        • 初始化驱动
          • 初始化驱动类com.mysql.jdbc.Driver,该类就在 mysql-connector-java-5.0.8-bin.jar中
      • 2.建立JDBC和数据库之间的Connection连接
        • 这里需要提供:数据库服务端的IP地址:127.0.0.1 (这是本机,如果连接其他电脑上的数据库,需填写相应的IP地址)
          • 数据库的端口号: 3306 (mysql专用端口号)
          • 数据库名称 exam(根据你自己数据库中的名称填写)
          • 编码方式 UTF-8
          • 账号 root
          • 密码 admin(如果你在创建数据库的时候没有使用默认的账号和密码,请填写自己设置的账号和密码)
            • Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/exam?characterEncoding=UTF-8", "root", "admin");
        • 因为在进行数据库的增删改查的时候都需要与数据库建立连接,所以可以在项目中将建立连接写成一个工具方法,用的时候直接调用即可:
      • 3.创建Statement或者PreparedStatement接口,执行SQL语句
        • Statement接口创建之后,可以执行SQL语句,完成对数据库的增删改查。其中 ,增删改只需要改变SQL语句的内容就能完成,然而查询略显复杂。在Statement中使用字符串拼接的方式,该方式存在句法复杂,容易犯错等缺点,所以Statement在实际过程中使用的非常的少.
          • 字符串拼接方式的SQL语句是非常繁琐的,中间有很多的单引号和双引号的混用,极易出错。
        • PreparedStatement也是用来执行sql语句的与创建Statement不同的是,需要根据sql语句创建PreparedStatement。除此之外,还能够通过设置参数,指定相应的值,而不是Statement那样使用字符串拼接。
          • 注意
            • 使用PreparedStatement时,他的SQL语句不再采用字符串拼接的方式,而是采用占位符的方式。“?”在这里就起到占位符的作用。这种方式除了避免了statement拼接字符串的繁琐之外,还能够提高性能。每次SQL语句都是一样的,java类就不会再次编译,这样能够显著提高性能,后面需要用到PreparedStatement接口创建的pstmt的set方法给占位符进行赋值。
              • 注意一点,这里的参数索引是从1开始的。增删改都使用pstmt.executeUpdate();语句进行SQL语句的提交 ,下文的查询会有所不同,请注意。
            • 在添加的过程的,如果添加的数据量比较大的话,可以用批量添加。 PreparedStatement接口提供了相应的批量操作的方法。查询操作使用executeQuery()进行更新。其他相关的问题放在第四步(处理和显示结果)中解释。
      • 4.处理和显示结果
        • 执行查询语句,并把结果集返回给集合ResultSet
          • ResultSet rs = s.executeQuery(sql);
        • 利用While(ResultSet.next()){…}循环将集合ResultSet中的结果遍历出来。
        • ResultSet.getXX(); 这里的get方法的括号里面可以填属性值,如下图代码中的course_id,还可以填该属性在数据表中的列号,从1开始编码,例如:course_id在我的t-courses数据表中位于第一列,所以执行get方法的时候,我除了代码段中写法外,还可以这样写int courseId = rs.getInt(1);但是不推荐使用列号的这种方式,因为一段数据表中个属性值得顺序发生变化,就会导致这里出错,而使用属性名则不会出现这样的问题。
      • 5.释放资源
        • 在JDBC编码的过程中我们创建了Connection、ResultSet等资源,这些资源在使用完毕之后是一定要进行关闭的。关闭的过程中遵循从里到外的原则。因为在增删改查的操作中都要用到这样的关闭操作,为了使代码简单,增加其复用性,这里我将这些关闭的操作写成一个方法和建立连接的方法一起放到一份工具类中。
    • SQL注入攻击
      • 概述
        • 在SQL语句拼接参数的过程中,出现了特殊的符号# ,改变了SQL的语义
      • 解决方案
        • 使用新的传输器PreparedStatement 代替现在的传输器Statement
        • 解决了SQL攻击的问题,把特殊符号#当做一个普通的字符在用,不会当做注释来解析.
    • Statement和PreparedStatement的异同及优缺点
      • 同:两者都是用来执SQL语句的
      • 异:PreparedStatement需要根据SQL语句来创建,它能够通过设置参数,指定相应的值,不是像Statement那样使用字符串拼接的方式。
        • Statement:父接口+SQL攻击+SQL语句需要手动拼接参数(复杂)+低效
        • PreparedStatement:子接口,用了父接口的所有功能,还进行了优化+解决了SQL攻击+SQL骨架(简化了)+高效
      • PreparedStatement的优点:
        • 1、其使用参数设置,可读性好,不易记错。在statement中使用字符串拼接,可读性和维护性比较差。
        • 2、其具有预编译机制,性能比statement更快。
        • 3、其能够有效防止SQL注入攻击。
    • execute和executeUpdate的区别
      • 相同点:二者都能够执行增加、删除、修改等操作。
      • 不同点:
        • 1、execute可以执行查询语句,然后通过getResult把结果取出来。executeUpdate不能执行查询语句。
        • 2、execute返回Boolean类型,true表示执行的是查询语句,false表示执行的insert、delete、update等。executeUpdate的返回值是int,表示有多少条数据受到了影响。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值