大数据也称之为LOB(Large Objects),LOB又分为:clob和blob,clob用于存储大文本,blob用于存储二进制数据,例如图像、声音、二进制文等。

  在实际开发中,有时是需要用程序把大文本或二进制数据直接保存到数据库中进行储存的。

  对MySQL而言只有blob,而没有clob,mysql存储大文本采用的是Text,Text和blob分别又分为:
  TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT
  TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB

一.工具类

public class JdbcUtils {
private static String driver = null;
private static String url = null;
private static String username = null;
private static String password = null;
static{
try{
url = "jdbc:mysql://localhost:3306/test";
driver = "com.mysql.jdbc.Driver";
username = "root";
password = "root";
//加载数据库驱动
Class.forName(driver); }catch (Exception e) {
throw new ExceptionInInitializerError(e);
}
} /**
* @return Connection数据库连接对象
* @throws SQLException
*/
public static Connection getConnection() throws SQLException{
return DriverManager.getConnection(url, username,password);
} /**
* 要释放的资源包括Connection数据库连接对象,负责执行SQL命令的Statement对象,存储查询结果的ResultSet对象
*/
public static void release(Connection conn,Statement st,ResultSet rs){
if(rs!=null){
try{
//关闭存储查询结果的ResultSet对象
rs.close();
}catch (Exception e) {
e.printStackTrace();
}
rs = null;
}
if(st!=null){
try{
//关闭负责执行SQL命令的Statement对象
st.close();
}catch (Exception e) {
e.printStackTrace();
}
}
if(conn!=null){
try{
//关闭Connection数据库连接对象
conn.close();
}catch (Exception e) {
e.printStackTrace();
}
}
}
}

二.使用jdbc处理MySQL的大文本

sql语句

CREATE TABLE `testclob` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`resume` text,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8

在resource下建立一个data.txt

“百度知道”,是用户自己根据具有针对性地提出问题,通过积分奖励机制发动其他用户,来解决该问题的搜索模式。 同时,这些问题的答案又会进一步作为搜索结果,提供给其他有类似疑问的用户,达到分享知识的效果。
百度知道的最大特点,就在于和搜索引擎的完美结合,让用户所拥有的隐性知识转化成显性知识,用户既是百度知道内容的使用者,同时又是百度知道的创造者,在这里累积的知识数据可以反映到搜索结果中。通过用户和搜索引擎的相互作用,实现搜索引擎的社区化。
百度知道也可以看作是对搜索引擎功能的一种补充,让用户头脑中的隐性知识变成显性知识,通过对回答的沉淀和组织形成新的信息库,其中信息可被用户进一步检索和利用。这意味着,用户既是搜索引擎的使用者,同时也是创造者。百度知道可以说是对过分依靠技术的搜索引擎的一种人性化完善。

测试代码如下:

public class JdbcOperaClob {

    /**
* @Method: add
* @Description:向数据库中插入大文本数据
* @Anthor:孤傲苍狼
*
*/
@Test
public void add(){
Connection conn = null;
PreparedStatement st = null;
ResultSet rs = null;
Reader reader = null;
try{
conn = JdbcUtils.getConnection();
String sql = "insert into testclob(resume) values(?)";
st = conn.prepareStatement(sql);
//相对路径,web容器加载class文件的时候,就是加载这个文件夹下的class文件.
File file = new File("target/classes/data.txt");
reader = new FileReader(file);
st.setCharacterStream(1, reader,(int) file.length());
int num = st.executeUpdate();
if(num>0){
System.out.println("插入成功!!");
}
//关闭流
reader.close();
}catch (Exception e) {
e.printStackTrace();
}finally{
// JdbcUtils.release(conn, st, rs);
}
} /**
* @Method: read
* @Description: 读取数据库中的大文本数据
*/
@Test
public void read(){
Connection conn = null;
PreparedStatement st = null;
ResultSet rs = null;
try{
conn = JdbcUtils.getConnection();
String sql = "select resume from testclob where id=3";
st = conn.prepareStatement(sql);
rs = st.executeQuery(); String contentStr ="";
String content = "";
if(rs.next()){
//使用resultSet.getString("字段名")获取大文本数据的内容
content = rs.getString("resume");
//使用resultSet.getCharacterStream("字段名")获取大文本数据的内容
Reader reader = rs.getCharacterStream("resume");
char buffer[] = new char[1024];
int len = 0;
FileWriter out = new FileWriter("D:\\1.txt");
while((len=reader.read(buffer))>0){
contentStr += new String(buffer);
out.write(buffer, 0, len);
}
out.close();
reader.close();
}
System.out.println(content);
System.out.println("-----------------------------------------------");
System.out.println(contentStr);
}catch (Exception e) {
e.printStackTrace();
}finally{
JdbcUtils.release(conn, st, rs);
}
}
}

