前序
持久化(persistence):把数据保存到可掉电式存储设备中以供之后使用。
大多数情况下,特别是企业级应用,数据持久化意味着将内存中的数据保存到硬盘上加以”固化”,而持久化的实现过程大多通过各种
关系数据库来完成。
持久化的主要应用是
将内存中的数据存储在关系型数据库中,当然也可以存储在磁盘文件、XML数据文件中。
这样在Java程序与数据库之间就需要建立连接。
在Java中,数据库存取技术可分为如下几类:
JDBC直接访问数据库(本文主要写的是这个)
JDO技术 第三方O/R工具,如Hibernate, ibatis 等
JDBC是java访问数据库的基石,JDO, Hibernate等只是更好的封装了JDBC。
JDBC
JDBC(Java Database Connectivity)是一个独立于特定数据库管理系统、通用的SQL数据库存取和操作的
公共接口(一组API),定义了
用来访问数据库的标准Java类库,(java.sql,javax.sql)使用这个类库可以以一种标准的方法、方便地访问数据库资源 JDBC为访问不同的数据库提供了一种统一的途径,为开发者屏蔽了一些细节问题。
JDBC的目标是使Java程序员
使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统,这样就使得程序员无需对特定的数据库系统的特点有过多的了解,从而大大简化和加快了开发过程。
各个厂商都会对JDBC接口提供相应的实现,这样我们只需要面向JDBC接口编程就可以连接不同的数据库,不需要关心具体连接的细节。
JDBC接口(API)包括两个层次:
面向应用的API:Java API,抽象接口,供应用程序开发人员使用(连接数据库,执行SQL语句,获得结果)。 我们主要面向这个API编程。
面向数据库的API:Java Driver API,供开发商开发数据库驱动程序用。数据库公司解决,我们只需要调用就可以了。
JDBC是sun公司提供一套用于数据库操作的接口,Java程序员只需要面向这套接口编程即可。不同的数据库厂商,需要针对这套接口,提供不同实现。不同的实现的集合,即为不同数据库的驱动。---面向接口编程(我们程序员只需要面向JDBC提供的接口编程就可以连接到数据库)
JDBC驱动程序
JDBC驱动程序:各个数据库厂商根据JDBC的规范制作的 JDBC 实现类的类库
JDBC驱动程序总共有四种类型:
第一类:JDBC-ODBC桥。
第二类:部分本地API部分Java的驱动程序。
第三类:JDBC网络纯Java驱动程序。
第四类:本地协议的纯 Java 驱动程序。
第三、四两类都是纯Java的驱动程序,因此,对于Java开发者来说,它们在性能、可移植性、功能等方面都有优势。
JDBC---API
JDBC API 是一系列的接口,它使得应用程序能够进行数据库联接,执行SQL语句,并且得到返回结果。
获取数据库连接
Driver 接口
java.sql.Driver 接口是所有 JDBC 驱动程序需要实现的接口。
这个接口是提供给数据库厂商使用的,不同数据库厂商提供不同的实现,我们在程序中不需要直接去访问实现了 Driver 接口的类,、
而是
由驱动程序管理器 类(java.sql.DriverManager)去调用这些Driver实现
常用的驱动
Oracle的驱动:oracle.jdbc.driver.OracleDriver
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() 方法建立到数据库的连接
数据库连接需要的参数:driverClass(驱动类),url(全球资源定位符),user(用户名),password(密码)
这些参数可以用“属性名=属性值”方式告诉数据库,
通用做法是在外边建一个专门放配置文件的.properties文件,放在工程目录下,在程序中获取
JDBC URL 用于标识一个被注册的驱动程序,驱动程序管理器通过这个 URL 选择正确的驱动程序,从而建立到数据库的连接。
JDBC URL的标准由三部分组成,各部分间用冒号分隔,
jdbc:子协议:子名称 协议:
JDBC URL中的协议总是jdbc
子协议:子协议用于标识一个数据库驱动程序
子名称:一种标识数据库的方法。(定位数据库)包含主机名(对应服务端的ip地址),端口号,数据库名
例如:
jdbc:mysql://localhost:3306/test
协议 子协议 子协议名称
对于 Oracle 数据库连接,采用如下形式: jdbc:oracle:thin:@localhost:1521:数据库名
对于 SQLServer 数据库连接,采用如下形式: jdbc:microsoft:sqlserver//localhost:1433;DatabaseName=sid
对于 MySQL 数据库连接,采用如下形式: jdbc:mysql://localhost:3306/数据库名
数据库连接代码:
driverClass = com.mysql.jdbc.Driver
url = jdbc:mysql://127.0.0.1:3306/company
user = root
password = 123456
/**
* 数据库连接:
* 2.右键bulid path
* 3.连接---反射加载驱动类
* 利用驱动管理器获取连接对象
*
* 利用反射加载类的时候需要类的全限定名称。
* mysql驱动类名: com.mysql.jdbc.Driver
* mysql url: jdbc:mysql://localhost:3306/数据库名
* 协议 子协议 主机号 端口号
*
这里为了方便直接将异常抛出,在实际应用中需要将异常处理,然后在finally中关闭流
* @throws Exception
*/
@Test
public void ConTest() throws Exception{
//Properties实际是一个map集合,键和值都是String型主要用于处理配置文件
//将配置信息利用以 属性 = 值的形式保存在一个文件中,然后利用Properties对象获取。
Properties properties = new Properties();
//通过配置文件获取参数
properties.load(new FileInputStream("jdbc.properties"));
//获取驱动类名 Properties利用key获取值value
String driverClass = properties.getProperty("driverClass");
//获取url
String url = properties.getProperty("url");
//获取用户名
String user = properties.getProperty("user");
//获取密码
String password = properties.getProperty("password");
//利用反射加载类,在类加载的时候自动完成驱动注册
Class.forName(driverClass);
//通过驱动管理器获取connection对象
Connection connection = DriverManager.getConnection(url, user, password);
System.out.println(connection);
connection.close();
}
Statement
一旦获取了连接对象Connection, 还不可以执行SQL,
必须要从Connection连接对象获取执行体对象Statement才能执行SQL
Connection connection = getConnection();
Statement state = connection.createStatement();
int n = state.executeUpdate(“insert,update,delete…”);
其中n是执行增删改后对表产生的影响的记录数 如果执行一个查询则返回一个ResultSet结果集对象.
SQL注入攻击