JDBC学习笔记

 

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.       使用JDBCPreparedStatement代替Statement,在预编译处理时过滤掉特殊字符。

5.JDBCjava.util.Datejava.sql.Date之间的类型转换:

(1).java.util.Datejava.sql.Date转换:

直接使用new java.sql.Date(java.util.Date对象.getTime());

(2).java.sql.Datejava.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对象pstpst.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();方法可以获得数据库连接参数相关元数据。

 

你可能感兴趣的:(sql,编程,数据库,jdbc,Integer,存储)