1.导入相关jar。 2.新建resource文件夹,在该文件夹下创建hibernate.cfg.xml
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- 数据库URL --> <property name="connection.url">jdbc:mysql://127.0.0.1:3306/select</property> <property name="connection.username">root</property> <property name="connection.password">root</property> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <!-- 数据库平台:告知hibernate,使用数据库是MySQL平台来生成对应的SQL --> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 设置session的有效范围/上下文:线程内有效 --> <property name="current_session_context_class">thread</property> <!-- 显示自动生成hibernate的SQL --> <property name="show_sql">true</property> <!-- 设置显示sql时,对sql进行格式化 --> <property name="format_sql">true</property> <!-- 告知hibernate,映射文件以及具体文件的位置,有一个要写一个 --> <mapping resource="cn/gf/hibernatedemo/pojo/Dept.hbm.xml"></mapping> </session-factory> </hibernate-configuration>3.创建pojo包,以及包中的实体类、实体类映射文件。
Dept.java
package cn.gf.hibernatedemo.pojo; import java.io.Serializable; public class Dept implements Serializable{ /** * */ private static final long serialVersionUID = 1L; private String deptno; private String dname; private String loc; public String getDeptno() { return deptno; } public void setDeptno(String deptno) { this.deptno = deptno; } public String getDname() { return dname; } public void setDname(String dname) { this.dname = dname; } public String getLoc() { return loc; } public void setLoc(String loc) { this.loc = loc; } }Dept.hbm.xml
<?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="cn.gf.hibernatedemo.pojo.Dept" table="dept" dynamic-update="true"><!-- name:实体类的名字 ; table:数据库中的表--> <!-- 主键也是使用ID标签进行关联映射 --> <id name="deptno" column="deptno" type="java.lang.String"> <!-- type:指定该实体类在java中的类型 --> <!-- 设置主键的自动生成:assigned:有用户自己赋值插入主键 --> <generator class="assigned"></generator> </id> <property name="dname" column="dname" type="java.lang.String"></property> <property name="loc" column="loc" type="java.lang.String"></property> </class> </hibernate-mapping>4.创建Dao层: 4.1编写工具类HibernateUtil.java
package cn.gf.hibernatedemo.dao; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.classic.Session; public class HibernateUtil { //属性常量:可以声明后再赋值。局部常量:声明的时候就要赋值、 //声明hibernate配置类对象。 private static Configuration configuration; //声明SessionFactory:创建session private final static SessionFactory sessionFactory; static { //1.在new的同时调用该对象的方法,就已经利用dom4j去读取了hibernate.cfg.xml配置文件并创建配置对象 configuration = new Configuration().configure(); //2.通过配置类对象 创建工厂对象 sessionFactory = configuration.buildSessionFactory(); } //外界调用该方法获取 session public static Session getSession() { //3.通过工厂对象获取session,通过session就可以进行增删改查 return sessionFactory.getCurrentSession(); } //总体步骤: //1,通过配置类获取配置对象。 //2,通过配置对象创建工厂。 //3,通过工厂获取session。 }4.2编写工具类的父类BaseDao.java,让所有的实体类dao都继承该类,从这里获取session(该类可写可不写)。
package cn.gf.hibernatedemo.dao; import org.hibernate.classic.Session; public class BaseDao { //类只有两种修饰符:public 、默认。 //方法可有的修饰符:public 、protected、 private 、默认(和属性相同) public Session getSession() { return HibernateUtil.getSession(); } //什么叫变量??? //变量就是一块内存空间。 //变量三要素:数据类型; 变量名:地址; 变量值:地址中的值。 }4.3编写DeptDao.java
package cn.gf.hibernatedemo.dao; import java.io.Serializable; import cn.gf.hibernatedemo.pojo.Dept; public class DeptDao extends BaseDao{ //添加部门的方法 public void addDept(Dept dept) { //获取session,调用session的save()方法即可完成添加 super.getSession().save(dept); } //更改部门 public void updateDept(Dept dept) { super.getSession().update(dept); } //获取单个对象的方法1 public Dept getDept(Serializable dno) { Dept dept = (Dept)super.getSession().get(Dept.class, dno); return dept; } //获取单个对象的方法2 public Dept loadDept(Serializable dno) { Dept dept = (Dept)super.getSession().get(Dept.class, dno); return dept; } //删除部门 public void deleteDept(Dept dept) { super.getSession().delete(dept); } }5.编写DeptService.java
package cn.gf.hibernatedemo.service; import java.io.Serializable; import org.hibernate.Transaction; import cn.gf.hibernatedemo.dao.DeptDao; import cn.gf.hibernatedemo.pojo.Dept; public class DeptService { private DeptDao dd = new DeptDao(); //添加方法 public boolean addDept(Dept dept) { //添加需要事务,声明一个事务对象,赋值为null,一会儿通过session得到 Transaction tr = null; try { //通过dd的父类的getSession()的beginTransaction()获取事务对象,该事务对象和dao中的是同一个事务 tr = dd.getSession().beginTransaction(); dd.addDept(dept); //提交事务 tr.commit(); //使用完毕后关闭session dd.getSession().close(); return true; }catch(Exception ex){ tr.rollback(); return false; } } //更改部门方式1:直接更改部门 public boolean updateDept(Dept dept) { Transaction tx = null; try { tx = dd.getSession().beginTransaction(); dd.updateDept(dept); tx.commit(); dd.getSession().close(); return true; } catch (Exception e) { // TODO: handle exception if(tx!=null) { tx.rollback(); } return false; } } //更改部门方式2:把部门查询出来通过访问器在这个方法中更改 public boolean updateDept2(Dept dept) { Transaction tr = null; //声明事务对象 try { tr = dd.getSession().beginTransaction(); //获取事务对象 Dept dept2 = dd.getDept(dept.getDeptno()); //通过传入的部门编号查询出来这个部门 dept2.setDname(dept.getDname()); //因为仍然在这个事务里,在这里直接修改属性即可改变数据库表中的值 dept2.setLoc(dept.getLoc()); tr.commit(); //提交事务 dd.getSession().close(); //关闭session,节省数据库的连接资源 return true; } catch (Exception e) { // TODO: handle exception tr.rollback(); //回滚事务 return false; } } //删除部门 public boolean deleteDept(Dept dept) { Transaction tr = null; try { tr = dd.getSession().beginTransaction(); dd.deleteDept(dept); tr.commit(); dd.getSession().close(); return true; } catch (Exception e) { // TODO: handle exception if(tr!=null) { tr.rollback(); } return false; } } }6.编写测试类
package cn.gf.hibernatedemo.test; import cn.gf.hibernatedemo.pojo.Dept; import cn.gf.hibernatedemo.service.DeptService; public class Test { DeptService ds = new DeptService(); public static void main(String[] args) { Test test = new Test(); //test.addDept(); /*控制台: * Hibernate: insert into dept (dname, loc, deptno) values (?, ?, ?) 添加成功 ************************/ //test.updateDept(); /* 控制台: Hibernate: update dept set dname=?, loc=? where deptno=? 更改成功 ************************/ //test.updateDept2(); /*控制台: * Hibernate: select dept0_.deptno as deptno0_0_, //dept0是hibernate自己起的别名 dept0_.dname as dname0_0_, dept0_.loc as loc0_0_ from dept dept0_ where dept0_.deptno=? Hibernate: update dept set dname=?, loc=? where deptno=? 更改成功 */ test.deleteDept(); /* * Hibernate: select dept_.deptno, dept_.dname as dname0_, dept_.loc as loc0_ from dept dept_ where dept_.deptno=? Hibernate: delete from dept where deptno=? 删除成功 */ } //添加部门 public void addDept() { Dept dept = new Dept(); dept.setDeptno("ceshi002"); dept.setDname("测试001"); dept.setLoc("流浪中。。。"); boolean res = ds.addDept(dept); if(res) { System.out.println("添加成功"); }else { System.out.println("添加失败"); } } //更改部门1 public void updateDept() { Dept dept = new Dept(); dept.setDeptno("ceshi001"); dept.setDname("测试部001"); dept.setLoc("游离中。。。"); boolean res = ds.updateDept(dept); if(res) { System.out.println("更改成功"); }else { System.out.println("更改失败"); } } //更改部门2 public void updateDept2() { Dept dept = new Dept(); dept.setDeptno("ceshi001"); dept.setDname("测试部009991"); dept.setLoc("无家可归。。。"); boolean res = ds.updateDept2(dept); if(res) { System.out.println("更改成功"); }else { System.out.println("更改失败"); } } //删除部门 public void deleteDept() { Dept dept = new Dept(); dept.setDeptno("ceshioo1"); boolean res = ds.deleteDept(dept); if(res) { System.out.println("删除成功"); }else { System.out.println("删除失败"); } } }