Hibernate框架应用在Javaee三层结构中的dao层架构 在dao层里对数据库增删改查操作,使用hibernate实现增删改查操作,hibernate底层代码就是jdbc,hibernate对jdbc进行封装,使用hibernate的好处就是不需要写复杂的jdbc代码了。
核心配置文件格式xml 核心配置文件名称和位置是固定的 位置必须在src下 名称必须为hibernate.cfg.xml 配置dtd约束 实现添加操作 第一步:加载hibernate核心配置文件
Configuration cfg=new Configuration(); cfg.configure();第二步:创建sessionfactory对象
SessionFactory sessionFactory = cfg.buildSessionFactory();第三步:使用sessionfactory创建session对象
Session session =sessionFactory.openSession();第四步:开启事务
Transaction tx=session.beginTransaction();第五步:写具体的增删查改操作
User user=new User(); user.setUsername("黄瑞生A"); user.setPassword("345"); user.setAddress("青秀"); session.save(user);第六步:提交事务
tx.commit();第七步:关闭资源
session.close(); sessionFactory.close();(1)到src下面找到名称hibernate.cfg.xml配置文件,创建对象,把配置文件放到对象里面(加载核心配置文件)
1 hibernate要求实体类里面有一个属性作为唯一值,对应表主键,主键可以不同生成策略 2. hibernate主键生成策略有很多的值
<generator class=”native”></generator>(1) native:根据使用的数据库帮选择用哪个值 (2) uuid:之前web阶段要我们写代码生成uuid值,配置了uuid以后hibernate帮我们生成一个uuid值
1.调用session里面的get方法进行查询
//第一个参数:实体类的class 第二个参数:id值 User user = session.get(User.class, "1"); System.out.println(user);1.调用session里面的update方法进行修改
//先查询出来再修改 User user = session.get(User.class, 2); //向返回的user对象里面设置要修改的值 user.setUsername("皮某人"); //调用session的方法update进行修改 session.update(user); System.out.println(user);1.调用session的delete方法 //4.先查询出来再删除 //修改uid=2记录的username值 //先查询出来再删除
User user = session.get(User.class, 1); session.delete(user); System.out.println(user);在创建sessionfactory的时候,如果此时数据库里没有表hibernate会帮我们在这时创建表,所以在创建sessionfactory的时候效率是非常低占资源非常大的,所以我们在一个项目中最好只创建一个sessionfactory,因此我们可以创建一个工具类hibernateuntils类,把创建sessionfatory的过程写在静态代码块static里,因为静态代码块在类进行加载的时候会执行并且只执行一次,然后提供getsessionfactory方法,以后需要使用就可以调用hibernateutils工具类的方法即可获得sessionfactory对象了
package com.hrs.utils; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateUtils {//静态代码块实现 static SessionFactory SessionFactory= null; static Configuration cfg=null; static { cfg=new Configuration(); cfg.configure(); SessionFactory=cfg.buildSessionFactory(); } //提供一个方法返回sessionfactory public static SessionFactory getSessionFactory() { return SessionFactory; } }一对多关系映射配置: 第一步:创建实体类 客户实体类:
package com.hrs.entity; import java.util.HashSet; import java.util.Set; public class Customer { private Integer cid; //客户名称 private String custName; //客户级别 private String custLevel; //客户来源 private String custSource; //客户电话 private String custPhone; //客户手机号 private String custMobile; @Override public String toString() { return "Customer [cid=" + cid + ", custName=" + custName + ", custLevel=" + custLevel + ", custSource=" + custSource + ", custPhone=" + custPhone + ", custMobile=" + custMobile + ", setLinkman=" + setLinkman + "]"; } //在客户实体类里面表示多个联系人,一个客户有多个联系人 //hibernate要求使用集合表示多的数据,使用set集合 private Set<Linkman> setLinkman=new HashSet<Linkman>(); public Set<Linkman> getSetLinkman() { return setLinkman; } public void setSetLinkman(Set<Linkman> setLinkman) { this.setLinkman = setLinkman; } public Integer getCid() { return cid; } public void setCid(Integer cid) { this.cid = cid; } public String getCustName() { return custName; } public void setCustName(String custName) { this.custName = custName; } public String getCustLevel() { return custLevel; } public void setCustLevel(String custLevel) { this.custLevel = custLevel; } public String getCustSource() { return custSource; } public void setCustSource(String custSource) { this.custSource = custSource; } public String getCustPhone() { return custPhone; } public void setCustPhone(String custPhone) { this.custPhone = custPhone; } public String getCustMobile() { return custMobile; } public void setCustMobile(String custMobile) { this.custMobile = custMobile; } }Linkman实体类:
package com.hrs.entity; public class Linkman { private Integer lkm_id;//联系人编号(主键) private String lkm_name;//联系人姓名 private String lkm_gender;//联系人性别 private String lkm_phone;//联系人电话 //在联系人实体类里面表示所属客户 private Customer customer; public Customer getCustomer() { return customer; } public void setCustomer(Customer customer) { this.customer = customer; } public Integer getLkm_id() { return lkm_id; } public void setLkm_id(Integer lkm_id) { this.lkm_id = lkm_id; } public String getLkm_name() { return lkm_name; } public void setLkm_name(String lkm_name) { this.lkm_name = lkm_name; } public String getLkm_gender() { return lkm_gender; } public void setLkm_gender(String lkm_gender) { this.lkm_gender = lkm_gender; } @Override public String toString() { return "Linkman [lkm_id=" + lkm_id + ", lkm_name=" + lkm_name + ", lkm_gender=" + lkm_gender + ", lkm_phone=" + lkm_phone + ", customer=" + customer + "]"; } public String getLkm_phone() { return lkm_phone; } public void setLkm_phone(String lkm_phone) { this.lkm_phone = lkm_phone; } }第二步:让两个实体类之间互相表示 在linkman表示customer:
private Customer customer; public Customer getCustomer() { return customer; } public void setCustomer(Customer customer) { this.customer = customer; }在customer表示linkman:
private Set<Linkman> setLinkman=new HashSet<Linkman>(); public Set<Linkman> getSetLinkman() { return setLinkman; } public void setSetLinkman(Set<Linkman> setLinkman) { this.setLinkman = setLinkman; }第三步:配置实体类映射关系 customer映射配置:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <!-- 配置类和表对应 class标签 name属性:实体类全路径 table属性:数据库表名称 --> <class name="com.hrs.entity.Customer" table="t_customer"> <id name="cid" column="cid" type="java.lang.Integer"> <generator class="native"></generator> </id> <property name="custName" column="custName" type="java.lang.String"></property> <property name="custLevel" column="custLevel" type="java.lang.String"></property> <property name="custSource" column="custSource" type="java.lang.String"></property> <property name="custPhone" column="custPhone" type="java.lang.String"></property> <property name="custMobile" column="custMobile" type="java.lang.String"></property> <!-- 在客户映射文件中,表示所有联系人 使用set标签使用所有联系人,set标签里面有name属性, 属性值写在客户实体类里面表示联系人的set集合名称 --> <set name="setLinkman"> <!-- 一对多建表有外键,hibernate机制:双向维护外键,在一和多的那一方都配置外键 column属性值:外键名称 --> <key column="cid"></key> <!-- 客户所有的联系人,class里面写联系人实体类全路径 --> <one-to-many class="com.hrs.entity.Linkman"></one-to-many> </set> </class> </hibernate-mapping>customer实体类映射配置:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <!-- 配置类和表对应 class标签 name属性:实体类全路径 table属性:数据库表名称 --> <class name="com.hrs.entity.Linkman" table="t_linkman"> <id name="lkm_id" column="lkm_id" type="java.lang.Integer"> <generator class="native"></generator> </id> <property name="lkm_name" column="lkm_name" type="java.lang.String"></property> <property name="lkm_gender" column="lkm_gender" type="java.lang.String"></property> <property name="lkm_phone" column="lkm_phone" type="java.lang.String"></property> <!-- 联系人所属的客户 name属性:因为在联系人实体类使用customer对象表示,写customer名称 class属性:customer全路径名 column属性:外键名称 --> <many-to-one name="customer" class="com.hrs.entity.Customer" column="cid"> </many-to-one> </class> </hibernate-mapping>第四步:配置核心配置文件
<mapping resource="com/hrs/entity/Customer.hbm.xml"></mapping> <mapping resource="com/hrs/entity/Linkman.hbm.xml"></mapping>第一步:创建实体类
第二步:让两个实体类之间互相表示 (1) 一个用户里面表示所有角色,使用set集合
private Set<Role> RoleSet =new HashSet<Role>();(2) 一个角色里面表示所有用户,使用set集合
private Set<User> UserSet=new HashSet<User>();第三步:配置映射关系 (1) 基本配置 (2) 配置多对多关系 Role.hbm.xml:
//name:另一方的集合 table:中间表名称 <set name="UserSet" table="user_role"> //column:本方外键名字 <key column="roleid"></key> //class:另一方实体类全路径名 column:另一方外键名字 <many-to-many class="com.hrs.entity.User" column="useid"></many-to-many> </set>User.hbm.xml:
//name:另一方的集合 table:中间表名称 <set name="RoleSet" table="user_role" > //column:本方外键名字 <key column="userid"></key> //class:另一方实体类全路径名 column:另一方外键名字 <many-to-many class="com.hrs.entity.Role" column="roleid"></many-to-many> </set>第四步:在核心配置文件中引入映射文件
<mapping resource="com/hrs/entity/User.hbm.xml"></mapping> <mapping resource="com/hrs/entity/Role.hbm.xml"></mapping>