Blob

想把图片存到数据库中,图片是二进制文件,我觉得用hibernate比较好,然后就开始写,结果一直出这个问题

Caused by: 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 ‘?疟5拧3${xv*??zQ?韓跰?sg<?沬g=\\M呀鱉[a?癢Z\‘k_}蒜!軌?贯蘟D‘ at line 1

我并没有写sql代码,还一直提示我报错。

先理一下思路:

1:Student类以及对象关系映射文件

package com.zhao.entity;

import java.io.Serializable;

public class Student implements Serializable {
    private static final long serialVersionUID = 1L;
    private int id;
    private String name;
    private byte[] picture;

    public Student() {
        // TODO Auto-generated constructor stub
    }
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    public byte[] getPicture() {
        return picture;
    }
    public void setPicture(byte[] picture) {
        this.picture = picture;
    }

}
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2016-5-21 20:09:22 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="com.zhao.entity.Student" table="STUDENT">
        <id name="id" type="int">
            <column name="stu_id" />
            <generator class="native" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="stu_name" />
        </property>
        <property name="picture" type="binary">
            <column name="stu_picture" />
        </property>
    </class>
</hibernate-mapping>

2:hibernate配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.password">807824</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/zhao</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="show_sql">true</property>
        <property name="format_sql">true</property>
        <property name="hibernate.hbm2ddl.auto">update</property>
        <mapping resource="com/zhao/entity/Student.hbm.xml" />
    </session-factory>
</hibernate-configuration>

3:

其实就这么简单,但是我开始的时候用的是Blob,后来才用byte[]。

用Blob就一直出错,也查找了一些资料,hibernate3和hibernate4对blob的不同处理也都尝试过,但是session 保存的时候还是出错,错误就是不符合语法。

所以我决定大改一遍

在Student类中用byte[]  Student.hbm.xml中用binary  MySQL中用blob.  这样就不出问题了。

create table student(
    stu_id int primary key not null auto_increment,
    stu_name varchar(20),
    stu_picture blob
);

4:

插入数据

package com.zhao.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;

import com.zhao.entity.Student;

public class Main {

    public static void main(String[] args) throws Exception {
        Configuration configuration = new Configuration().configure();
        ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties())
                .buildServiceRegistry();
        SessionFactory factory = configuration.buildSessionFactory(serviceRegistry);
        Session session = factory.openSession();
        Transaction transaction = session.beginTransaction();

        Student student = new Student();
        // 获取照片文件
        File file = new File("E:\\xue.jpg");
        if (!file.exists()) {
            throw new Exception("找不到图片");
        }
        @SuppressWarnings("resource")
        InputStream inputStream = new FileInputStream(file);
        byte[] bs = new byte[inputStream.available()];
        student.setName("root");
        student.setPicture(bs);
        session.save(student);

        transaction.commit();
        session.close();
        factory.close();
    }

}

查看数据库

好吧,问题解决了。近期再研究研究Blob 问题出在哪了吧。

时间: 2024-08-08 20:12:21

Blob的相关文章

mysql存取blob类型数据

参考网址:http://www.cnblogs.com/jway1101/p/5815658.html 首先是建表语句,需要实现将表建立好. CREATE TABLE `blobtest` ( `primary_id` varchar(32) NOT NULL, `bank_id` varchar(32) NOT NULL, `bank_name` varchar(64) NOT NULL, `blob_data` blob NOT NULL, PRIMARY KEY (`primary_id`

Java类型相互转换byte[]类型,blob类型

在我们的程序开发当中,经常会用到java.sql.Blob.byte[].InputStream之间的相互转换,但在JDK的API当中,又没有直接给我们提供可用的API,下面的程序片段主要就是实现它们之间互换的util. 一.byte[]=>Blob 我们可以通过Hibernate提供的表态方法来实现如: org.hibernate.Hibernate.Hibernate.createBlob(new byte[1024]); 二.Blob=>byte[] 目前没有找到好一点的API提供,所以

