单一主键
这里只是简单介绍有关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();//关闭会话工厂
}
}
测试结果:
关于单表操作基本就想到这些。