【Hibernate框架学习】:Hibernate进阶之单表操作

       单一主键

       这里只是简单介绍有关MySQL的主键生成策略,包括连个常用的:

       assingned:由Java应用程序负责生成(手工赋值)

       native:由底层数据库自动生成标示符,如果是MySQL就是increment,如果是Oracle就是sequence,等等。

       我们来看例子:

       对象关系映射配置文件中配置:

        <id name="sid" type="int">
            <!-- 主键生成策略 -->
            <generator class="assigned" /> 
        </id>

       这个不再演示,我们在前面的代码已经使用了很多次,如果我们不设置主键,那么插入数据的时候会报错,主键

冲突,在空的数据表中插入的时候不会报错,因为整型默认值为0,因此主键是0,但是以后插入数据报错。

       对象关系映射配置文件中配置:

       <id name="sid" type="int">
            <!-- 主键生成策略 -->
            <generator class="assigned" /> 
        </id>

       我们重新生成一张数据表students,然后测试:

    @Test
    public void testStudent(){             
            Students s =new Students();
            s.setSname("张三");
            s.setGender("男");
            s.setBirthday(new Date());
            s.setAddress("北京");
            session.save(s);//保存对象进入数据库 
    }

       数据库显示:

       

       基本类型

       HIbernate框架的基本类型:

       

       关于时间日期的基本类型:

       

       在进行对象关系映射配置的时候尤其注意date类型和timestamp类型。

       对象类型

       HIbernate对象类型:

       

       MySQL不支持标准SQL的CLOB类型,在MySQL中,用TEXT,MEDIUMTEXT及LONGTEXT类型来表示长度超

过255的长文本数据。

       我们来一个例子:

       StudentInfo实体类:

package com.demo.domain;

import java.sql.Blob;

/**
 * 学生实体类
 * @author Administrator
 * @date 2016年12月3日
 */
public class StudentsInfo {
	
	private int sid;
	private String sname;
	private Blob picture;//Blob类型
	
	public StudentsInfo(){
		
	}

	public StudentsInfo(int sid, String sname, Blob picture) {
		this.sid = sid;
		this.sname = sname;
		this.picture = picture;
	}



	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 Blob getPicture() {
		return picture;
	}

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

	@Override
	public String toString() {
		return "StudentsInfo [sid=" + sid + ", sname=" + sname + ", picture=" + picture + "]";
	}
	
}

       对象关系映射文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
	<class name="com.demo.domain.StudentsInfo" table="studentInfo">
		<id name="sid" type="int">
			<generator class="assigned"/>
		</id>
		<property name="sname" type="java.lang.String"/>
		<property name="picture" type="java.sql.Blob"/>
	</class>
</hibernate-mapping>

       测试类:

package com.demo.test;

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 org.hibernate.Hibernate;
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 org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.demo.domain.StudentsInfo;

public class TestStudents2 {
	
	private SessionFactory sessionFactory;
	private Session session;
	private Transaction transaction;
	
	@Before
	public void init() {
		//创建配置对象
        Configuration config =new Configuration().configure();
        //创建服务注册对象
        ServiceRegistry ServiceRegitry=new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
        //创建会话工厂对象
        sessionFactory =config.buildSessionFactory(ServiceRegitry);
        //会话对象
        session =sessionFactory.openSession();
        //开启事务
        transaction = session.beginTransaction();
        
	}
	
    @Test
    public void testWriteBlob() throws Exception
    {             
            StudentsInfo s =new StudentsInfo();
            s.setSid(1);
            s.setSname("卡通");
            //获取照片文件
            File file = new File("d:" + File.separator + "timg.jpg" );
            InputStream input = new FileInputStream(file);
            //创建Blob对象
            Blob image = Hibernate.getLobCreator(session).createBlob(input, input.available());
            
            s.setPicture(image);
            session.save(s);//保存对象进入数据库  
            
    }
    
    @Test
    public void testReadBlob() throws Exception{
    	StudentsInfo studentsInfo = (StudentsInfo) session.get(StudentsInfo.class, 1);
    	Blob image = studentsInfo.getPicture();
    	//获取照片输入流
    	InputStream input = image.getBinaryStream();
    	//创建输出流
    	File file = new File("d:" + File.separator + "copy.jpg");
    	OutputStream output = new FileOutputStream(file);
    	//创建缓冲区
    	byte[] buff = new byte[input.available()];
    	input.read(buff);
    	output.write(buff);
    	input.close();
    	output.close();
    	
    }
    
    @After
    public void destory(){
    	transaction.commit();//提交事务
    	session.close();//关闭会话
    	sessionFactory.close();//关闭会话工厂
    	
    }
    
}

       测试结果:

       

       组件属性

       实体类中的某个属性用于用户自定义的类的对象。

       我们来看例子:

       Address实体类:

package com.demo.domain;

public class Address {
	private String postCode;
	private String phone;
	private String address;
	
	public  Address() {
				
	}

	public Address(String postCode, String phone, String address) {
		this.postCode = postCode;
		this.phone = phone;
		this.address = address;
	}

	public String getPostCode() {
		return postCode;
	}

	public void setPostCode(String postCode) {
		this.postCode = postCode;
	}

	public String getPhone() {
		return phone;
	}

	public void setPhone(String phone) {
		this.phone = phone;
	}

	public String getAddress() {
		return address;
	}

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

       User实体类:

package com.demo.domain;


public class User {
	private int id;
	private String name;
	private Address address;
	
	public User(){
		
	}

	public User(int id, String name, Address address) {
		this.id = id;
		this.name = name;
		this.address = address;
	}

	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 Address getAddress() {
		return address;
	}

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

	@Override
	public String toString() {
		return "User [id=" + id + ", name=" + name + ", address=" + address + "]";
	}
	
}

       对象关系映射文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
	<class name="com.demo.domain.User" table="userinfo">
		<id name="id" type="int">
			<generator class="assigned"/>
		</id>
		<property name="name" type="java.lang.String"/>
		<component name="address" class="com.demo.domain.Address">
                     <property name="postCode" type="java.lang.String"/>
                     <property name="phone" type="java.lang.String" />
                     <property name="address" type="java.lang.String" />
                </component>
       </class>
</hibernate-mapping>

       测试类:

package com.demo.test;

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 org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.demo.domain.Address;
import com.demo.domain.User;

public class TestUser {
	
	private SessionFactory sessionFactory;
	private Session session;
	private Transaction transaction;
	
	@Before
	public void init() {
		//创建配置对象
        Configuration config =new Configuration().configure();
        //创建服务注册对象
        ServiceRegistry ServiceRegitry=new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
        //创建会话工厂对象
        sessionFactory =config.buildSessionFactory(ServiceRegitry);
        //会话对象
        session =sessionFactory.openSession();
        //开启事务
        transaction = session.beginTransaction();
        
	}
	
    @Test
    public void testUser()
    {             
           Address address = new Address("056100","13002001111","北京市");
           User user = new User(1,"张三",address);   
           session.save(user);
    }
    
    @After
    public void destory(){
    	transaction.commit();//提交事务
    	session.close();//关闭会话
    	sessionFactory.close();//关闭会话工厂
    	
    }
    
}

       测试结果:

       

       关于单表操作基本就想到这些。
       
    


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值