单表操作
save ,update,delete,get/load(查询单个记录)
get与load的区别
区别一:
在不考虑缓存的情况下,get方法会在调用之后立即向数据库发出sql语句,返回持久化对象。
load方法会在调用返回一个代理对象
该代理对象只保存了实体对象的id,直到使用对象的非主键属性时才会发出sql语句,
区别二:
查询数据库中不存在的数据时,get方法返回null,load方法抛出异常ObjectNotFoundException
测试方法(测试之前请把表生成策略改为update),查看主键的生成策略是不是assigned,关于主键的生成策略请回顾前几节。(注意主键的生成策略更改后要重新生成表结构)
@Test
public void testSaveStudents(){
//Student s = new Student(1, "小明", new Date(), "北京xxxx街道5号楼201");
Student s = new Student();
s.setId(100);
s.setName("小明");
s.setBirthday(new Date());
//s.setAddress("123");
Address address = new Address("88554","125552","杭州");
s.setAddress(address);
session.save(s);//保存对象到数据库
}
@Test
public void testGetStudent(){
Student s = (Student) session.get(Student.class, 10);//第一个参数是类类型,第二个参数是主键
System.out.println(s);
}
@Test
public void testLoadStudent(){
Student s = (Student) session.load(Student.class, 10);//第一个参数是类类型,第二个参数是主键
System.out.println(s);
}
@Test
public void testUpdateStudent(){
Student s = (Student) session.get(Student.class, 100);//第一个参数是类类型,第二个参数是主键
s.setAddress(new Address("001","002","北京"));
session.update(s);
System.out.println(s);
}
@Test
public void testDeleteStudent(){
Student s = (Student) session.get(Student.class, 100);//第一个参数是类类型,第二个参数是主键
session.delete(s);
}
@After
public void destory(){
transaction.commit();//提交事务
session.close();//关闭会话
sessionFactory.close();//关闭会话工厂
}
测试类:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Blob;
import java.sql.SQLException;
import java.util.Date;
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;
public class StudentTest {
private SessionFactory sessionFactory;
private Session session;
private Transaction transaction;
@Before
public void init(){
//创建配置对象
Configuration config = new Configuration().configure();
//创建服务注册对象
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
//创建会话工厂对象
sessionFactory = config.buildSessionFactory(serviceRegistry);
//会话对象
session = sessionFactory.openSession();
//开启事务
transaction = session.beginTransaction();
}
@Test
public void testSaveStudents(){
//Student s = new Student(1, "小明", new Date(), "北京xxxx街道5号楼201");
Student s = new Student();
s.setId(100);
s.setName("小明");
s.setBirthday(new Date());
//s.setAddress("123");
Address address = new Address("88554","125552","杭州");
s.setAddress(address);
session.save(s);//保存对象到数据库
}
@Test
public void testGetStudent(){
Student s = (Student) session.get(Student.class, 10);//第一个参数是类类型,第二个参数是主键
System.out.println(s);
}
@Test
public void testLoadStudent(){
Student s = (Student) session.load(Student.class, 10);//第一个参数是类类型,第二个参数是主键
System.out.println(s);
}
@Test
public void testUpdateStudent(){
Student s = (Student) session.get(Student.class, 100);//第一个参数是类类型,第二个参数是主键
s.setAddress(new Address("001","002","北京"));
session.update(s);
System.out.println(s);
}
@Test
public void testDeleteStudent(){
Student s = (Student) session.get(Student.class, 100);//第一个参数是类类型,第二个参数是主键
session.delete(s);
}
@After
public void destory(){
transaction.commit();//提交事务
session.close();//关闭会话
sessionFactory.close();//关闭会话工厂
}
}