jdbc2

版权声明:本文为博主原创文章,转载请注明出处. https://blog.csdn.net/qq_34548401/article/details/84947673

JDBC API

  • java.sql.DriverManager用来装载驱动程序,获取数据库连接。
  • java.sql.Connection完成对某一指定数据库的连接
  • java.sql.Statement在一个给定的连接中作为SQL执行声明的容器,他包含了两个重要的子类型。
  • Java.sql.PreparedSatement 用于执行预编译的sql声明
  • Java.sql.CallableStatement用于执行数据库中存储过程的调用
  • java.sql.ResultSet对于给定声明取得结果的途径
  • 两种思想
    • 面向接口编程的思想
    • ORM思想
      • sql是需要结合列名和表的属性名来写。注意起别名。
  • 两种技术
    • JDBC元数据:ResultSetMetaData
    • PropertyUtils:通过Class.newInstance()创建一个对象,通过此类将查询到的列值装配给创建的对象。

Driver 接口

  • java.sql.Driver 接口是所有 JDBC 驱动程序需要实现的接口。这个接口是提供给数据库厂商使用的,不同数据库厂商提供不同的实现
  • 在程序中不需要直接去访问实现了 Driver 接口的类,而是由驱动程序管理器类(java.sql.DriverManager)去调用这些Driver实现
  • Oracle的驱动:oracle.jdbc.driver.OracleDriver
  • mySql的驱动: com.mysql.jdbc.Driver
  • 创建数据库联接步骤
    0. 创建数据库,或已存在数据库
    1. 创建项目
    2. 创建lib文件夹
    3. 把jar和源码文件复制到lib目录下
    4. 把jar添加到项目build-path中
    5. 新建测试类
    6. 反射加载驱动程序的的类模板,会自动的完成自我注册到驱动程序管理器中
      1. 静态语句块中自动注册到驱动管理器中
      2. 程序主要通过驱动类静态方法来实现连接数据库的功能
    7. 通过驱动程序管理器可以获取到连接对象–需要提供url,和用户名,密码
    8. 关闭连接

Connection类

  • 通过连接来访问数据库
  • 建立连接(Connection)
  • 可以调用 DriverManager 类的 getConnection() 方法建立到数据库的连接
  • User,password可以用“属性名=属性值”方式告诉数据库;////配置文件
  • JDBC URL 用于标识一个被注册的驱动程序,驱动程序管理器通过这个 URL选择正确的驱动程序,从而建立到数据库的连接。
  • JDBC URL的标准由三部分组成,各部分间用冒号分隔。
    • jdbc:子协议:子名称
    • 协议:JDBC URL中的协议总是jdbc
    • 子协议:子协议用于标识一个数据库驱动程序
    • 子名称:一种标识数据库的方法。子名称可以依不同的子协议而变化,用子名称的目的是为了定位数据库提供足够的信息。包含主机名(对应服务端的ip地址),端口号,数据库名
  • 注:mysql的Driver类加载类模板时会自动注册到驱动管理器

DriverManager 类

  • 方式一:加载 JDBC 驱动需调用 Class 类的静态方法 forName(),向其传递要加载的 JDBC 驱动的类名 Class.forName(“com.mysql.jdbc.Driver”);
  • 方式二:DriverManager 类是驱动程序管理器类,负责管理驱动程序
    • DriverManager.registerDriver(com.mysql.jdbc.Driver);
    • 通常不用显式调用 DriverManager 类的 registerDriver() 方法来注册驱动程序类的实例,因为 Driver 接口的驱动程序类都包含了静态代码块,在这个静态代码块中,会调用 DriverManager.registerDriver() 方法来注册自身的一个实例
  • url :统一资源定位器
  • url组成
    • 主协议:子协议,目标主机地址,端口号,数据库名

