所谓的JDBC,其实是Sun公司为我们定义的一套接口。这套接口定义了如何连接和操作关系型数据库,而这套接口的具体实现则交给那些数据库厂商来实现。这些数据库厂商实现JDBC接口的jar包就被称为数据库驱动。
常见数据库驱动jar包的名称如下,这个在后面连接数据库时需要用到
好了,理解了JDBC到底是什么后下一步自然是学习如何在我们的java的程序中连接和操作数据库了。而通过java程序来连接数据库可以总结为如下几个步骤。
慢着,讲那个之前首先介绍几个JDBC中的核心API,在这里有个印象即可:
接口或类 |
功能 |
---|---|
DriverManager | 管理和注册驱动;获得数据库连接对象 |
Connection | 一个实例代表一个数据库连接对象,可以产生Statement对象 |
Statement | 执行SQL语句并取得执行结果的对象 |
PreparedStatement | 执行预编译SQL并取得结果的对象 |
ResultSet | SQL语句执行得到的结果集 |
好了,对于上面的API看一眼就好,后面会逐一详细的介绍,下面开始介绍如何连接数据库并执行我们的操作。
(1)导入驱动jar包
(2)加载和注册驱动
(3)获得数据库连接对象
(4)获得SQL语句执行对象
(5)执行SQL获得执行结果
首先,第一步是获得驱动jar包,这个驱动可以前往各数据库厂商官网下载,下载下来之后可以放在我们项目中lib文件夹下(这个文件夹通常用来放我们项目依赖的各种jar包),好了,到了这里我默认你已经下载好驱动并放在lib文件夹下了。
下一步就是加载和注册驱动,这里以mysql数据库为例,那么只需要在程序中添加下面这一行代码即可(完整代码在文末给出)。
Class.forName("com.mysql.jdbc.Driver"); //注册和加载驱动
然后就是获得数据库连接对象了,说它之前我们先来理解了一下DriverManager类。
DriverManager类实际上是一个管理我们驱动jar包的工具类,除此之外,我们还需要依赖它来获得数据库连接。它的两个核心方法如下:
Connection getConnection(String url,String user,String password);
Connection getConnection(String url,Properties info); //这两个方法都是用来获得数据库连接对象
两个方法的第一个参数都是数据库的url地址,以本机数据库为例
Connection conn = null;
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/databaseName","userName","password");
获得数据库连接对象之后,我们就可以获得执行SQL语句的Statement的对象了,实际上Statement是Sun公司提供的一个接口,它定义了一些方法由数据库厂商去实现,通过这些方法就可以执行我们的SQL语句了。
Statement connection.createStatement(); //获得执行静态SQL的Statement对象
PreparedStatement connection.prepareStatement(String sql);//获得执行预编译SQL的PreparedStatement对象
PreparedStatement接口是继承于Statement接口的一个子接口,它与Statement接口的区别就是它具有执行预编译SQL语句的能力,所谓的预编译SQL其实是指在SQL语句中对于某些数据可以用 ?来表示占位符,后面可以再传入实际的参数。它可以很好的帮助我们防止SQL注入问题。关于SQL注入问题,这里就不讨论了,不知道的小伙伴记得去Google,后面会以例子详细说明。
而我们最常见的SQL无非是两种,查询记录或修改记录(增、删、改),对于这两种操作Sun公司定义了很多方法,最常用的两个如下:
ResultSet executeQuery(String sql);
int executeUpdate(String sql);
对于查询操作,它返回的结果是一个结果集ResultSet,就等同于数据库中的一张表。它的结果集被放在ResultSet中,对于这个接口,小伙伴们可以把它理解为数据库中的一张表,而我们通过查询把数据放在这个ResultSet中过后再通过定义在它之上的方法取出数据。如:
ResultSet set = statement.executeQuery("select * from person");//取出person表中的所有数据
/*
可以理解为ResultSet最开始时有一个指针指向表中第一条记录的前一行,每次经过调用next()方法
让指针往下移动一行
*/
while(set.next()){
/*
ResultSet提供了很多的getXxx()方法来从中获取数据,建议小伙伴自己查看API看一下,此处是
通过getString()方法来获取person表某一条记录中name字段的值
*/
String name = set.getString("name");
}
对于更新操作,其返回的结果代表影响的记录行数。
下一步就是释放资源了,释放资源的原则是先打开的后关闭。通常是ResultSet -> Statement -> Connection
完整的的数据库操作过程已经讲解完毕,小伙伴们还是需要自己经常阅读其规范和API以达到熟练使用的程度。