1.什么是ORM?为什么使用Hibernate?
对象关系映射;为了少写和底层数据库相关的sql语句,方便程序的维护、修改,提高跨平台性和可扩展性。Hibernate是Java领域内的一款技术成熟稳定的ORM框架
2.Hibernate开发的基本步骤?
(1)新建项目,导入Hibernate必须的架包(点击打开链接),编写配置文档hibernate.cfg.xml;
下面是配置MySql数据库的示例:
<!--该文件的开头信息,对Hibernate而言,该类文件基本都这么开头:)-->
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<!-- 正文开始 -->
<hibernate-configuration>
<!--下面是数据库的基本连接信息,对一个应用来说,设置一个session-factory节点就够了,除非我们中间使用了多个数据库-->
<session-factory>
<!--用户名 -->
<property name="connection.username">root</property>
<!--url信息 -->
<property name="connection.url">jdbc:mysql://localhost:3306/webases</property>
<!--数据库方言信息-->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!--密码 -->
<property name="connection.password">root</property>
<!--数据库驱动信息 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!--指定Hibernate映射文件路径 -->
<mapping resource="com/Hibernate/test_products.hbm.xml" />
</session-factory>
</hibernate-configuration>
(2)编写实体类。注意:每一个实体类都要与数据库中的一张表一一对应,实体类的编写要遵循JavaBean的要求;
1)、必须是公有类。
2)、提供共有的不带参数的默认构造方法。
3)、属性私有。
4)、属性setter/getter封装,以及toString方法。
import java.util.Date;
public class Students {
private int sid;//学号
private String sname;//姓名
private String gender;//
private String Address;//地址
private Date birthday;//生日
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 String getAddress() {
return Address;
}
public void setAddress(String address) {
Address = address;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Students(){
}
public Students(int sid, String sname, String gender, String address, Date birthday) {
this.sid = sid;
this.sname = sname;
this.gender = gender;
Address = address;
this.birthday = birthday;
}
@Override
public String toString() {
return "Students [sid=" + sid + ", sname=" + sname + ", gender=" + gender + ", Address=" + Address
+ ", birthday=" + birthday + "]";
}
}
(3)生成对应实体类的映射文件并添加到配置文档中;
Students.hbm.xml的配置内容
<?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.wangchao.DAO.Students" table="STUDENTS">
<id name="sid" type="int">
<column name="SID"/>
<generator class="assigned" />
</id>
<property name="sname" type="java.lang.String">
<column name="SNAME"></column>
</property>
<property name="gender" type="java.lang.String">
<column name="GENDER"></column>
</property>
<property name="birthday" type="java.util.Date">
<column name="BIRTHDAY"></column>
</property>
<property name="address" type="java.lang.String">
<column name="ADDRESS"></column>
</property>
</class>
</hibernate-mapping>
(4)调用Hibernate API进行测试
使用Junit进行测试要使用到的标签:
@Test:要测试的方法。
@Before:初始化方法(表示在测试前会先执行before方法进行初始化)。
@After:释放资源。
执行次序:@before标签下的方法——>@test方法——>@after释放资源
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;
import com.MyBlog.XYXY.domain.Students;
//测试类
public class StudentsTest{
private SessionFactory sessionFactory;
private Session session;
private Transaction transaction;
@Before
public void init()
{
//创建配置对象
Configuration config = new Configuration().configure();
//创建服务注册对象
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(config.getProperties()).getBootstrapServiceRegistry();
//创建会话工厂对象
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(),"长白山");
session.save(s); //保存对象进入数据库
}
}
3.什么是session?
类似于JDBC里面的connection对象。调用session操作数据库,实际上就是调用connection的各种API函数来实现的。
4.openSession与getCurrentSession的区别?
(1)openSension每次都是创建新的session对象,而getCurrentSenssion使用单例模式,每次创建都是相同的对象。
(2)openSession在使用完毕后需要显式地关闭,而getCurrentSession在事务提交之后会自动关闭。
5.单表操作有哪些常用的方法?
增删改查对应使用session当中的save、delete、update、get/load方法.6.单表操作,查询一条记录时,get和load的区别?
答:get在使用的时候立即发送sql语句,并且获得的是实体类的对象类型,而load只有在使用具体对象的非主键属性的时候才会发送sql语句,而且返回的是一个代理对象。