Statement

  • 一旦获取了连接对象Connection, 还不可以执行SQL, 必须要从Connection连接对象获取执行体对象Statement才能执行SQL
  • Connection connection = getConnection(); //获取连接对象
  • Statement state = connection.createStatement(); //获取执行体对象
  • int n = state.executeUpdate(“insert,update,delete…”); //执行体对象执行sql语句
  • 其中n是执行增删改后对表产生的影响的记录数
  • 如果执行一个查询则返回一个ResultSet结果集对象. 通过访问ResultSet对象来访问数据
  • Statement执行对象问题
    • sql注入风险,//对用户的输入的数据没有检查
    • 效率低

preparedStatement类

  • 预编译执行体,Statement子类

  • 屏蔽了statement类没有

  • 可以通过调用 Connection 对象的 preparedStatement() 方法获取 PreparedStatement 对象

  • PreparedStatement 接口是 Statement 的子接口,它表示一条预编译过的 SQL 语句

  • PreparedStatement 对象所代表的 SQL 语句中的参数用问号(?)来表示,调用 PreparedStatement 对象的 setXxx() 方法来设置这些参数.setXxx() 方法有两个参数,第一个参数是要设置的 SQL 语句中的参数的索引(从 1 开始),第二个是设置的 SQL 语句中的参数的值

  • 对比:

    • 代码的可读性和可维护性.
    • PreparedStatement 能最大可能提高性能:
      • DBServer会对预编译语句提供性能优化。因为预编译语句有可能被重复调用,所以语句在被DBServer的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中就会得到执行。
      • 在statement语句中,即使是相同操作但因为数据内容不一样,所以整个语句本身不能匹配,没有缓存语句的意义.事实是没有数据库会对普通语句编译后的执行代码缓存.这样每执行一次都要对传入的语句编译一次.
      • (语法检查,语义检查,翻译成二进制命令,缓存)
    • PreparedStatement 可以防止 SQL 注入
  • 连接数据库、操作表的步骤

    • 注册驱动 (只做一次)
    • 建立连接(Connection)
    • 创建执行SQL的语句(PreparedStatement )
    • 执行语句
    • 处理执行结果(ResultSet)
    • 释放资源
Connection conn = null;
PreparedStatement st=null;
ResultSet rs = null;
try {
    //获得Connection
    //创建PreparedStatement 
    //处理查询结果ResultSet
}catch(Exception e){
    e.printStackTrance();
} finally {
    //释放资源ResultSet,    
    // PreparedStatement ,
    //Connection
}
  • 释放资源
    • 释放ResultSet, PreparedStatement ,Connection。
    • 数据库连接(Connection)是非常稀有的资源,用完后必须马上释放,如果Connection不能及时正确的关闭将导致系统宕机。Connection的使用原则是尽量晚创建,尽量早的释放。

resultSet结果集

  • next 检测当前游标是否有无行,有返回true,没有返回false.
  • 通过调用 PreparedStatement 对象的 excuteQuery() 方法创建该对象
  • ResultSet 对象以逻辑表格的形式封装了执行数据库操作的结果集,ResultSet 接口由数据库厂商实现
  • ResultSet 对象维护了一个指向当前数据行的游标,初始的时候,游标在第一行之前,可以通过 ResultSet 对象的 next() 方法移动到下一行
  • ResultSet 接口的常用方法:
    - boolean next()
    - getString()
    - …
  • 关于ResultSet的说明
    1. 查询需要调用 Statement 的 executeQuery(sql) 方法,查询结果是一个 ResultSet 对象
    2. 关于 ResultSet:代表结果集
      • ResultSet: 结果集. 封装了使用 JDBC 进行查询的结果.
      • 调用 Statement 对象的 executeQuery(sql) 可以得到结果集.
      • ResultSet 返回的实际上就是一张数据表. 有一个指针指向数据表的第一条记录的前面.
    3. 可以调用 next() 方法检测下一行是否有效. 若有效该方法返回 true, 且指针下移. 相当于Iterator 对象的 hasNext() 和 next() 方法的结合体
    4. 当指针指向一行时, 可以通过调用 getXxx(int index) 或 getXxx(int columnName) 获取每一列的值.
      • 例如: getInt(1), getString(“name”)
    5. ResultSet 当然也需要进行关闭.

猜你喜欢

转载自blog.csdn.net/qq_34548401/article/details/84947673