jdbc做为最基础也最重要的javaAPI之一,其意义无言自明。作为java语言的初级使用者,免不了的要与数据库打交道,而操作数据库的最简单工具可以说就是jdbc了。并且编码者如果想学习掌握更高级的数据库操作技术比如说orm框架例如hibernate或者mybatis等,对其熟悉也是有事半功倍的效果。本着方便自己帮助他人的目的现把网上查找到的jdbc的基本知识点整理如下,
jdbc编程步骤:
注册加载一个Drvier驱动:
Class.forName("oracle.jdbc.driver.OracleDriver");
创建数据库连接
String url="jdbc:oracle:thin:@172.16.0.6:1521:tangjl";
String user="openlab";
String password="open123";
Connection Con=DriverManager.getConnection(url,user,password);
Connection 连接是通过DriverManager的静态方法getConnection方法得到的这个方法的实质时把参数传到实际的Dirver中的connect()方法中来获得数据库连接.
Jdbc:oracle:this:(协议)@xxx.xxx.xxx:xxx(ip地址及端口号):xxx(使用数据库名)
Mysql的url是jdbc:mysql://localhost:3306/test
获得一个statement对象(PreparedStatement)
String sql="select * from a_yyy";
Statement s=con.createStatment();
PreparedStatement ps=con.prepareStatement(sql);
通过Statement执行sql语句:
Statement接口代表了一个数据库的状态,在向数据库发送相应的SQL语句时,都需要创建Statement接口或者PreparedStatement接口。在具体应用中,Statement主要用于操作不带参数(可以直接运行)的SQL语句,比如删除语句、添加或更新。
Sta.execute():适合任何语句
sta.executeQuery(sql):适合查询语句.返回一个查询结果集.
sta.executeUpdate(sql);适合增删改创建语句,返回值为影响记录的条数
//
PreparedStatement:预编译的Statement .
若是PreparedStatement:得到ps之后:
同样的,若是增删改创建的就用ps.executeUpdate();若是查询则用ps.executeQuery()返回一个结果集;
预编译的PreparedStatement,对于执行同构的sql语句来说,它的效率比较高,提升性能.
第一步:通过连接获得PreparedStatement对象,用带占位符(?)的sql语句构造。
PreparedStatement pstm = con.preparedStatement(“select * from test where id=?”);
第二步:设置参数
pstm.setString(1,“ganbin”);
pstm.setDate(2,date);
第三步:执行sql语句
Rs = pstm.excuteQuery();
statement发送完整的Sql语句到数据库不是直接执行而是由数据库先编译,再运行,而PreparedStatement是先发送带参数的Sql语句,再发送一组参数值.如果是同构的sql语句,PreparedStatement的效率要比statement高。而对于异构的sql则两者效率差不多。
同构:两个Sql语句可编译部分是相同的,只有参数值不同。
异构:整个sql语句的格式是不同的
注意点:1、使用预编译的Statement编译多条Sql语句一次执行
2、可以跨数据库使用,编写通用程序
3、能用预编译时尽量用预编译
处理查询结果集:
只有执行了select语句才有结果集
六关闭数据源
关闭细节:最先得到的,最后关闭.
元数据:是关于数据的信息,例如类型或者容量,通过JDBC API 可以访问:
1 数据库元数据:
使用Connection.getMetadata方法返回DataBaseMetaData引用.
2 结果集元数据
a使用ResultSet.getMetadata方法返回ResultSetMetaData引用
B能使用getColumnCount等类的方法获取结果集信息.(查api)
事务
事务处理三步曲:
① connection.setAutoCommit(false); //把自动提交关闭
② 正常的DB 操作//若有一条SQL 语句失败了,自动回滚
③ connection.commit() //主动提交或connection.rollback() //主动回滚
完整代码:
try{
con.setAutoCommit(false); //step1 把自动提交关闭
Statement stm = con.createStatement();
stm.executeUpdate("insert into person(id, name, age) values(520, 'X-Man', 18)");
stm.executeUpdate("insert into Person(id, name, age) values(521, 'Super', 19)");
//step2 正常的DB 操作
con.commit(); //step3 成功主动提交
} catch(SQLException e){
con.rollback();//step3 失败则主动回滚
}
元数据:
JDBC通过元数据(MetaData)来获得具体的表的相关信息,可以查询数据库中有哪些表,表有哪些字段,以及字段的属性等.MetaData中通过一系列getXXX将这些信息返回给我们。
数据库元数据 DatabaseMetaData 使用connection.getMetaData()获得
MetaData包括: 包含了关于数据库整体元数据信息。
结果集元数据 ResultSetMetaData 使用resultSet.getMetaData()获得
比较重要的是获得表的列名、列数等信息。
结果集元数据对象:ResultSetMetaData meta = rs.getMetaData();
字段个数:meta.getColomnCount();
字段名字:meta.getColumnName();
字段JDBC类型:meta.getColumnType();
字段数据库类型:meta.getColumnTypeName();
数据库元数据对象:DatabaseMetaData dbmd = con.getMetaData();
数据库名=dbmd.getDatabaseProductName();
数据库版本号=dbmd.getDatabaseProductVersion();
数据库驱动名=dbmd.getDriverName();
数据库驱动版本号=dbmd.getDriverVersion();
数据库Url=dbmd.getURL();
该连接的登陆名=dbmd.getUserName();