09-hibernate单表操作(1)

1,单一主键

2,基本类型

3,对象类型

4,组件属性

5,单表操作

单一主键

常用生成策略:

assigned 有程序员生成(手工)

native  由数据库底层,如果是mysql是increment,如果是Oracle是sequence。

测试assigned :代码手动给他赋值,不给ID赋值

import java.util.Date;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

//测试类
public class StudentsTest {

    private SessionFactory sessionFactory;
    private Session session;
    private Transaction transaction;
    @Before
    public void init()
    {
        //创建配置对象
        Configuration config=new Configuration().configure();
        config.addClass(Students.class);//这个需要加上(视频里面没有)
        //创建服务注册对象。
        ServiceRegistry serviceRegistry=new StandardServiceRegistryBuilder()
                .applySettings(config.getProperties()).build(); //通过config.getProperties()读取配置文档。
        //创建会话工厂对象
        sessionFactory=config.buildSessionFactory(serviceRegistry);
        //创建会话对象
        session=sessionFactory.openSession();
        //开启事务
        transaction=session.beginTransaction();
    }
    @After
    public void destory()
    {
        transaction.commit();//提交事务
        session.close();//关闭会话
        sessionFactory.close();//关闭会话工厂
    }

    @Test
    public void testSaveStudents()
    {
        //生成学生对象
    //    Students s=new Students(1,"张三丰","男",new Date(),"武当山");
        Students s=new Students();
        s.setSname("张三丰");
        s.setGender("男");
        s.setAddress("北京");
        s.setBirthday(new Date());
        session.save(s);//保存对象进入数据库
    }
}

结果发现SID字段默认为0,并没有给他赋值。.

基本类型:

对象类型

mysql里面clob类型用Text替代。

保存blob类型测试:在类文件中加上blob类型的picture属性。

import java.sql.Blob;
import java.util.Date;
//学生类
public class Students {
    //必须是共有类
    //提供共有的不带参数的默认的构造方法
    //属性私有
    //熟悉使用setter/getter封装

    private int sid;//学号
    private String sname;//姓名
    private String gender;//性别
    private Date birthday;//出生日期
    private String address;//地址
    private Blob    picture;

    public Blob getPicture() {
        return picture;
    }
    public void setPicture(Blob picture) {
        this.picture = picture;
    }

    public Students()
    {

    }

    public Students(int sid, String sname, String gender, Date birthday, String address) {
        //super();
        this.sid = sid;
        this.sname = sname;
        this.gender = gender;
        this.birthday = birthday;
        this.address = address;
    }

    public int getSid() {
        return sid;
    }

    public void setSid(int sid) {
        this.sid = sid;
    }

    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "Students [sid=" + sid + ", sname=" + sname + ", gender=" + gender + ", birthday=" + birthday
                + ", address=" + address + "]";
    }

}

重新生成一下hbm.xml文件,新增了如下:

在测试类中加上测试方法:

以下用到了获取Blob对象的方法:

//createBlob(从哪个输入流读取,读取的长度(这里就是输入流可用的字节数))
Blob image=Hibernate.getLobCreator(session).createBlob(input,input.available());

其中createBlob两个参数分别表示:从哪个输入流读取,要读取的长度,input.available()表示该输入流可用的字节流。

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.Blob;
import java.util.Date;
import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

//测试类
public class StudentsTest {

    private SessionFactory sessionFactory;
    private Session session;
    private Transaction transaction;
    @Before
    public void init()
    {
        //创建配置对象
        Configuration config=new Configuration().configure();
        config.addClass(Students.class);//这个需要加上(视频里面没有)
        //创建服务注册对象。
        ServiceRegistry serviceRegistry=new StandardServiceRegistryBuilder()
                .applySettings(config.getProperties()).build(); //通过config.getProperties()读取配置文档。
        //创建会话工厂对象
        sessionFactory=config.buildSessionFactory(serviceRegistry);
        //创建会话对象
        session=sessionFactory.openSession();
        //开启事务
        transaction=session.beginTransaction();
    }
    @After
    public void destory()
    {
        transaction.commit();//提交事务
        session.close();//关闭会话
        sessionFactory.close();//关闭会话工厂
    }
    @Test
    public void testSaveStudents()
    {
        //生成学生对象
    //    Students s=new Students(1,"张三丰","男",new Date(),"武当山");
        Students s=new Students();
        s.setSname("张三丰");
        s.setGender("男");
        s.setAddress("北京");
        s.setBirthday(new Date());
        session.save(s);//保存对象进入数据库
    }

