JDBC
Java DataBase Connective
java操作数据库的接口规范
两个不同程序之间如果想要通信,必须有一套接口规范,接口规范通常由主导一方定义。
java要操作数据库需要面向JDBC接口进行开发,数据库提供了对接口的实现即数据库的驱动。
进行JDBC开发
1,学习JDBC接口规范,学习组成JDBC的两个包javax.sql.*与java.sql.*
2,在工程中导入响应数据库驱动(JDBC实现)
核心JDBC接口规范
DriverManager驱动管理器
Connection连接
Statement操作状态(子接口PreparedStatement,CallableStatement)
ResultSet结果集
搭建数据库环境
进入MySQL官网http://dev.mysql.com/downloads/connector/j/下载最新的MySQL驱动程序,我这里下载的是:mysql-connector-java-gpl-5.1.35.msi。这是镜像文件,双击就会自动安装,并在C:Program FilesMySQL文件夹下生成一个MySQL Connector J文件夹。进入该文件夹找到一个名叫mysql-connector-java-5.1.35-bin.jar的文件。
我的java程序安装在D:Javajdk1.7.0_15文件夹中,找到该文件夹下的lib文件夹,并将mysql-connector-java-5.1.35-bin.jar复制到lib中。由于安装java程序时,会默认在C:Program FilesJavajre中产生一个lib文件夹,进入该文件夹找到ext,双击进入文件夹,同时将mysql-connector-java-5.1.35-bin.jar复制一份放入其中。
在Eclipse中,鼠标选中项目工程,右键点击Build Path,选择Configure Build Path,会跳出一个属性框图。选择Java Build Path下的Libraries,点击Add External JARs,浏览到JDBC的MySQL驱动的jar包,点击确定,将其导入到项目中。
在工程中对数据库进行操作的步骤
// 步骤1,加载数据库驱动 DriverManager.registerDriver(new Driver()); //Class.forNmae("com.sql.jdbc.Driver");一般使用这种方法,第一种会重复加载驱动 // 步骤2,建立数据库连接 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "root", "ss561"); // 步骤3,将SQL发送给数据库 Statement statement = conn.createStatement(); ResultSet rs = statement.executeQuery("select * from users"); // 遍历结果集 while (rs.next()) { System.out.println(rs.getString("name")); } // 步骤四,断开连接释放资源 rs.close(); statement.close(); conn.close();
JDBC API详解
DriverManager
驱动管理器类
用于加载驱动创建与数据库的连接
DriverMabager.registerDriver(Driver driver);加载数据库驱动的方法
DriverManager.getConnection(url,use,password);建立数据库连接
DriverManager.getDrivers(url);加载多个数据库驱动,根据url的协议标识判断具体使用哪个驱动,在实际开发中并不会直接的使用DriverManager.registerDriver(),所有的数据库厂商默认在类被加载时驱动加载即被执行,即驱动加载是以静态代码块的形式存在于源码里的,所以只需要使用Class.forName("com.sql.jdbc.Driver")加载该Driver驱动类字节码文件对象即可;而且这样也可以避免在程序中实例化具体驱动对象,降低了数据库驱动的依赖性,在驱动类内部通过getDrivers来判断具体使用哪个数据库。
数据库URL
jdbc:mysql://ip:port/database?param
jdbc:oracle:thin:@localhost:1521:sid
在参数部分经常使用的属性useUnicode=true&characterEncoding=UTF-8;参数指定客户端与服务器连接使用的字符集,当客户端编码与服务器端编码不同,通过参数设置编码
例如;客户端gbk 服务器utf-8,参数设置为useUnicode=true&characterEncoding=gbk;这里字符集与客户端编码一致。
Connection接口
一个对象代表一个数据库连接
作用两点
1,获得操作数据库的statement对象
createStatement()---获得普通操作状态对象statement
prepareStatement()---预编译状态对象Statement子接口
prepareCall(String sql)---CallableStatement是prepareStatement的子接口,操作数据库内部存储过程
statement对象可以向数据库发送sql语句,获得ResultSet结果集
2,进行事务控制
setAutoCommit(boolean);开启一个事务
commit();提交一个事务
rollback();回滚一个事务
Statement接口
代表一个操作的状态,操作数据库SQL语句,调用存储过程
excuteQuery(String sql);用于向数据库发送查询语句,select语句,返回值ResultSet结果集
excuteUpdate(String sql);用于向数据库发送insert,update或delete语句,返回值为int,表示受到影响的行数
excute(String sql);可以向数据库发送任何SQL语句,返回值为boolean类型,如果sql结果为ResultSet结果集返回true,否则会返回false
addBatch(String sql);批处理,一次执行多条sql语句,把多条sql语句放到一个批处理中
excuteBatch();向数据库发送一批sql语句执行
ResultSet结果集
用于代表sql语句的执行结果,ResultSet封装执行结果时,采用的类似于表格的方式,ResultSet对象维护了一个指向表格数据行的游标cursor,初始的时候,游标在第一行之前,调用ResultSet.next()方法之后,可以使游标指向具体的数据行,从而获取该行的数据。
getObject(int index)//获取任意类型的数据
getObject(String columnName)
getString(int index)//获取指定类型的数据
getString(String columnName)
Connection还有个Statement createStatement(int resultSetType,int resultSetConcurrency)方法该方法产生Statement对象,该对象将生成具有给定操作类型和并发性的 ResultSet 对象。此方法与上述 createStatement 方法相同,但它允许重写默认结果集类型和并发性。resultSetType - 结果集类型,它是 ResultSet.TYPE_FORWARD_ONLY、 ResultSet.TYPE_SCROLL_INSENSITIVE 或 ResultSet.TYPE_SCROLL_SENSITIVE 之一,resultSetConcurrency - 并发类型;它是 ResultSet.CONCUR_READ_ONLY 或 ResultSet.CONCUR_UPDATABLE 之一这些类型都是ResultSet内部封装的字段常量。
absolute(int row);直接将游标指向结果集的具体行数
updateString(int columnIndex, String x)用 String 值更新指定列。结果集可以更新修改数据不过在更新之后需要确认,即调用updateRow()方法
// 释放资源 标准写法 Class.forName("com.mysql.jdbc.Driver"); Connection conn = null; Statement stmt = null; ResultSet rs = null; try { conn = DriverManager.getConnection("jdbc:mysql:///day13", "root", "123"); stmt = conn.createStatement(); rs = stmt.executeQuery("select * from users"); while (rs.next()) { System.out.println(rs.getString("name")); } } catch (SQLException e) { e.printStackTrace(); } finally { if (rs != null) { try { rs.close(); } catch (SQLException sqlEx) { } rs = null; } if (stmt != null) { try { stmt.close(); } catch (SQLException sqlEx) { } stmt = null; } if (conn != null) { try { conn.close(); } catch (SQLException e) { } conn = null; } }
因为面向JDBC接口在编程过程中需要重复使用多次对数据库进行操作,所以会出现大量的重复代码,如驱动的加载,数据库的连接,资源的释放等,为了简化开发需要将这些共性重复出现的功能代码抽取出来定义为JDBCUtils工具类中的方法
要熟练JDBC工具类的编写。