设计到数据库字段中存储长文本类型 常见为blob类型,但不同数据库叫法也不一样。
本例以mysql数据库为例,数据库字段类型为text 表示文本
客户端可以用字符串和字符换流存入和读取数据库中文本都是没问题的,问题就是会出现乱码。
package com.qf.jdbc;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class GlobOrText {
private static final String DRIVER="com.mysql.jdbc.Driver";
private static final String URL="jdbc:mysql://localhost:3306/jdbc";
private static final String USER="root";
private static final String PASSWORD="root";
//加载驱动只需一次,放入静态代码块即可
static{
try {
Class.forName(DRIVER);
} catch (ClassNotFoundException e) {
System.out.println("驱动加载失败,请查看是否导入依赖包。");
e.printStackTrace();
}
}
public static void main(String[] args) throws SQLException, IOException {
//addGlob();
readGlob();
}
//向数据库写入文本
public static void addGlob() throws SQLException, IOException{
//读取文件内容放入数据库表字段中
//加载驱动
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
//获取执行SQL语句的对象
String sql = "insert into globortext(globortext) values(?)";
PreparedStatement ps = conn.prepareStatement(sql);
//方式一 (存字符,显示中文是乱码 读取出来的中文也是乱码 如何解决呢)
File file = new File("src/com/qf/utils/Test1.java");
Reader reader = new BufferedReader(new FileReader(file));
ps.setCharacterStream(1, reader, file.length());
//方式二 (也是没问题的,显示中文也是乱码)
/*ps.setString(1, "你是不是个大闪避 my name is sitanli.");*/
//执行SQL语句
ps.executeUpdate();
//结果处理
//关闭资源
//reader.close();
ps.close();
conn.close();
}
//从数据库读长文本类型
public static void readGlob() throws SQLException, IOException{
//读取文件内容放入数据库表字段中
//加载驱动
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
//获取执行SQL语句的对象
String sql = "select globortext from globortext limit 2,3";
PreparedStatement ps = conn.prepareStatement(sql);
//执行SQL语句
ResultSet rs = ps.executeQuery();
//结果处理
while(rs.next()){
//将读取出的文件存入另一个文件
Reader reader = rs.getCharacterStream(1);
File file = new File("Test1.java");
Writer writer = new BufferedWriter(new FileWriter(file));
char[] buff = new char[1024];
for(int i=0;(i=reader.read(buff))>0;){
writer.write(buff, 0, i);
}
writer.close();
reader.close();
}
//关闭资源
//reader.close();
ps.close();
conn.close();
}
}