Hibernate是对java领域的一款开源的ORM框架技术
Hibernate对JDBC进行了非常轻量级的对象封装
创建Hibernate的配置XML文件(固定格式)
<session-factory>
? ?<property ?name="connection.uername">root</property>
? ?<property ?name="connection.password">root</property>
? ?<property ?name="connection.driver_class">com.mysql.jdbc.Driver</property>
? ?<property ?name="connection.url">jdbc:mysql:///hibernate?useUnicode=true&characterEncoding=UTF-8</property>
? ?<property ?name="dialect">org.hibernate.dialect.MySQLDialect</property>
? ? ?<property ?name="show_sql">true</property>
? ? ?<property ?name="format_sql">true</property>
? ? ?<property ?name="hbm2ddl.auto">create|</property>
? ? ? <mapping ?resource="Student.hbm.xml"/>
</session-factory>
同过Hibernate API编写访问数据库的代码
?init(){
Configuration ?config=new Configuration().configure();//创建配置对象
SweviceRegistry serviceRegistry=new ServiceRegistryBuilder().applaySettings(config.getProperties()).buildServiceRegistry();//创建服务注册对象
SessionFactory sessionFactory=config.buildSessionFactory(serviceRegistry);//创建回话工厂对象
Session session=sessionFactory.openSession();//会话对象
transaction=session.beginTrasaction();//打开事务
}
? destroy(){
transaction.commit();//提交事务
session.close();//关闭会话
sessionFactory.close();//关闭会话工厂
}
save() ?delete(S) ?update(S) ?get(Students.class,1) ? createQuery()
Session详解
如何获得session对象??
1)openSession(session.close()手动关闭)
2)getCurrectSession(自动关闭)
注意: 如果使用getCurrectionSession需要在hibernate.cfg.xml文件中进行配置
? 如果是本地事务(jdbc事务)
? <propertyname="hibernate.currect_session_context_class">thread</property>
? 如果是全局事务(jta事务)
? <propertyname="hibernate.currect_session_context_class">jta</property>
映射xml文件
<id>//充当主键功能
? name="PropertyName"
? type=""
? column=""
? length=""
? ?<genterator class=""/>//主键生成策略 ? //assigned由java程序手工赋值
</id>
实体类中的某个属性属于用户自定义的类的对象
<property ?name="sname" ?type="java.util.String">
? ?<column ?name="SNAME">
</property>
<component name="address" ?class="Address">
? <property name="postcode" ?column="POSTCODE"></property>
? <property name="phone" ?column="PHONES"></property>
? <property name="address" ?column="ADDRESS"></property>
</component>
</component>
get与load的区别
在不考虑缓存的情况下,get方法会在调用以后返回一个持久化对象
load返回一个代理对象,在使用对象属性的时候才会发出sql语句
当查询的数据库中不存在时候,get返回null,load抛出异常
<!--配置单向的一对多关联关系-->
<set name="属性名称" ?table="对应数据库中表的名字">
? ?<!--指定关联的外键列-->
? ?<key ?coiumn="gid"></key>
? ?<one-to-many ? class="com.imooc.entity.Student">
</set>
<!--配置多对一的关联关系-->
<many-to-one ?name="grade" ?class="com.imooc.entity.Grade" ? column="gid"> </many>
必须在XML中指定映射文件
<mapping ?resource="com/imooc/entity/Grade.hbm.xml"/>
HibernateUtil工具类
package until;
import javax.imageio.spi.ServiceRegistry;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
private static SessionFactory sessionFactory;
private static Session session;
static{
Configuration ?config=new Configuration().configure();//创建配置对象
StandardServiceRegistryBuilder ssrb=newStandardServiceRegistryBuilder().applySettings(config.getProperties());
StandardServiceRegistry ssr=ssrb.build();
sessionFactory=config.buildSessionFactory(ssr);
}
//获得回话工厂对象
public static SessionFactory getSessionFacory(){
return sessionFactory;
}
//获得Session对象
public static Session getSession(){
return (Session) sessionFactory.openSession();
}
//关闭Session
public static void closeSession(Session session){
if(session!=null){
session.close();
}
}
}
需要在一中创建一个多的Map对象 ?Map<Student> students=new HashMap<Student>();
<!-- 配置一对多关联关系 -->
<set name="一对多中一中Map属性的名称" table="一对多中多类对应的表的名称">
<key column="一对多中一中的主键的column"></key>
<one-to-many class="com.imooc.entity.Student一对多中多类的全名"/>
</set>
<!-- 配置一对多关联关系 -->
<set name="students" table="student">
<key column="gid"></key>
<one-to-many class="com.imooc.entity.Student"/>
</set>
多对一中需要在多中创建一个多的对象 ? private Grade ?grade; ?(javabean原则)?
<!-- 配置多对一关联关系 -->
<many-to-one name="grade" class="com.imooc.entity.Grade" column="gid" cascade="all"></many-to-one>
<!-- 配置多对一关联关系 -->
<many-to-one name="多对一中一对象的属性的名称" class="一对象的类的全名" column="外键的列名" cascade="all"></many-to-one>