初学JDBC

来源:互联网 发布:java文档注释 编辑:程序博客网 时间:2024/05/17 05:06

1.数据库驱动概念

数据库驱动就是数据库厂商提供的用来操作数据库用的jar包。

2.JDBC入门

如由数据库厂商提供自己的数据库驱动会比较繁杂,所以sun公司提供了一套数据库驱动的接口规范JDBC,其本质是连接多种数据库的接口。

2.1 准备工作

在数据库中建立表

导入数据库的驱动包

3.操作JDBC

3.1 注册数据库驱动

DriverManager.registerDriver(new Driver());

缺点1:在初始化Driver类时已经注册了一次驱动,调用DriverManager的registerDriver()方法时会再注册一次驱动,造成驱动被注册了两次。

缺点2:整个程序域mysql数据库驱动绑定增加了耦合性

替代方案:利用反射注册驱动

Class.forName("com.mysql.jdbc.Driver");

3.2 获取连接

DriverManager.getConnection(url, user, password);

~url的写法:

Oracle:jdbc:oracle:thin:@localhost:1521:sid

SqlServer:jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=sid

MySql:jdbc:mysql://localhost:3306/sid

~url可以接的参数

user、password

useUnicode=true&characterEncoding=UTF-8

3.3 获取传输器

createStatement():创建向数据库发送sql的statement对象。

prepareStatement(sql) :创建向数据库发送预编译sql的PrepareSatement对象。

3.4 利用传输器执行sql语句获取结果集

executeQuery(String sql) :用于向数据发送查询语句。

executeUpdate(String sql):用于向数据库发送insert、update或delete语句

execute(String sql):用于向数据库发送任意sql语句

3.5 遍历结果集取出结构

ResultSet以表的样式在内存中保存了查询结果,其中维护了一个游标,并提供了以下的操作方法:

next():移动到下一行,

Previous():移动到前一行,

absolute(int row):移动到指定行,

beforeFirst():移动resultSet的最前面,

afterLast() :移动到resultSet的最后面。

ResultSet还提供了多个Get方法来获取查询结果中的不同类型的数据。

3.6 释放资源

conn、stat、rs使用完后需要关闭

释放时按照先创建的后释放

if(rs != null){try {rs.close();  //stat.close();//conn.close();} catch (SQLException e) {e.printStackTrace();} finally{rs = null;//stat= null;//conn= null;}}

4.PreparedStatement

4.1 Sql注入:

由于jdbc程序在执行的过程中sql语句在拼接时使用由页面传入参数,如果用户恶意传入一些sql中的特殊关键字,会导致sql语句变化,这种攻击方式就叫做sql注入,参考用户注册登录案例。

4.2 PreparedStatement

是Statement的子类,不同的是PreparedStatement使用预编译机制,在创建PreparedStatement对象时需要将sql语句传入,需要的参数用“?”替代,传入的sql会被预编译,然后再调用PreparedStatement的setXXX方法设置参数,由于sql语句经过了预编译,再传入特殊值也不会起作用了。

4.3 PreparedStatement采用预编译机制

sql语句在执行的过程中效率比Statement要高。

5.大数据

5.1 mysql数据库可以在数据库中保存大文本和大二进制数据:

Text

TINYTEXT(255)、TEXT(64k)、MEDIUMTEXT(16M)和LONGTEXT(4G)

Blob

TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB

5.2 JDBC操作大文本:

5.2.1 插入大文本:

ps = conn.prepareStatement("insert into Demo2Text values(null,?,?)");

ps.setString(1, "string_name");

File file = new File("1.txt");

ps.setCharacterStream(2, new FileReader(file), (int) file.length());

若出现异常:Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

原因:文件过大,导致PreparedStatement中数据占用内存过大

解决:内存溢出-Xms256M-Xmx256M

若出现异常:com.mysql.jdbc.PacketTooBigException: Packet for query is too large (10886466 > 1048576). You can change this value on the server by setting the max_allowed_packet' variable.

原因:数据库连接传输用的包不够大,传输大文本时报此错误

解决:在my.ini中配置max_allowed_packet指定包的大小

5.2.2 查询大文本:

Reader rd = rs.getCharacterStream("content");

5.3 JDBC操作大二进制

5.3.1 插入二进制:

ps = conn.prepareStatement("insert into Demo3Blob values(null,?,?)");

ps.setString(1, "multiMedia_name");

File file = new File("1.mp3");

ps.setBinaryStream(2, new FileInputStream(file), (int) file.length());

5.3.2 查询二进制

InputStream in = rs.getBinaryStream("content");

原创粉丝点击