三.使用jdbc处理MySQL的二进制数据

sql语句

CREATE TABLE `testblobim` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`image` longblob,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8

在resource放一张照片:迪丽热巴.jpg

测试代码:

public class JdbcOperaBloblmgs {

    /**
* @Description:向数据库中插入二进制数据
*/
@Test
public void add(){
Connection conn = null;
PreparedStatement st = null;
ResultSet rs = null;
try{
conn = JdbcUtils.getConnection();
String sql = "insert into testblobim(image) values(?)";
st = conn.prepareStatement(sql);
//相对路径,class下的相对路径
File file = new File("target/classes/迪丽热巴.jpg");
FileInputStream fis = new FileInputStream(file);//生成的流
st.setBinaryStream(1, fis,(int) file.length());
int num = st.executeUpdate();
if(num>0){
System.out.println("插入成功!!");
}
fis.close();
}catch (Exception e) {
e.printStackTrace();
}finally{
JdbcUtils.release(conn, st, rs);
}
} /**
* @Description: 读取数据库中的二进制数据
*/
@Test
public void read() {
Connection conn = null;
PreparedStatement st = null;
ResultSet rs = null;
try {
conn = JdbcUtils.getConnection();
String sql = "select image from testblobim where id=?";
st = conn.prepareStatement(sql);
st.setInt(1, 1);
rs = st.executeQuery();
if (rs.next()) {
//InputStream in = rs.getBlob("image").getBinaryStream();//这种方法也可以
InputStream in = rs.getBinaryStream("image");
int len = 0;
byte buffer[] = new byte[1024]; FileOutputStream out = new FileOutputStream("D:\\1.jpg");
while ((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
in.close();
out.close();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtils.release(conn, st, rs);
}
}
}

最新文章

  1. 遍历echsop的region表形成缓存的程序
  2. [问题2014A10] 解答
  3. 用jstl截取字符串
  4. Android Fragment 完全解析
  5. ios Swift 之github
  6. SSH中调用另一action的方法(chain,redirect)
  7. JSP中的include的两种用法
  8. JAVA_SE基础——21.二维数组的定义
  9. C# 高级编程02----手动创建C#程序
  10. Linux-共享内存通信
  11. PHP序列号生成函数和字符串替换函数代码
  12. "每日一道面试题".net托管堆是否会存在内存泄漏的情况
  13. [UWP 自定义控件]了解模板化控件(5):VisualState
  14. python 模块基础 和常用的模块
  15. Java HashMap的死循环 以及 LRUCache的正确实现
  16. Java 知识点(转)
  17. CentOS7 查看硬盘情况
  18. ocat
  19. Win7系统右上角没有搜索怎么办?Win7找回资源管理器中的搜索框
  20. 小程序_请求封装network

热门文章

  1. java高并发系列 - 第25天:掌握JUC中的阻塞队列
  2. Java学习|HTTP请求头
  3. C#之BackgroundWorker从简单入门到深入精通的用法总结
  4. 微信小程序商城系统怎样搭建?
  5. ServerResponse(服务器统一响应数据格式)
  6. 纯数据结构Java实现(1/11)(动态数组)
  7. (三)(1)线程间通信---wait和notify的使用
  8. int string类型互转
  9. mysql------explain工具
  10. 【JVM从小白学成大佬】4.Java虚拟机何谓垃圾及垃圾回收算法