    @Test
    public void testWriteBlob() throws Exception
    {
        Students s=new Students(1,"张三丰","男",new Date(),"武当山");
        //先获得照片文件
        File f=new File("d:"+File.separator+"jee-oxygen"+File.separator+"文档"+File.separator+"Picture"+File.separator+"孙悟空.png");
        //获得照片文件的输入流
        InputStream input=new FileInputStream(f);
        //创建一个Blob对象
        //createBlob(从哪个输入流读取,读取的长度(这里就是输入流可用的字节数))
        Blob image=Hibernate.getLobCreator(session).createBlob(input,input.available());
        //设置照片属性
        s.setPicture(image);
        //保存
        session.save(s);
    }
}

生成结果:

为了测试是否真正写到了数据库中,把它读取出来:

为了保证数据不被删除,把hbm2ddl.auto改成update

为了获取数据库中对应的数据,映射到类。用如下方法session.get()

 //从数据库中获取该条数据的对象
 //get(类.class,主键值为1的数据)
 Students s=session.get(Students.class, 1);

表示从数据库中读取students这个类所映射的表,里面主键值为1的数据。

session.get(类.CLASS,主键值)获取

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Blob;
import java.util.Date;
import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

//测试类
public class StudentsTest {

    private SessionFactory sessionFactory;
    private Session session;
    private Transaction transaction;
    @Before
    public void init()
    {
        //创建配置对象
        Configuration config=new Configuration().configure();
        config.addClass(Students.class);//这个需要加上(视频里面没有)
        //创建服务注册对象。
        ServiceRegistry serviceRegistry=new StandardServiceRegistryBuilder()
                .applySettings(config.getProperties()).build(); //通过config.getProperties()读取配置文档。
        //创建会话工厂对象
        sessionFactory=config.buildSessionFactory(serviceRegistry);
        //创建会话对象
        session=sessionFactory.openSession();
        //开启事务
        transaction=session.beginTransaction();
    }
    @After
    public void destory()
    {
        transaction.commit();//提交事务
        session.close();//关闭会话
        sessionFactory.close();//关闭会话工厂
    }

    @Test
    public void testSaveStudents()
    {
        //生成学生对象
    //    Students s=new Students(1,"张三丰","男",new Date(),"武当山");
        Students s=new Students();
        s.setSname("张三丰");
        s.setGender("男");
        s.setAddress("北京");
        s.setBirthday(new Date());
        session.save(s);//保存对象进入数据库
    }

    @Test
    public void testWriteBlob() throws Exception
    {
        Students s=new Students(1,"张三丰","男",new Date(),"武当山");
        //先获得照片文件
        File f=new File("d:"+File.separator+"jee-oxygen"+File.separator+"文档"+File.separator+"Picture"+File.separator+"孙悟空.png");
        //获得照片文件的输入流
        InputStream input=new FileInputStream(f);
        //创建一个Blob对象
        //createBlob(从哪个输入流读取,读取的长度(这里就是输入流可用的字节数))
        Blob image=Hibernate.getLobCreator(session).createBlob(input,input.available());
        //设置照片属性
        s.setPicture(image);
        //保存
        session.save(s);
    }

    @Test
    public void testReadBlob() throws Exception
    {
        //从数据库中获取该条数据的对象
        //get(类.class,主键值为1的数据)
        Students s=session.get(Students.class, 1);
        //获得Blob对象
        Blob image=s.getPicture();
        //获得输入流
        InputStream input=image.getBinaryStream();
        //创建输出流
        File f=new File("D"+File.separator+"孙悟空.png");
        //获得输出流
        OutputStream output=new FileOutputStream(f);
        //创建缓冲区
        byte[] buff=new byte[input.available()];
       //把输入流读取到缓冲区里面
        input.read(buff);
        //把缓冲区的内容写入到输出流
        output.write(buff);
        //File对象就像是一个本地仓库,需要指明仓库的地址,而数据库是相对的另一个仓库
        //,输入流InputStream就像是数据库的专职运输人员,而输出流OutputStream就像是存储的专职运输人员
        //缓冲区byte[] buff就像是输入流和输出流两个运输人员要交接的一个快递柜。
        //如果要把数据读取到数据库,这个操作就要交给输入流运输人员。
        //要把数据读取到本地,就要输出流运输人员来干。
        //对于输入流和输出流来说,要从数据库这个仓库里面的东西放到本地仓库,先由数据库的专职人员拿钥匙从数据库取出来,
        //存放到一个快递柜里面,然后本地的专职运输人员,从快递柜里面,把东西拿出来,放到File这个对象说好的地址。
        //输入流运输人员放东西进入快递柜的操作,叫做read(),输出流把东西从快递柜取出来的操作,叫做write()。
    }
}

