Java JDBC的基础知识(一)
一、为什么引入JDBC
在学习JDBC之前,抛开它的概念,我先按照我的理解解释一下,为什么要引入JDBC。在我看来,引入JDBC跟我之前学过的引入JVM(Java虚拟机)有些相似之处。当然,关于JVM的具体知识我还没学,但是为啥用它我知道。JVM相当于在Java与各个平台创建一个"转换器",这样解决了Java跨平台性。这次,JDBC貌似又沿用了这种思想。
Java想要访问数据库,但是数据库的种类多啊,如果为了迎合每个数据库去做一套方案,那得累死。这时候,JDBC就出现了,他在Java与各大数据库之间被使用。
有了JDBC,向各种关系数据发送SQL语句就很容易了。程序员只需用JDBC API写一个程序就可向相应数据库发送SQL调用。同时,将Java语言和JDBC结合起来使程序员不必为不同的平台编写不同的应用程序,只须写一遍程序就可以让它在任何平台上运行,这也是Java语言“编写一次,处处运行”的优势。
二、JDBD的定义
摘自百度搜索:
JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序,同时,JDBC也是个商标名。
三、JDBC的工作原理
了解了为什么引入JDBC和其定义,接下来需要知道一些JDBD的工作原理,也就是说它是如何实现代码在基于JDBC的基础上,来成功访问数据库的。这点非常重要。可以看下面的图理解一下,纯属个人理解,如果有误感谢指正。
在理解JDBC在Java访问数据库的过程中所扮演的角色之后,就可以去码代码啦。
四、JDBC操作步骤
1.导Jar包
2.注册驱动(只做一次)。看到“只做一次”有没有回忆起静态属性,有这样的特点。
3.建立链接
4.创建执行语句
5.执行
6.处理结果
7.释放资源!(从小到大释放)
下面演示具体实现过程:
1.使用JDBC需要在工程中导入对应的jar包。在Eclipse下,在工程的图标上右击,选择”Properties”,在”Java Bulid Path”中选择”Add External JARs…”,选择下载并解压后获得的jar包。
加载之后,简单阅读了一下这个jar包的内容和启动程序的介绍:
public class Test1 { public static final String DRIVER = "com.mysql.jdbc.Driver"; public static void main(String[] args) { try { System.out.println(Class.forName(DRIVER)); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } //若能输出驱动的名称,代表配置好了
附加:
为什么调用Class.forName(),却没有newInstance(); ?
原因:Class.forName() 加载了指定类后,若类中有静态初始化器,JVM必然会执行该类的静态代码段,而JDBC的Driver类都是会有static代码块。
2.在完整的代码里演示整个过程
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class Test1 { // 第一步:Jar包中驱动类的名称设置为静态常量 public static final String DRIVER = "com.mysql.jdbc.Driver"; public static void main(String[] args) throws SQLException { // 第二步:注册驱动类,用到Class.forName,原理是通过类名,把类装在到虚拟机中。Class中的C要大写 try { System.out.println(Class.forName(DRIVER)); } catch (ClassNotFoundException e) { e.printStackTrace(); } // 第三步:建立连接 Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/t_employee", "root", "root"); /* * 注意:
* 1.这里Connection和DriverManager都需要导包,不要到mysql包,最好导SQL包,以后方便兼容; * 2.会抛出异常:throws SQLException,此时为了演示,先抛出; * 3.getConnection的参数未来会被配置到配置文件中,将来不会像我上面那样写的,尤其是第一个参数(url); * 4.第一参数中的t_employee,是具体数据库的名字,不是表名。
* 5.创建连接时需要用户名和密码; */ // 第四步:创建statement对象和执行语句(造车) Statement stm = conn.createStatement();// 需导包:import java.sql.Statement // 第五步:执行,返回结果集对象(车装完一箱东西,回来了) ResultSet rs = stm.executeQuery("select*from t_employee"); /* * 注意:
* 1.ResultSet需要导包:import java.sql.ResultSet; * 2.executeQuery()方法的参数是String sql; */ // 第六步:处理(结合数据库中的数据特点,用while循环输出) while (rs.next()) { System.out.print(rs.getInt("id") + "\t"); System.out.print(rs.getString("name") + "\t"); System.out.print(rs.getInt("age") + "\t"); System.out.println(rs.getInt("salary")); /* * 注意:
* 1.它是一列一列取的。比如id在第一列,name在第二列,取的时候可以把id和name换成1,2 * 但是,最好别这样做,防止数据库列数有变动,就糟糕了;
* 2.getInt、getString......取的时候,数据类型要对上; * 3.id、name、age....大小写无所谓 */ } // 第七步:释放资源(创建连接消耗很大,一定要关闭资源!!!) try { rs.close(); stm.close(); conn.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } /* * 注意: 这样关闭资源是有很大隐患的!!!!!!
* 比如,万一创建连接之后,哪段代码挂掉了,资源将不会被关闭。 * 这里只做JDBC操作步骤的简单演示,具体异常处理之后会继续介绍 */ } }