把头像图片以二进制形式保存到数据库(Hibernate实现)

一、Hibernate环境搭建、创建工程略。java

二、首先咱们新建一个User类,储存一些用户信息字段,在Java中photo字段要申明为应该byte[]类型sql

    User.java数据库

public class User {    
    private int id;    
    private String name;    
    private Integer age;    
    private Date birthday; // 生日    
    private String desc; // 一大段说明    
    private byte[] photo; // 头像图片    
    //省略getter and setter Method...
    }

三、而后配置User的映射文件数组

    User.hbm.xmlsession

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.itcast.c_hbm_property">
    <!-- name属性:哪一个类
	 table属性:对应哪一个表,若是不写,默认的表名就是类的简单名称
    -->
    <class name="User" table="t_user">
	<id name="id" type="int" column="id">
           <generator class="native"/>
        </id>
	<!-- 普通的属性(数据库中的基本类型,如字符串、日期、数字等) 
    	     name属性:对象中的属性名,必需要有。
	     type属性:类型,若是不写,Hibernate会自动检测。
	     能够写Java中类的全名。
	     或是写hibernate类型。
	     column属性:对应表中的列名,若是没有,默认为属性名。
	     length属性:长度,不是全部的类型都有长度属性,好比varchar有,但int没有,若是不写默认为255
	     not-null属性:非空约束,默认为false
	 -->
	 <!-- 
	      <property name="name"/>
	 -->
	 <property name="name" type="string" column="name" length="20" not-null="true"/>
	 <property name="age" type="int" column="age_"/>
		
	 <property name="birthday" type="date" column="birthday_"/>
		
	 <!-- 当列表与关键字冲突时,能够经过column属性指定一个其余的列名。
	      或是使用反引号包围起来。
	      指定使用text类型时,最好再指定length,以肯定生成的SQL类型是可以存放指定数量的字符的。
              <property name="desc">
                  <column name="desc_" length="5000" sql-type="text"/>
              </property>		
	 -->

	 <property name="desc" type="text" length="5000" column="`desc`" ></property>
	 <!-- 头像,二进制类型,最好指定长度 -->
	 <property name="photo" type="binary" length="102400"></property>
    </class>
</hibernate-mapping>

四、测试类测试新增User信息
app

    photoTest.java函数

public class photoTest{
    private static SessionFactory sessionFactory;
    static {
	sessionFactory = new Configuration()//
	    .configure()// 读取配置文件
	    .addClass(User.class)//
	    .buildSessionFactory();
    }
    @Test
    public void testSave() throws Exception {
	// 读取图片文件
	InputStream in = new FileInputStream( "c:/test.png");
	byte[] photo = new byte[in.available()];
	//用inputStream对象的available()方法获取流中可读取的数据大小,一般咱们调用这个函数是在下载文件或者对文件进行其余处理时获取文件的总大小。
	in.read(photo);// 从输入流中读取指定数量的字节,并将其存储在缓冲区数组 b 中
	in.close();
		
	// 建立对象实例
	User user = new User();
	user.setName("张三");
	user.setAge(20);
	user.setBirthday(new Date());
	user.setDesc("一大段的说明,此处省略5000字……");
	user.setPhoto(photo);
	// 保存
	Session session = sessionFactory.openSession(); // 打开一个新的Session
	Transaction tx = session.beginTransaction(); // 开始事务
	session.save(user);
	tx.commit(); // 提交事务
	session.close(); // 关闭Session,释放资源
    }
}

上面代码就是把c盘根目录的test.png图片保存到了数据库。测试

经过SQL查询该字段可看到是二进制数据,那么证实保存成功。ui

五、咱们再把图片读取出来放在D盘下,取名copy.pngspa

    photoTest.testGet()方法

@Test
public void testGet() throws Exception
    Session session = sessionFactory.openSession();
    Transaction tx = session.beginTransaction();
    User user = (User) session.get(User.class, 1); // 获取
    System.out.println(user.getId());
    System.out.println(user.getName());
    System.out.println(user.getDesc());
    System.out.println(user.getPhoto());
		
    OutputStream out = new FileOutputStream("D:/copy.png");
    out.write(user.getPhoto());
    out.close();
    tx.commit();
    session.close();
}

经测试成功运行...........

相关文章
相关标签/搜索