1-JDBC概述
Java 中的数据存储技术
在Java中,数据库存取技术可分为如下几类:
1. JDBC直接访问数据库
2. JDO技术
3. 第三方O/R工具,如Hibernate, mybatis 等
JDBC是java访问数据库的基石,JDO, Hibernate等只是更好的封装了JDBC。
JDBC(Java Database Connectivity)是一个独立于特定数据库管理系统、通用的SQL数据库存取和操作的公共接口(一组API),定义了用来访问数据库的标准Java类库,(java.sql,javax.sql)使用这个类库可以以一种标准的方法来方便地访问数据库资源
- JDBC为访问不同的数据库提供了一种统一的途径,为开发者屏蔽了一些
细节问题。 - JDBC的目标是使Java程序员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统,这样就使得程序员无需对特定的数据库系统的特点有过多的了解,从而大大简化和加快了开发过程。
JDBC体系结构
JDBC接口(API)包括两个层次:
- 面向应用的API:Java API,抽象接口,供应用程序开发人员使用(连接数据库,执行SQL语句,获得结果)。
- 面向数据库的API:Java Driver API,供开发商开发数据库驱动程序用。
JDBC程序访问数据库步骤
2-获取数据库连接
1. Driver 接口
- java.sql.Driver 接口是所有 JDBC 驱动程序需要实现的接口。这个接口是提供给数据库厂商使用的,不同数据库厂商提供不同的实现
- 在程序中不需要直接去访问实现了 Driver 接口的类,而是由驱动程序管理器类(java.sql.DriverManager)去调用这些Driver实现
2.1 Oracle的驱动:oracle.jdbc.driver.OracleDriver
2.2 mySql的驱动: com.mysql.jdbc.Driver
加载与注册 JDBC 驱动
方式一:加载 JDBC 驱动需调用 Class 类的静态方法 forName(),向其传递要加载的 JDBC 驱动的类名
Class.forName(“com.mysql.jdbc.Driver”);
方式二:DriverManager 类是驱动程序管理器类,负责管理驱动程序
DriverManager.registerDriver(com.mysql.jdbc.Driver);
通常不用显式调用 DriverManager 类的 registerDriver() 方法来注册驱动程序类的实例,因为 Driver 接口的驱动程序类都包含了静态代码块,在这个静态代码块中,会调用 DriverManager.registerDriver() 方法来注册自身的一个实例。
建立连接(Connection)
- 可以调用 DriverManager 类的 getConnection() 方法建立到数据库的连接
- User,password可以用“属性名=属性值”方式告诉数据库;
- JDBC URL 用于标识一个被注册的驱动程序,驱动程序管理器通过这个 URL 选择正确的驱动程序,从而建立到数据库的连接。
- JDBC URL的标准由三部分组成,各部分间用冒号分隔。
4.1 jdbc:子协议:子名称
4.2 协议:JDBC URL中的协议总是jdbc
4.3 子协议:子协议用于标识一个数据库驱动程序
4.4 子名称:一种标识数据库的方法。子名称可以依不同的子协议而变化,用子名称的目的是为了定位数据库提供足够的信息。包含主机名(对应服务端的ip地址),端口号,数据库名。
3-使用Statement操作数据表的弊端
访问数据库
- 数据库连接被用于向数据库服务器发送命令和 SQL 语句,在连接建立后,需要对数据库进行访问,执行 sql 语句。
在 java.sql 包中有 3 个接口分别定义了对数据库的调用的不同方式:
SQL 注入攻击
2. SQL 注入是利用某些系统没有对用户输入的数据进行充分的检查,而在用户输入数据中注入非法的 SQL 语句段或命令(如:SELECT user, password FROM user_table WHERE user=‘a’ OR 1 = ’ AND password = ’ OR ‘1’ = ‘1’) ,从而利用系统的 SQL 引擎完成恶意行为的做法
3. 对于 Java 而言,要防范 SQL 注入,只要用PreparedStatement(从Statement扩展而来) 取代 Statement 就可以了。
4-使用PreparedStatement
- 可以通过调用 Connection 对象的 preparedStatement() 方法获取PreparedStatement 对象。
- PreparedStatement 接口是 Statement 的子接口,它表示一条预编译过的SQL 语句。
- PreparedStatement 对象所代表的 SQL 语句中的参数用问号(?)来表示,调用 PreparedStatement 对象的 setXxx() 方法来设置这些参数. setXxx() 方法有两个参数,第一个参数是要设置的 SQL 语句中的参数的索引(从 1 开 始),第二个是设置的 SQL 语句中的参数的值。
释放资源
- 释放ResultSet, Statement,Connection。
- 数据库连接(Connection)是非常稀有的资源,用完后必须马上释放,如果Connection不能及时正确的关闭将导致系统宕机。Connection的使用原则是尽量晚创建,尽量早的释放。
ResultSet
- 通过调用 PreparedStatement 对象的 excuteQuery() 方法创建该对象
- ResultSet 对象以逻辑表格的形式封装了执行数据库操作的结果集,ResultSet 接口由数据库厂商实现
- ResultSet 对象维护了一个指向当前数据行的游标,初始的时候,游标在第一行之前,可以通过ResultSet 对象的 next() 方法移动到下一行
- ResultSet 接口的常用方法:
boolean next()
getString()
…
关于ResultSet的说明
- 查询需要调用Prepared Statement 的 executeQuery() 方法,查询结果是一个 ResultSet对象。
- 关于 ResultSet:代表结果集
2.1 ResultSet: 结果集. 封装了使用 JDBC 进行查询的结果。
2.2 调用 PreparedStatement 对象的 executeQuery() 可以得到结果集.
2.3 ResultSet 返回的实际上就是一张数据表. 有一个指针指向数据表的第一条记录的前面。
3.可以调用 next() 方法检测下一行是否有效. 若有效该方法返回 true, 且指针下移. 相当于Iterator 对象的 hasNext() 和 next() 方法的结合体。
4.当指针指向一行时, 可以通过调用 getXxx(int index) 或 getXxx(int columnName) 获取每一列的值。
例如: getInt(1), getString("name")
5.ResultSet 当然也需要进行关闭。
ResultSetMetaData 类
使用PreparedStatement实现批量插入
批量处理JDBC语句提高处理速度
jdbc连接mysql实例