对IO操作的个人理解:

       //File对象就像是一个本地仓库,需要指明仓库的地址,而数据库是相对的另一个仓库
        //,输入流InputStream就像是数据库的专职运输人员,而输出流OutputStream就像是存储的专职运输人员
        //缓冲区byte[] buff就像是输入流和输出流两个运输人员要交接的一个快递柜。
        //如果要把数据读取到数据库,这个操作就要交给输入流运输人员。
        //要把数据读取到本地,就要输出流运输人员来干。
        //对于输入流和输出流来说,要从数据库这个仓库里面的东西放到本地仓库,先由数据库的专职人员拿钥匙从数据库取出来,
        //存放到一个快递柜里面,然后本地的专职运输人员,从快递柜里面,把东西拿出来,放到File这个对象说好的地址。
        //输入流运输人员放东西进入快递柜的操作,叫做read(),输出流把东西从快递柜取出来的操作,叫做write()。

运行结果:发现在本地有图片,表示真正存到了数据库,并且被读取到本地。

时间: 2024-10-30 17:51:19

09-hibernate单表操作(1)的相关文章

【Hibernate】(3)Hibernate单表操作

1. 单一主键 这个是在我们生成的Student.hbm.xml中配置的: <hibernate-mapping> <class name="com.thr.bean.Student" table="STUDENT"> <id name="id" type="int"> <column name="ID" /> <generator class=&quo

Hibernate单表操作(四)——组件属性

转载请注明:http://blog.csdn.net/uniquewonderq 1.什么是组件属性呢? 它是指:实体类中的某个属性属于用户自定义的类的对象. 理解起来还是不容易:所以写点代码来说明问题: 首先添加一个地址类: package Entity; //地址类 public class Address { private String postcode;//邮编 private String phone;//电话 private String address;//地址 public A

Hibernate单表操作(二)——基本类型

转载请注明:http://blog.csdn.net/uniquewonderq 基本类型表单列表: 还有另外一张表 以上这些属性可以在 hbm.xml的文档中的type类型进行更改.

Hibernate单表操作(六)——查询记录get()与load()方法区别

转载请注明:http://blog.csdn.net/uniquewonderq 在上一次的案例中,通过get或者load方法得到的结果一样. 既然得到的结果一样, 那么  get和load方法查询记录的区别是什么呢? 区别一: 在不考虑缓存的情况下,get方法会在调用之后立即向数据库发出sql语句,发出selelct语句,去查找这个记录或者说对象,返回本身的持久化对象. load方法会在调用后返回一个代理对象. 该代理对象只保存了实体对象的主键id,直到真正使用对象的非主键属性时才会发出sql

Hibernate单表操作(三)——对象类型

转载请注明:http://blog.csdn.net/uniquewonderq 对象类型: Mysql不支持标准SQL的CLOB类型,在Mysql中使用TEXT,MEDIUMTEXT及LONGTEXT类型来表示长度超过 255的长文本数据. 下面看一个例子来演示: @Test public void testWriteBlob() throws Exception {//写入二进制数据 Students s=new Students(6,"wonderq","男"

Hibernate单表操作(一)——单一主键

assigned由java应用程序负责生成.(手工赋值) native由底层数据库自己主动生成标识符,假设是MySQL就是increment,假设是oracle就是sequence.等等.

hibernate单表映射

什么是Hibernate? ORM:object relationship mapping对象关系映射 hibernate是java领域的一款开源的ORM框架技术. hibernate是对jdbc进行了非常轻量级的对象封装. 1.开发工具:Eclipse Standard Kepler Hibernate Tools for eclipse Plugins Hibernate Tools是由JBoss推出的一个Eclipse综合开发工具插件,该插件可以简化ORM框架Hibernate,以及JBo

Hibernate学习笔记(一)--&gt;数据库单表操作

Hibernate框架是一个全ORM映射框架,是一个非常流行的数据库操作框架之一,现在比较流行的还有MyBatis半ORM映射框架 在MyEclipse IDE开发工具中,可以很轻松的搭建Hibernate框架. 一.搭建一个项目 1.首先在MyEclipse中搭建一个web项目. 2.选中项目右键-->myeclipse-->Project Facets-->找到hibernate.这样就为项目添加了hibernate支持 3.打开hibernate.cfg.xml配置文件,在可视化编

学习MySQL之单表操作(二)

##单表操作 ##创建表 CREATE TABLE t_employee( empno INT(11), ename VARCHAR(20), job VARCHAR(40), MGR INT(11), Hiredate DATE DEFAULT '0000-00-00', sal DOUBLE(10,2), comm DOUBLE(10,2), deptno INT(11), UNIQUE INDEX uk_empno(empno) ##使用唯一索引 ); ##增 INSERT INTO t_