JDBC介绍
根据Oracle的声明,JDBC是一个注册了商标的术语,而并非Java Database Connectivity的首字母缩写,而是对ODBC(微软开创的标准数据库API)的致敬——《Java核心技术 卷Ⅱ》
JDBC和ODBC的核心思想:根据API编写的程序都可以与驱动管理器进行通信,而驱动管理器则通过驱动程序与实际的数据库进行通信。
JDBC的典型用法
三层应用模型将可视化再业务逻辑与原始数据中分离出来,这样我们可以在不同的客户端来访问相同的数据,运用相同的业务逻辑。
JDBC配置
1.驱动包
下载方法:
2.注册驱动器类
运行需要连接数据库的程序时,必须要在程序中注册驱动器。一般有以下几种方式。
-
最常用的方式
Class.forName("com.mysql.jdbc.Driver");
这行代码代表的意思是告诉JVM加载MySQL的Driver类,在JDBC规范中要求在加载前要向DriverManager注册,我们不难发现com.mysql.jdbc.Driver类中在静态代码块中注册过。
static { try { DriverManager.registerDriver(new Driver()); } catch (SQLException var1) { throw new RuntimeException("Can't register driver!"); } }
因此再平常的使用中只需要告诉Java虚拟机该找到驱动类并加载即可,不需要自己注册。
-
在程序中也可以向System添加属性:
System.setProperty("jdbc.driver","com.mysql.jdbc.Driver");
-
当我们需要在命令行中启动程序,而程序中没有注册驱动类的代码时,我们可以这么做
java -Djdbc.drivers=com.mysql.jdbc.Driver ProgrameName
3.连接到数据库
连接数据库时,必不可少的需要告诉DriverManager去连接,所以当我们调用DriverManager的静态方法
Connection getConnection(String url, String user, String password)
throws SQLException
我们提供三个参数:
- url,其中包括
主机名
,端口号
和数据库名称
。例如链接MySQL的URL就是:jdbc:mysql://DBhostname:3306/database
其中DBhostname为主机名,一般我们写IP;3306为MySQL的默认端口;database指的就是MySQL中创建的数据库名称。 - user指的是用于登陆数据库的用户名,如果没有设置就什么都不填。
- password,顾名思义就是用于登陆数据库的密码,没有也可以什么都不写。
在配置过程中可以直接写入接口中,好点的方法是把这三个参数设置为不变的常量,即用final static修饰词,当我们需要修改时方便修改。
在项目中更好的方式可以我们需要的属性放到xxx.properties资源文件中,用法就是首先new出java.util.Properties,再调用load(InputStream inStream),将打开的properties文件流传入。最后想拿什么属性调用getProperty()即可,当然如果需要设置参数时调用setProperty(String key, String value)传入键-值对。
JDBC操作
1.API
当我们连接到数据库时首先要拿到可以执行语句的载体Statement:Statement sta = conn.createStatement();
但有更好的是准备语句PrepareStatement psta = conn.prepareStatement()
减少对数据库连接资源的占用。
- 查询
查询数据库时可以调用statement.executeQuery()
,也可以调用execute不过二者的区别是前者当第一个结果是对象就返回结果集,当第一个结果是更新数就返回更新了多少行,后者返回boolean值只反应有没有结果。
结果集ResultSet每一次next()
就是一行结果,没有数据时就返回false。值得注意的是结果集中是从1开始计数。如果想拿到具体的值可以调用getString(),getDouble,getInt(),getBlob()
等分别拿到相应的值。 - 更新
更新,删除,增加数据更喜欢用statement.executeUpdate()
因为它返回的是int值表示多少行数据发生了变化,如果变化行数很大就调用statement.executeLargeUpdate()
。
2.元数据
JDBC可以拿到三类元数据:数据库,结果集和预备语句参数。
- 数据库的元数据直接从实例化的Connection对象中调用getMetaData()拿到DatabaseMetaData对象
DatabaseMetaData dbMetaData = conn.getMetaData();
可以拿到数据库的相关参数包括数据能打开的最多Statement数目及其包含的SQL语句字符长度。 - 结果集的元数据需要从结果集对象ResultSet中拿到
ResultSetMetaData rsMetaData = rs.getMetaData();
其中包含了大量的执行SQL语句后的结果信息,可以拿到列名,列内容。 - 预备语句元数据自然想到的就从预备语句对象中取
ResultSetMetaData sta = statement.getMetaData();
3.事物
这里的事物与数据库中的事物概念相同,都是把一个或多个SQL语句作为一个事物,在一组语句执行成功时commit,而当一个事物中有一个语句失败就rollback。
默认情况下,数据库处于自动提交模式,每执行一个SQL就被提交到数据库。一旦提交给数据库就无法回滚,所以在处理事物时,我们需要关闭这个功能:connection.setAutoCommit(false)
执行了一条或多条语句时再调用connection.commit()
提交。回滚调用connection.rollback()
当我们需要批量处理数据库时,例如批量的插入,更新或删除数据,表或数据库。创建Statement对象后调用addBatch()
方法将我们想要的语句放入完成后,最后提交executeBatch()
。