Hibernate本质上就是对JDBC的封装
在使用Hibernate的时候,我们需要先书写hibernate.cfg.xml文件,在这个文件中包含了我们所需要连接的数据库的账号密码,以及jdbc驱动名称,以及数据库的url,还有Hibernate相关设置.
这是我写的一个hibernate.cfg.xml文件
<hibernate-configuration>
<session-factory>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">
<![CDATA[
jdbc:mysql://localhost:3306/hibernate? useUnicode=true&characterEncoding=utf8
]]>
</property>
<property name="show_sql">true </property>
<property name="format_sql">true</property>
<property name="hbm2ddl.auto">create</property>
<property name="hibernate.current_session_context_class">thread</property>
<mapping resource="entity/Students.hbm.xml" />
<mapping resource="entity/Classes.hbm.xml" />
</session-factory>
</hibernate-configuration>
在配置文件中,前面的4个属性是jdbc相关配置,而show_sql以及format_sql是在Hibernate执行sql语句的时候进行sql格式化输出,hbm2ddl.auto 是在执行sql语句对数据库的操作,当使用create的时候,在sql语句执行之前会重新创建一次表结构,update对表结构进行更新,
hibernate.current_session_context_class属性是当我们获取session的时候可以通过getCurrentSission来获取session
提到了获取session,这里就扩展下获取session的两种方法区别
1 getCurrentSession创建的session会和绑定到当前线程,而openSession不会。
2 getCurrentSession创建的线程会在事务回滚或事物提交后自动关闭,而openSession必须手动关闭
而mapping-resource是对我们书写的hbm.xml进行加载
下面就是连个bean类,是一个一对多关系的类
第一个教室类
public class Classes implements Serializable {
private int cid;
private String cname;
private String cdesc;
private List<Students> students;
public Classes() {
}
public Classes(String cname, String cdesc, List<Students> students) {
this.cname = cname;
this.cdesc = cdesc;
this.students = students;
}
public int getCid() {
return cid;
}
public void setCid(int cid) {
this.cid = cid;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
public String getCdesc() {
return cdesc;
}
public void setCdesc(String cdesc) {
this.cdesc = cdesc;
}
public List<Students> getStudents() {
return students;
}
public void setStudents(List<Students> students) {
this.students = students;
}
}
学生类
public class Students implements Serializable {
private int sid;
private String sname;
private String gender;
public Students() {
}
public Students(String sname, String gender) {
super();
this.sname = sname;
this.gender = gender;
}
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;
}
}
对应的hbm.xml文件
classes.hbm.xml
<hibernate-mapping>
<class name="entity.Classes" table="classes">
<id name="cid" >
<generator class="native" />
</id>
<property name="cname" type="java.lang.String"></property>
<property name="cdesc" type="java.lang.String"></property>
<list name="students" table="students">
<key column="cid"></key>
<list-index column="sid" />
<one-to-many class="entity.Students"/>
</list>
</class>
</hibernate-mapping>
因为在classes类中我们使用的是list对学生的记录,所以在hbm.xml文件中我们用list属性,其中table对应的多的表的名字,key column 指的是在students表中的外键 list index colum对应的是对应的多的表中的主键,one-to-many就是指向多的表的实体类
students.hbm.xml
<hibernate-mapping>
<class name="entity.Students" table="students">
<id name="sid" >
<generator class="native" />
</id>
<property name="sname" type="java.lang.String"></property>
<property name="gender" type="java.lang.String"></property>
</class>
</hibernate-mapping>