1.JDBC编程的一般步骤:
(1).注册数据库连接驱动。
(2).建立数据库连接。
(3).创建SQL语句。
(4).执行SQL语句。
(5).处理执行结果。
(6).释放资源和数据库连接。
2.JDBC注册数据库连接驱动3种方式:
(1).DriverManager.registerDriver(驱动类对象);
(2).System.setProperty(“jdbc.drivers”, 驱动类名);
(3).Class.forName(驱动类名);
其中,第三种通过反射注册驱动是最常用的方式,也是JDBC编程中推荐使用的方式。
3.JDBC连接url格式:
jdbc:子协议[:子名称]//主机名:端口号/数据库名?属性名=属性值&……
以mysql数据库为例,其jdbc连接url为:
jdbc:mysql://主机名或IP:3306/数据库名?username=root&password=……
4.SQL注入攻击和防止:
SQL注入攻击是以非法手段构造出一些恶意的SQL语句,以窃取数据库中机密数据或者破坏数据。
(1)SQL注入攻击的例子:
JDBC编程中,SQL语句拼接形式非常不安全,容易产生SQL注入攻击的漏洞,如一段查询SQL如下:
String sql = “select * from users where name=’” + name + “’”;
当传入name参数的值为:name=’ or 1 or ‘的时候,拼接产生出来的SQL语句如下:
select * from users where name = ‘’ or 1 or ‘’;
在某些数据库中1是关键字,类似于true,所以这条语句就会把所有的数据全部查询出来,从而产生SQL注入攻击。
(2).防止SQL注入攻击的简单方法:
以下两种简单办法可以防止一些基本的SQL注入攻击。
a. SQL语句不是用字符串拼接方式,所有参数全部使用问号(”?”)来代替.
b. 使用JDBC的PreparedStatement代替Statement,在预编译处理时过滤掉特殊字符。
5.JDBC中java.util.Date和java.sql.Date之间的类型转换:
(1).从java.util.Date向java.sql.Date转换:
直接使用new java.sql.Date(java.util.Date对象.getTime());
(2).从java.sql.Date向java.util.Date转换:
可以直接赋值,因为java.sql.Date继承自java.util.Date,所以父类可以直接引用子类对象。
也可以使用java.util.Date(java.sql.Date对象.getTime());方式。
6.JDBC处理clob类型数据:
数据库中存放大文本数据类型时,使用clob数据类型,jdbc读取和存储clob数据类型方法如下:
(1).读取clob:
a.使用预处理PreparedStatement对象进行查询以后,将查询结果存放到结果集ResultSet对象rs中。
b.将Clob类型数据读取到输入流中:Reader reader = rs.getCharacterStream(“clob类型的列名或列索引”);
c.处理从结果集中获取到的输入流。
(2).存储clob:
a.使用预处理PreparedStatement对象pst设置Reader对象:
pst.setCharacterStream(参数序号,Reader对象,长度);
b.使用IO流将大文本读入到Reader对象中。
c.执行pst将大文本保存到数据库中。
7.JDBC处理blob类型数据:
数据库中存放大的二进制文件,如图片等,使用blob数据类型,jdbc读取和存储blob数据类型方法如下:
(1).读取blob:
a.使用预处理PreparedStatement对象进行查询后,将查询结果存放到结果集ResultSet对象rs中。
b.将Blob类型数据读取到输入流中:InputStream in = rs.getBinaryStream(“blob类型的列名或列索引”);
c.处理从结果集中获取到的输入流。
(2).存储blob:
a.使用预处理Preparedment对象pst设置InputStream对象:
pst.setBinaryStream(参数索引,InputStream对象,长度);
b.使用IO流将大的二进制文件读入到InputSteam对象中。
c.执行pst将大的二进制数据保存到数据库中。
8.JDBC调用存储过程:
JDBC使用CallableStatement来调用存储过程,CallableStatement是从PreparedStatement扩展而来。具体调用存储过程方法如下:
CallableStatement cs = null; cs = conn.prepareCall(“{call 存储过程名(?,……,?)}”); cs.registerOutParameter(index, Type,Integer); cs.setXXX(i, XXX); cs.executeUpdate(); int id = cs.getInt(index);
9.JDBC执行批处理:
使用PreparedStatement对象pst的pst.addBatch();可以添加批处理操作。
执行批处理操作方法:pst.executeBatch();
10.JDBC可滚动结果集:
JDBC默认的结果集是从前向后单向查找的,可滚动结果集是指结果集可以向前和向后双向查找。可滚动结果集用法如下:
Statement st = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); ResultSet rs = st.executeQuery(sql);
可滚动结果集常用方法如下:
//结果集游标移到第一条记录之前 rs.beforeFirst(); //结果集游标移到最后一条记录之后 rs.afterLast(); //判断当前结果集游标是否在第一条记录 rs.isFirst(); //判断当前结果集游标是否在最后一条记录 rs.isLast(); //将结果集游标定位到某一条记录 rs.absolute(int index); //将结果集游标移动插入行 rs.moveToInsertRow(); //将结果集游标移向上一条记录 rs.previous(); //将结果集游标移向下一条记录 rs.next();
注意:可滚动结果集可以用做数据假分页。
11.JDBC的可更新结果集:
普通的结果集是只读的,可更新结果集是可以直接修改的,更新后的结果集会更新到数据库中。可更新结果集用法如下:
Statement st = conn.createStatement(ResultSet.TYPE_SCORLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); ResultSet rs = st.executeQuery(sql); rs.updateString(列名, new value); rs.updateRow();
12.JDBC获取数据库元数据信息方法:
(1).connection.getMetaDate();方法可以获得数据连接相关元数据。
(2).connection.getParameterMetaDate();方法可以获得数据库连接参数相关元数据。