
javaJDBC
一、概述
JDBC:java 数据库 连接。。。
因为不同的数据库内部处理数据的方式不同,各个厂商提供的访问接口也不一样,为了提高程序的可移植性就有了这套API。JDBC要求数据库厂商按照统一规范来提供数据库驱动(就是java给出接口,实现类由数据库厂商给)。应用程序就可以通过这套API连接到关系型数据库并执行SQL语句。在程序中由JDBC和具体的数据库驱动联系,就不需要直接和底层的数据库进行交互,可以做到替换底层数据库的时候代码 基本上 不变。
程序 <---> JDBC <---> 数据库
二、常用接口、类
前面简单介绍一下JDBC的来处,接下去来看一下JDBC本身。
JDBCAPI主要位于 java.sql 包,主要内容有五个接口和一个类。
1、Driver 接口
Driver接口是所有JDBC驱动程序都必须实现的接口,是提供给数据库厂商使用的。就没了...
这里补充一下驱动程序:
在概述里说了驱动程序其实就是由数据库厂商写好的实现类,我们在使用JDBC写程序的时候要根据不同的数据库使用不同的驱动,数据库厂商会把实现类打包成jar包给我们使用。
用mysql驱动说明一下,下载连接:MySQL :: Download Connector/J下载解压缩出来就可以看见mysql-connector-j-8.0.31.jar这个玩意。Driver.class就在这里面。
2、DriverManager 类
用于注册JDBC驱动、创建与数据库的连接。
这个类里面由俩比较重要的静态方法:
static void registerDriver(Driver driver) //注册驱动程序。
static Connection getConnection(String url, String user, String password) //连接数据库
通常情况下一般不会使用registerDriver来注册驱动,因为驱动程序本身就有向DriverManager注册Driver实例的静态代码块,用它就相当于实例化了俩Driver对象。所以推荐使用Class类的静态方法forName来实现。
3、Connection接口
代表java程序和数据库的连接对象,只有获得这个对象才能操作数据库,使用前面说的DriverManager 类里边的getConnection方法,连接成功就会返回Connection对象。
Connection对象也有一个重要的方法:
Statement createStatement() //创建一个Statement对象,用于将 SQL 语句发送到数据库执行并返回结果。
4、Statement接口
这个接口用于执行sql语句并返回结果。使用Connection对象的createStatement获得这个对象
常用的执行sql语句的方法如下:
boolean execute(String sql) //执行给定的 SQL 语句,该语句可能返回多个结果。
int executeUpdate(String sql) //执行INSERT 、 UPDATE或DELETE语句或不返回任何内容的 SQL 语句,返回内容是语句影响的记录数量
ResultSet executeQuery(String sql) //执行select语句,该语句返回单个表述查询结果的ResultSet对象。
5、PreparedStatement
Statement可以执行SQL语句,但是再实际的开发中要执行的语句大多数都不是写死的,所以就需要使用变量来拼接SQL语句,就容易造成你懂我懂大家懂的SQL注入,且使用Statement操作这些语句太繁琐了就有了PreparedStatement接口。
PreparedStatement是Statement的子接口,用于执行预编译的SQL语句。应用接口中的SQL语句可以使用占位符来代替参数,然后通过一些方法给参数赋值。
使用Statement的prepareStatement方法就可以获得一个PreparedStatement对象用于执行参数化SQL语句。
PreparedStatement prepareStatement(String sql)
6、ResultSet接口
ResultSet接口用于保存JDBC执行查询语句返回的结果集。这些结果集都封装再一个逻辑表格中。再ResultSet接口内部有一个指向表格数据行的指针,也叫游标。ResultSet对象初始化的时候指针再逻辑表格第一行之前,调用ResultSet对象的next方法指针就移动到下一行,知道下一行没有数据时就返回false。
这东西真的是一环套一环。。。。。。
三、JDBC的使用
使用JDBC有个通用的固定模式。
1、注册驱动
Class.forName("com.mysql.jdbc.Driver");
这里补充一个CLASSPATH的内容:
CLASSPATH就是一个JAVA虚拟机用来搜索class文件的一个环境变量。我们可以在环境变量里添加一个名为CLASSPATH的变量,值为以下形式:
必须包含当前目录,也就是 . !!!因为jvm会根据这个变量里的路径去搜你要使用的class文件,假如没有点就不包含当前目录,你运行当前目录下的文件时,jvm就找不到了。多个目录时,Windows下用分号分隔,Linux用冒号。
.;D:\path\java\就是你要用到的class文件的路径\;D:\path\也可以是zip或者jar文件的路径.jar
!但是不建议使用设置环境变量的形式来设置CLASSPATH,从JDK5开始,如果环境变量里没有CLASSPATH,java虚拟机就会自动搜索当前目录下的类文件,并且自动加载dt.jar和tools.jar里的类文件。
!!而且,Java运行文件的时候可以设置classpath,java --hep。
-cp <目录和 zip/jar 文件的类搜索路径>
-classpath <目录和 zip/jar 文件的类搜索路径>
--class-path <目录和 zip/jar 文件的类搜索路径>
使用 ; 分隔的, 用于搜索类文件的目录, JAR 档案
和 ZIP 档案列表。
!!!最后,再写代码时使用的编辑器都可以设置库文件目录。拿IDEA举例,在新建一个项目之后我们可以新建一个文件夹,然后再左上角的文件>项目结构>模块,把新建的目录标记为资源。然后把jar啥的丢进这个目录就好了。
再补充一点,向IDEA这种编辑器,再运行的时候都会设置使用-classpath这种选项设置当前项目的classpath。所以如果环境变量里面的CLASSPATH和它用的不一样还是会报错的。总结就是一句话,CLASSPATH,不设也罢。
2、DriverManager获取连接
Connection con = DriverManager.getConnection(String url,String dbuser,String dbpassword);
/*连接数据库的URL遵循特定的语法:
jdbc:数据库类型://数据库主机:端口/数据库库名
*/
//示例:
Connection con2 = DriverManager.getConnection("jdbc:mysql://192.168.86.130:3306/testdb","test","yyyy");
3、获取Statement对象
Statement stt = con.createStatement();
4、使用Statement执行SQL语句
stt.execute("show databases;")
5、使用ResuleSet处理结果
ResultSet rs = stt.executeQuery("select host,user from mysql.user;"); //上面的execute只是返回一个布尔型的值告诉你有没有执行成功,如果要拿到数据还得是ResultSet
这里说一下这个ResultSet对象的使用,我们前面介绍过它返回的是一张表,有一个指针最开始再表格的第一行之前,如果我们在mysql中执行上面的语句:
MariaDB [(none)]> select host,user from mysql.user;
+-----------+------+
| host | user |
+-----------+------+
| % | root |
| % | test |
| 127.0.0.1 | root |
| ::1 | root |
| localhost | root |
+-----------+------+
5 rows in set (0.00 sec)
中间这个就是查询出来的内容,所以我们就可以用一个循环,让指针向后走的同时取出它停留位置那行的数据。
while (rs.next()){
String host = rs.getString("host");
String user = rs.getString("user");
System.out.println(user+"@"+host);
}
/*结果
root@%
test@%
root@127.0.0.1
root@::1
root@localhost
*/
6、释放资源
到了这一步就是查询完毕调用对象的close()方法就好了。一般来说都是按照我们打开的顺序相反的关闭掉。也可以用一个异常处理在finnally里面统一关掉,这样能保证在出现异常的时候也能关闭资源。
四、总结
JDBC其实是很简单的一个内容,同时JDBC也是一个很牛逼的接口,在这篇文章里面只讲了最基础的内容,因为不想把一篇基础的文章写的太长所以有很多方法没写。剩下的可以等到要用的时候可以去java官方的api文档去查询,这东西没必要全部死记,我个人认为写代码,掌握思维更重要,至于其他的,多敲多看自然就会熟练,但是面试的话还是要多练练基本功的。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)