🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] # 简介 * JDBC-ODBC桥接技术 | |---在windows中有ODBC技术,ODBC是指开放数据库连接,可以利用JDBC间接操作ODBC技术,从而实现数据库连接 * JDBC直接连接 | |---直接由不同的数据库生产商提供指定的数据库连接驱动程序实现,此类方式由于JDBC直接操作数据库,所以性能是最好的 * JDBC网络连接 | |--- 使用专门的数据库网络连接指令进行指定主机的数据库操作, JDBC是接口,驱动是接口的实现,没有驱动将无法完成数据库连接,从而不能操作数据库! 每个数据库厂商都需要提供自己的驱动,用来连接自己公司的数据库,也就是说驱动一般都由数据库生成厂商提供。 # 开发步骤 在java之中,所有数据库操作的类和接口都保存在了java.sql包里面,在这个包里面 * 一个类: DriverManager类 * 四个接口: Connection,Statement,ResultSet,PreparedStatement 1. 注册驱动. 2. 获得连接. 3. 获得语句执行平台 4. 执行sql语句 5. 处理结果 6. 释放资源. 创建lib目录,用于存放当前项目需要的所有jar包 ## 注册驱动 驱动由不同的数据库厂商提供,这些驱动文件以*.jar文件提供,所以要配置CLASSPATH ~~~ Class.forName("com.mysql.jdbc.Driver"); ~~~ JDBC规范定义驱动接口:java.sql.Driver, MySql驱动包提供了实现类:com.mysql.jdbc.Driver DriverManager工具类,提供注册驱动的方法 registerDriver(),方法的参数是java.sql.Driver,所以我们可以通过如下语句进行注册: ~~~ DriverManager.registerDriver(new com.mysql.jdbc.Driver()); ~~~ 以上代码不推荐使用,存在两方面不足 1. 硬编码,后期不易于程序扩展和维护 2. 驱动被注册两次。 通常开发我们使用Class.forName() 加载一个使用字符串描述的驱动类。 如果使用Class.forName()将类加载到内存,该类的静态代码将自动执行。 通过查询com.mysql.jdbc.Driver源码,我们发现Driver类“主动”将自己进行注册 ~~~ public class Driver extends NonRegisteringDriver implements java.sql.Driver { static { try { java.sql.DriverManager.registerDriver(new Driver()); } catch (SQLException E) { throw new RuntimeException("Can't register driver!"); } } …… } ~~~ 驱动注册了两次.我们只需要将静态代码块执行一次,类被加载到内存中会执行静态代码块,并且只执行一次. 现在只需要将类加载到内存中即可: ~~~ 方式1: ★Class.forName("全限定名");//包名+类名 com.mysql.jdbc.Driver 方式2: 类名.class; 方式3: 对象.getClass(); ~~~ ## 获得链接 代码: ~~~ Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb","root","root"); ~~~ 获取连接需要方法 DriverManager.getConnection(url,username,password),三个参数分别表示,url 需要连接数据库的位置(网址) user用户名 password 密码 url比较复杂,下面是mysql的url: jdbc:mysql://localhost:3306/mydb JDBC规定url的格式由三部分组成,每个部分中间使用冒号分隔。 * 第一部分是jdbc,这是固定的; * 第二部分是数据库名称,那么连接mysql数据库,第二部分当然是mysql了; * 第三部分是由数据库厂商规定的,我们需要了解每个数据库厂商的要求,mysql的第三部分分别由数据库服务器的IP地址(localhost)、端口号(3306),以及DATABASE名称(mydb)组成。 ## 获得语句执行平台 ~~~ String sql = "某SQL语句"; ~~~ 获取Statement语句执行平台: ~~~ Statement stmt = con.createStatement(); ~~~ 常用方法: * int executeUpdate(String sql); --执行insert update delete语句. * ResultSet executeQuery(String sql); --执行select语句. * boolean execute(String sql); --执行select返回true 执行其他的语句返回false. ## 处理结果集(执行insert、update、delete无需处理) ResultSet实际上就是一张二维的表格, 我们可以调用其boolean next()方法指向某行记录, 当第一次调用next()方法时,便指向第一行记录的位置, 这时就可以使用ResultSet提供的getXXX(int col)方法 (与索引从0开始不同个,列从1开始)来获取指定列的数据: ~~~ rs.next();//指向第一行 rs.getInt(1);//获取第一行第一列的数据 ~~~ 常用方法: * Object getObject(int index) / Object getObject(String name) 获得任意对象 * String getString(int index) / Object getObject(String name) 获得字符串 * int getInt(int index) / Object getObject(String name) 获得整形 * double getDouble(int index) / Object getObject(String name) 获得双精度浮点型 ## 释放资源 与IO流一样,使用后的东西都需要关闭! 关闭的顺序是先得到的后关闭,后得到的先关闭。 ~~~ rs.close(); stmt.close(); con.close(); ~~~