1.大对象LOB
LOB,即Large Objects(大对象),是用来存储大量的二进制和文本数据的一种数据类型(一个LOB字段可存储可多达4GB的数据)。分为BLOB 和CLOB。
大文本CLOB:
CLOB(Character Large Object)
– 用于存储大量的文本数据。
– 大字段有些特殊,不同数据库处理的方式不一样,大字段的操作常常是以流的方式来处理的。而非一般的字段,一次即可读出数据。
• Mysql中文本相关类型:
TINYTEXT 最大长度为255(21–1)字符的TEXT列。
TEXT[(M)] 最大长度为65,535(22–1)字符的TEXT列。
MEDIUMTEXT 最大长度为16,777,215(23–1)字符的TEXT列。
LONGTEXT 最大长度为4,294,967,295或4GB(24–1)字符的TEXT列。
大二进制BLOB:
BLOB(Binary Large Object)
– 用于存储大量的二进制数据,如图像、视频、音频,文件等。
– 大字段有些特殊,不同数据库处理的方式不一样,大字段的操作常常是以流的方式来处理的。而非一般的字段,一次即可读出数据。
Mysql中相关类型:
– TINYBLOB最大长度为255(25–1)字节的BLOB列。
– BLOB[(M)]最大长度为65,535(26–1)字节的BLOB列。
– MEDIUMBLOB最大长度为16,777,215(27–1)字节的BLOB列。
– LONGBLOB最大长度为4,294,967,295或4GB(28–1)字节的BLOB列。
实际使用中根据需要存入的数据大小定义不同的BLOB类型。
需要注意的是:如果存储的文件过大,数据库的性能会下降。(所以,一般不会存在数据库中)
例子:插入大文本和大二进制到数据库
package cn.njit.jdbc;
/****
* 大对象插入MySQL
*/
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class BigTest {
public static void main(String[] args) {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
String jdbcurl = "jdbc:mysql://localhost:3306/njit?useUnicode=true&characterEncoding=UTF-8";
String user = "root";
String password = "admin";
try {
Connection conn = DriverManager.getConnection(jdbcurl, user, password);
PreparedStatement psmt;
String sql = "insert stustu(name,introduce,img) values(?,?,?);";
psmt = conn.prepareStatement(sql);
psmt.setString(1, "张三");
String txtpath = "D:\\FileDemo\\First\\studentInfo.txt";
Reader rd = null;
try {
rd = new FileReader(txtpath);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
psmt.setCharacterStream(2, rd);
String imgpath = "D:\\FileDemo\\First\\233\\jpg1.jpg";
InputStream is = null;
try {
is = new FileInputStream(imgpath);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
psmt.setBinaryStream(3, is);
int rows = psmt.executeUpdate();
System.out.println(rows);
try {
rd.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
psmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
注:Navicat没有查看图片的功能;
例子:读取大文本和大二进制
package cn.njit.jdbc;
/****
* MySQL大对象查询
*/
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
public class BigTest2 {
public static void main(String[] args) throws IOException {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
String jdbcurl="jdbc:mysql://localhost:3306/njit?useUnicode=true&characterEncoding=UTF-8";
String user="root";
String password="admin";
try {
Connection conn=DriverManager.getConnection(jdbcurl, user, password);
PreparedStatement psmt;
String sql="select * from stustu where name='张三'";
psmt=conn.prepareStatement(sql);
ResultSet rs=psmt.executeQuery();
if(rs.next()) {
String str=rs.getString("introduce");
System.out.println(str);
//---------------------------------
InputStream is=rs.getBinaryStream("img");
//_______________________________
OutputStream os;
int len;
byte[] buf=new byte[1024];
len=is.read(buf);
while(-1!=len) {
os=new FileOutputStream("D:\\FileDemo\\First\\Demo1016.jpg",true);
os.write(buf, 0, len);
os.close();
len=is.read(buf);
}
is.close();
}
psmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
2批处理
批处理相关方法
void addBatch(String sql) 添加批处理
void clearBatch() 清空批处理
int[] executeBatch() 执行批处理
例子:插入100条记录到表中,每次插入10条,共执行10次
package cn.njit.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
/****
* 批处理
* @author Administrator
*
*/
public class BatchTest {
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
String jdbcurl="jdbc:mysql://localhost:3306/njit?useUnicode=true&characterEncoding=UTF-8";
String user="root";
String password="admin";
Connection conn=DriverManager.getConnection(jdbcurl, user, password);
PreparedStatement psmt;
String sql="insert into user(username,PASSWORD) values(?,?);";
psmt=conn.prepareStatement(sql);
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
psmt.setString(1, "user"+(1000+j+10*i));
psmt.setString(2, "password"+(1000+j+10*i));
psmt.addBatch();
}
psmt.executeBatch();
psmt.clearBatch();
}
psmt.close();
conn.close();
}
}
3元数据
在jdbc中获取数据库的定义,例如:数据库、表、列的定义信息。就用到元数据。
在jdbc中可以使用: 数据库元数据、参数元数据、结果集元数据
(元数据定义相关api, …MetaData)
DatabaseMetaData 类
DatabaseMetaData 类中提供了许多方法用于获得数据源的各种信息,通过这些方法可以非常详细的了解数据库的信息:
getURL():返回一个String类对象,代表数据库的URL。
getUserName():返回连接当前数据库管理系统的用户名。
isReadOnly():返回一个boolean值,指示数据库是否只允许读操作。
getDatabaseProductName():返回数据库的产品名称。
getDatabaseProductVersion():返回数据库的版本号。
getDriverName():返回驱动驱动程序的名称。
getDriverVersion():返回驱动程序的版本号。
ParameterMetaData类
ParameterMetaData主要是针对PreparedStatement对象和其预编译的SQL命令语句提供一些信息,比如像”insert into account(id,name,money) values(?,?,?)”这样的预编译SQL语句,ParameterMetaData能提供占位符参数的个数,获取指定位置占位符的SQL类型等等,详细请看有关ParameterMetaData的API文档:
getParameterCount():获取预编译SQL语句中占位符参数的个数
String getParameterTypeName(int param)):获取预编译SQL语句中占位符参数的数据类型
要获取getParameterTypeName,需要修改url,添加参数 generateSimpleParameterMetadata=true:
String url=“jdbc:mysql://localhost:3306/test?generateSimpleParameterMetadata=true”;
ResultSetMetaData 类
可用于获取关于 ResultSet 对象中列的类型和属性信息的对象:
getColumnName(int column):获取指定列的名称
getColumnCount():返回当前 ResultSet 对象中的列数。
getColumnTypeName(int column):检索指定列的数据库特定的类型名称。
getColumnDisplaySize(int column):指示指定列的最大标准宽度,以字符为单位。
isNullable(int column):指示指定列中的值是否可以为 null。
isAutoIncrement(int column):指示是否自动为指定列进行编号,这样这些列仍然是只读的。
package cn.njit.jdbc;
/****
* MySQL大对象查询
*/
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
public class BigTest2 {
public static void main(String[] args) throws IOException {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
String jdbcurl="jdbc:mysql://localhost:3306/njit?useUnicode=true&characterEncoding=UTF-8";
String user="root";
String password="admin";
try {
Connection conn=DriverManager.getConnection(jdbcurl, user, password);
DatabaseMetaData dbmd=conn.getMetaData();
System.out.println(dbmd.getDatabaseProductName());
System.out.println(dbmd.getUserName());
PreparedStatement psmt;
String sql="select * from stustu where name='张三'";
psmt=conn.prepareStatement(sql);
//请求参数元数据
ParameterMetaData pmd=psmt.getParameterMetaData();
System.out.println("ParameterCount:"+pmd.getParameterCount());
//System.out.println("ParameterTypeName:"+pmd.getParameterTypeName(1));
ResultSet rs=psmt.executeQuery();
//结果元数据
ResultSetMetaData rsmd=rs.getMetaData();
System.out.println("column count:"+rsmd.getColumnCount());
System.out.println("cloumn name:"+rsmd.getColumnName(1));
if(rs.next()) {
String str=rs.getString("introduce");
System.out.println(str);
//---------------------------------
InputStream is=rs.getBinaryStream("img");
//_______________________________
OutputStream os;
int len;
byte[] buf=new byte[1024];
len=is.read(buf);
while(-1!=len) {
os=new FileOutputStream("D:\\FileDemo\\First\\Demo1016.jpg",true);
os.write(buf, 0, len);
os.close();
len=is.read(buf);
}
is.close();
}
psmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}