使用ADO实现BLOB数据的存取 -- ADO开发实践之二

使用ADO实现BLOB数据的存取 -- ADO开发实践之二 http://www.360doc.com/content/11/0113/16/4780948_86256633.shtml 一.前言 在上一篇文章<>中我们详细介绍了ADO基本的操作方法,在实际的开发过程中我们常常需要存储较大的二进制数据对象,比如:图像.音频文件.或其它二进制数据,这些数据我们称之为二进制大对象BLOB(Binary Large Object),其存取的方式与普通数据有所区别.本文将介绍利用ADO在数据库中存取B

jdbc—CLOB和BLOB

-CLOB(Character Large Object) - 用于存储大量的文本数据 - 大字段有些特殊,不同数据库处理的方式不一样,大字段的操作常常是以流的方式来处理的.而非一般的字段,一次即可读出数据. - Mysql中相关类型 - TINYTEXT最大长度为255(2^8-1)字符的TEXT列 - TEXT(M)最大长度为65535(2^16-1)字符的TEXT列 - MEDIUMTEXT最大长度为16777215(2^24 -1)字符的TEXT列 - LONGTEXT最大长度为4294

MyBatis 杂项(分页,缓存,处理BLOB\CLOB数据)

1.处理CLOB,BLOB数据 oracle中的 clob:clob blob:blobmysql中的 clob:longtext blob:longblob 2.传入多个输入参数,mybatis自带的param属性(但是不经常用,我们用map就足够了) 3.MyBatis分页 逻辑分页:将数据全部取出先放到内存中,之后在内存中进行分页,性能不好.不推荐使用 物理分页:通过语句进行分页. 4.MyBatis缓存 MyBatis默认情况下:MyBatis默认使用一级缓存,即同一个SqlSessio

关于InnoDB存储引擎text和blob类型的优化

我们在数据库优化的时候,看到一些表在设计上使用了text或者blob的字段,如果单表的存储空间达到了近上百G或者大几十G,这种情况再去改变和优化就非常难了 一.简介 为了清楚大字段对性能的影响,我们有必要知道innodb存储引擎的处理方式: 1.一些知识点 1.1 在InnoDB 1.0.x版本之前,InnoDB 存储引擎提供了 Compact 和 Redundant(Redundant 格式是为兼容之前版本而保留的) 两种格式来存放行记录数据,compact 和 redundant 合称为An

深入浅出JDBC-操作时间与大对象(Clob/Blob)

一.时间(Date.Time.Timestamp) java.sql.Date/java.sql.Time/java.sql.Timestamp extends java.util.Date public class TimeData { PreparedStatement pStatement=null; //操作日期类型的数据 public void insertDate(Connection connection,long time){ try { String sql="insert i

GMM+Kalman Filter+Blob 目标跟踪

转 http://www.cnblogs.com/YangQiaoblog/p/5462453.html ==========图片版============================================================================== ===================================================================================== 最近学习了一下多目标跟踪,看了看Mat

Azure China (11) 使用Azure China Storage Public Blob

<Windows Azure Platform 系列文章目录> 本文介绍的是国内由世纪互联运维的Azure China 注意:本文介绍的是Azure China Storage Public Blob,即可以通过匿名访问到Azure Storage云存储中的内容 项目源代码下载地址:http://files.cnblogs.com/files/threestone/AzurePublicBlob.rar 我们需要收集的内容如下: 1.Azure Storage Account Name 2.A

JDBC学习笔记(6)——获取自动生成的主键值&amp;处理Blob&amp;数据库事务处理

获取数据库自动生成的主键 [孤立的技术是没有价值的],我们这里只是为了了解具体的实现步骤:我们在插入数据的时候,经常会需要获取我们插入的这一行数据对应的主键值. 具体的代码实现: 1 /** 2 * 获取数据库自动生成的主键 3 */ 4 @Test 5 public void testGetKeyValues(){ 6 Connection connection=null; 7 PreparedStatement preparedStatement=null; 8 ResultSet rs=n