我在复习Java的JDBC部分时,参照书上做大字段存取的练习,遇到了问题,特来求助,希望大哥们帮我看下:
我建了一个数据表,表结构如下:
mysql> desc file_table;
+-----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+----------------+
| file_id | int(11) | NO | PRI | NULL | auto_increment |
| file_name | varchar(64) | YES | | NULL | |
| file_data | mediumblob | YES | | NULL | |
+-----------+-------------+------+-----+---------+----------------+
//配置文件:
dbType=mysql
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/20130316
user=root
pass=123456
//代码片段如下
private static final String PROP_FILE_PATH = "conf/mysql.properties";
private static Connection conn = null;
private static PreparedStatement insertPstmt = null;
/**
* 读取配置文件→获取数据库连接→生成预编译对象
*/
private void init() {
prop = new Properties();
try {
prop = MyUtil.initParam(PROP_FILE_PATH);
} catch (FileNotFoundException e) {
System.out.println("找不到配置文件: " + e);
e.printStackTrace();
} catch (IOException e) {
System.out.println("加载配置文件出错: " + e);
e.printStackTrace();
}
String driver = prop.getProperty("driver");
String url = prop.getProperty("url");
String user = prop.getProperty("user");
String pass = prop.getProperty("pass");
// 自定义方法,获取数据库连接
conn = MyUtil.getConnection(driver, url, user, pass);
String insertSQL = "insert into file_table values(null, ?, ?)";
// 该对象执行插入语句后能够返回自动生成的键
try {
insertPstmt = conn.prepareStatement(insertSQL, Statement.RETURN_GENERATED_KEYS);
} catch (SQLException e) {
System.out.println("添加文件失败,原因:预编译插入语句失败: " + e);
e.printStackTrace();
}
}
/**
* 上传文件到数据表
* @param filePath
*/
private void upload(String filePath) {
InputStream inStream = null;
int lastIndexOfNode = filePath.lastIndexOf(".");
int lastIndexOfBacklash = filePath.lastIndexOf("\");
String fileName = filePath.substring(lastIndexOfBacklash + 1, lastIndexOfNode);
System.out.println("filePath=" + filePath);
System.out.println("fileName=" + fileName);
int affect = 0;
try {
insertPstmt.setString(1, fileName);
inStream = new FileInputStream(filePath);
File file= new File(filePath);
// 设置二进制流参数
insertPstmt.setBinaryStream(2, inStream, file.length());
affect = insertPstmt.executeUpdate();
System.out.println("affect=" + affect);
if (affect == 1) {
System.out.println("文件(" + filePath + ")上传成功");
}
} catch (FileNotFoundException e) {
System.out.println("找不到文件: " + e);
e.printStackTrace();
} catch (SQLException e) {
// System.out.println("上传文件失败,原因向数据表添加记录出错: " + e);
e.printStackTrace();
} finally {
// 回收IO资源,自定义的方法
MyUtil.closeInputStream(inStream);
}
}
public static void main(String[] args) {
try {
UploadFileTest uploadTest = new UploadFileTest();
uploadTest.init();
String txtPath = "C:\Documents and Settings\Administrator\桌面\temp.txt";
String docPath = "C:\Documents and Settings\Administrator\桌面\temp.doc";
String jpgPath = "C:\Documents and Settings\Administrator\桌面\temp.jpg";
uploadTest.upload(txtPath);
uploadTest.upload(docPath);
uploadTest.upload(jpgPath);
} catch (Exception e) {
e.printStackTrace();
} finally {
//自定义方法,回收数据库资源
MyUtil.closePreparedStatement(insertPstmt);
MyUtil.closeConnection(conn);
}
}
上面就是代码片段,出现的问题是:上传纯文本文件(.txt)正常;上传.doc(里边没有贴图的也可以上传成功,但是再取出doc文件后,打开就是乱码了,而且文件的大小也变了)、*.jpg文件上传失败(
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?#?§?×?BRP?M?v??á??i??R??;?p?+?\0??§c?e¤d+70<g?{~???????8X¨ X?A=ù?9' at line 1),抛出异常的是这一句affect = insertPstmt.executeUpdate();。
别人也曾指点我“文件上传只保存地址即可,也可减轻数据库负担,增加访问速度”。但这明显不是我想要的答案,我就是想知道①为什么会引发SQL异常(异常提示说我SQL语句有语法问题),②该怎么解决修复这个异常。希望经验丰富的哥哥姐姐们抽空指点一下小弟(why & how)。
我在QQ群里提问,已经有人帮我指出问题的所在了。修改方式:在配置文件的url项添加一串字符串“?useUnicode=true&characterEncoding=utf8”,之后我也百度了这个用法的作用。还是要感谢“雷中雨”对我提问的回复,您是一个热心的人。
...大体看了下代码,发现一个问题,你把路径insert到数据表中之前或之后应该把文件的内容上传到某个地方,比如一个盘符里面吧.可以使用io流读取写入指定的目录,insert到数据表中的路径替换为上传后的路径,这样执行代码后应该实现将文件上传到指定盘符下,又把路径保存到数据表中了.
大哥,sorry!之前是我的描述不到位(后来我重新编辑过了),我想要的结果不是把文件路径保存到数据表中。而是我想把一个文件用二进制流的形式存入大字段中。如果单纯地将一个文件路径保存到数据表,我不需要用大字段啊,随便用varchar数据类型的列保存就可以了。
我在QQ群里提问,已经有人帮我指出问题的所在了。修改方式:在配置文件的url项添加一串字符串“?useUnicode=true&characterEncoding=utf8”,之后我也百度了这个用法的作用。还是要感谢您上面的对我提问的回复。