Hiberate 学习1 基本使用

Top

JAVA Hibernate DAY01

  1. Hibernate基本使用
  2. Hibernate映射类型
  3. 在NETCTOSS中引入Hibernate
  4. 使用Hibernate重构资费DAO

1 Hibernate基本使用

1.1 问题

使用Hibernate实现对员工表的增、删、改、查。

1.2 方案

Hibernate使用步骤:

  1. 导入Hibernate包,以及数据库驱动包。
  2. 引入Hibernate主配置文件hibernate.cfg.xml。
  3. 创建实体类。
  4. 创建映射关系文件。
  5. 使用Hibernate常用API执行增删改查操作。

1.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:准备工作

创建员工表EMP,建表语句如下:


    
    
  1. CREATE TABLE EMP(
  2. ID            NUMBER(4) CONSTRAINT EMP_ID_PK PRIMARY KEY,
  3. NAME        VARCHAR(50) NOT NULL,
  4. AGE        NUMBER(11),
  5. SALARY        NUMBER(7,2),
  6. MARRY         CHAR(1),
  7. BIRTHDAY     DATE,
  8. LAST_LOGIN_TIME    DATE
  9. );
  10. CREATE SEQUENCE emp_seq;

创建一个WEB项目,名为HibernateDay01。

步骤二:导包

导入Hibernate开发包,以及数据库驱动包,完成后项目的包结构如下图:

图-1

步骤三:引入Hibernate主配置文件

将Hibernate主配置文件hibernate.cfg.xml复制到项目中,放在src根路径下。并在主配置文件中配置好数据库连接信息,以及Hibernate框架参数,代码如下:


    
    
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-configuration PUBLIC
  3.         "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  4.         "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
  5. <hibernate-configuration>
  6.     <session-factory>
  7.         <!--数据库连接信息,根据自己的数据库进行配置 -->
  8.         <property name="connection.url">
  9.             jdbc:oracle:thin:@localhost:1521:xe
  10.         </property>
  11.         <property name="connection.username">lhh</property>
  12.         <property name="connection.password">123456</property>
  13.         <property name="connection.driver_class">
  14.             oracle.jdbc.OracleDriver
  15.         </property>
  16.         
  17.         <!-- Hibernate配置信息 -->
  18.         <!-- dialect方言,用于配置生成针对哪个数据库的SQL语句 -->
  19.         <property name="dialect">
  20.             <!--方言类,Hibernate提供的,用于封装某种特定数据库的方言 -->
  21.             org.hibernate.dialect.OracleDialect
  22.         </property>
  23.         <!-- Hibernate生成的SQL是否输出到控制台 -->
  24.         <property name="show_sql">true</property>
  25.         <!--将SQL输出时是否格式化 -->
  26.         <property name="format_sql">true</property>
  27.         
  28.     </session-factory>
  29. </hibernate-configuration>

步骤四:创建实体类

创建包com.tarena.entity,并在该包下创建员工表对应的实体类Emp.java,用于封装员工表的数据,代码如下:


    
    
  1. packagecom.tarena.entity;
  2. importjava.sql.Date;
  3. importjava.sql.Timestamp;
  4. public class Emp {
  5.     private Integer id;
  6.     private String name;
  7.     private Integer age;
  8.     private Double salary;
  9.     private Boolean marry;
  10.     private Date birthday;
  11.     private Timestamp lastLoginTime;
  12.     public Integer getId() {
  13.         return id;
  14.     }
  15.     public void setId(Integer id) {
  16.         this.id = id;
  17.     }
  18.     public String getName() {
  19.         return name;
  20.     }
  21.     public void setName(String name) {
  22.         this.name = name;
  23.     }
  24.     public Integer getAge() {
  25.         return age;
  26.     }
  27.     public void setAge(Integer age) {
  28.         this.age = age;
  29.     }
  30.     public Double getSalary() {
  31.         return salary;
  32.     }
  33.     public void setSalary(Double salary) {
  34.         this.salary = salary;
  35.     }
  36.     public Boolean getMarry() {
  37.         return marry;
  38.     }
  39.     public void setMarry(Boolean marry) {
  40.         this.marry = marry;
  41.     }
  42.     public Date getBirthday() {
  43.         return birthday;
  44.     }
  45.     public void setBirthday(Date birthday) {
  46.         this.birthday = birthday;
  47.     }
  48.     public Timestamp getLastLoginTime() {
  49.         returnlastLoginTime;
  50.     }
  51.     public void setLastLoginTime(Timestamp lastLoginTime) {
  52.         this.lastLoginTime = lastLoginTime;
  53.     }
  54. }

步骤五:创建映射关系文件

在com.tarena.entity包下,创建员工实体类的映射关系文件,名为Emp.hbm.xml,并在该文件中配置实体类和表的关系,以及类中属性和表中字段的关系,代码如下:


    
    
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping>
  6.     <!--配置实体类和表的关系 -->
  7.     <class name="com.tarena.entity.Emp" table="emp">
  8.         <!--配置主键属性和字段的关系 -->
  9.         <id name="id" type="java.lang.Integer" column="id">
  10.             <!--用来指明主键的生成方式 -->
  11.             <generator class="sequence">
  12.                 <!--指定用于生成主键的sequence -->
  13.                 <param name="sequence">emp_seq</param>
  14.             </generator>
  15.         </id>
  16.         
  17.         <!--配置实体类中属性与表中字段的关系 -->
  18.         <property name="name"
  19.             type="java.lang.String" column="name"/>
  20.         <property name="age"
  21.             type="java.lang.Integer" column="age"/>
  22.         <property name="salary"
  23.             type="java.lang.Double" column="salary"/>
  24.         <property name="birthday"
  25.             type="java.sql.Date" column="birthday"/>
  26.         <property name="lastLoginTime"
  27.             type="java.sql.Timestamp" column="last_login_time"/>
  28.     </class>
  29. </hibernate-mapping>

注意,先不要配置布尔型属性marry,后面会单独讲解布尔型属性的配置及使用。

步骤六:声明映射关系文件

在主配置文件hibernate.cfg.xml中,声明映射关系文件Emp.hbm.xml,代码如下:


    
    
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-configuration PUBLIC
  3.         "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  4.         "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
  5. <hibernate-configuration>
  6.     <session-factory>
  7.         <!--数据库连接信息,根据自己的数据库进行配置 -->
  8.         <property name="connection.url">
  9.             jdbc:oracle:thin:@localhost:1521:xe
  10.         </property>
  11.         <property name="connection.username">lhh</property>
  12.         <property name="connection.password">123456</property>
  13.         <property name="connection.driver_class">
  14.             oracle.jdbc.OracleDriver
  15.         </property>
  16.         
  17.         <!-- Hibernate配置信息 -->
  18.         <!-- dialect方言,用于配置生成针对哪个数据库的SQL语句 -->
  19.         <property name="dialect">
  20.             <!--方言类,Hibernate提供的,用于封装某种特定数据库的方言 -->
  21.             org.hibernate.dialect.OracleDialect
  22.         </property>
  23.         <!-- Hibernate生成的SQL是否输出到控制台 -->
  24.         <property name="show_sql">true</property>
  25.         <!--将SQL输出时是否格式化 -->
  26.         <property name="format_sql">true</property>
  27.         
  28.         <!--声明映射关系文件 -->
  29.         <mapping resource="com/tarena/entity/Emp.hbm.xml" />
  30.     </session-factory>
  31. </hibernate-configuration>

步骤七:创建Session工具类

创建HibernateUtil工具类,用于创建Session对象,代码如下:


    
    
  1. packagecom.tarena.util;
  2. importorg.hibernate.Session;
  3. importorg.hibernate.SessionFactory;
  4. importorg.hibernate.cfg.Configuration;
  5. public class HibernateUtil {
  6.     private static SessionFactorysessionFactory;
  7.     
  8.     static {
  9.         // 加载Hibernate主配置文件
  10.         Configuration conf = new Configuration();
  11.         conf.configure("/hibernate.cfg.xml");
  12.         sessionFactory = conf.buildSessionFactory();
  13.     }
  14.     /**
  15.      * 创建session
  16.      */
  17.     public static Session getSession() {
  18.         returnsessionFactory.openSession();
  19.     }
  20.     
  21.     public static void main(String[] args) {
  22.         System.out.println(getSession());
  23.     }
  24. }

步骤八:练习使用Hibernate对员工表进行增删改查

创建包com.tarena.test,并在该包下创建一个JUNIT测试类,并在类中使用Hibernate写出对EMP表的增删改查的方法,代码如下:


    
    
  1. packagecom.tarena.test;
  2. importjava.sql.Date;
  3. importjava.sql.Timestamp;
  4. importjava.util.List;
  5. importorg.hibernate.HibernateException;
  6. importorg.hibernate.Query;
  7. importorg.hibernate.Session;
  8. importorg.hibernate.Transaction;
  9. importorg.junit.Test;
  10. importcom.tarena.entity.Emp;
  11. importcom.tarena.util.HibernateUtil;
  12. /**
  13. *    演示Hibernate的基本使用
  14. */
  15. public class TestEmp {
  16.     /**
  17.      * 新增emp
  18.      */
  19.     @Test
  20.     public void add() {
  21.         // 模拟要新增的emp
  22.         Emp e = new Emp();
  23.         e.setName("ggg");
  24.         e.setAge(29);
  25.         e.setMarry(false);
  26.         e.setSalary(8000.00);
  27.         e.setBirthday(Date.valueOf("1983-10-20"));
  28.         e.setLastLoginTime(
  29.             new Timestamp(System.currentTimeMillis()));
  30.         // 获取session
  31.         Session session = HibernateUtil.getSession();
  32.         // 开启事务
  33.         Transaction ts = session.beginTransaction();
  34.         try {
  35.             // 执行新增
  36.             session.save(e);
  37.             // 提交事务
  38.             ts.commit();
  39.         } catch (HibernateException e1) {
  40.             e1.printStackTrace();
  41.             // 回滚事务
  42.             ts.rollback();
  43.         } finally {
  44.             session.close();
  45.         }
  46.     }
  47.     /**
  48.      * 根据ID查询emp
  49.      */
  50.     @Test
  51.     public void findById() {
  52.         Session session = HibernateUtil.getSession();
  53.         Empemp = (Emp) session.get(Emp.class, 201);
  54.         System.out.println(emp.getName());
  55.         System.out.println(emp.getBirthday());
  56.         System.out.println(emp.getLastLoginTime());
  57.         session.close();
  58.     }
  59.     /**
  60.      * 修改emp
  61.      */
  62.     @Test
  63.     public void update() {
  64.         Session session = HibernateUtil.getSession();
  65.         // 查询要修改的数据
  66.         Empemp = (Emp) session.get(Emp.class, 42);
  67.         // 开启事务
  68.         Transaction ts = session.beginTransaction();
  69.         try {
  70.             // 模拟修改数据
  71.             emp.setName("ee");
  72.             emp.setAge(20);
  73.             // 执行修改
  74.             session.update(emp);
  75.             // 提交事务
  76.             ts.commit();
  77.         } catch (HibernateException e) {
  78.             e.printStackTrace();
  79.             // 回滚事务
  80.             ts.rollback();
  81.         } finally {
  82.             // 关闭连接
  83.             session.close();
  84.         }
  85.     }
  86.     /**
  87.      * 删除emp
  88.      */
  89.     @Test
  90.     public void delete() {
  91.         Session session = HibernateUtil.getSession();
  92.         Empemp = (Emp) session.get(Emp.class, 148);
  93.         Transaction ts = session.beginTransaction();
  94.         try {
  95.             session.delete(emp);
  96.             ts.commit();
  97.         } catch (HibernateException e) {
  98.             e.printStackTrace();
  99.             ts.rollback();
  100.         } finally {
  101.             session.close();
  102.         }
  103.     }
  104.     /**
  105.      * 查询全部emp
  106.      */
  107.     @Test
  108.     public void findAll() {
  109.         String hql = "from Emp";
  110.         Session session = HibernateUtil.getSession();
  111.         Query query = session.createQuery(hql);
  112.         List<Emp>emps = query.list();
  113.         for (Emp e : emps) {
  114.             System.out.println(e.getName());
  115.         }
  116.         session.close();
  117.     }
  118. }

步骤九:测试

以JUNIT方式运行上面的每一个测试方法,并观察控制台输出的SQL。

1.4 完整代码

以下是本案例的完整代码。

其中建表语句完整代码如下:

主配置文件hibernate.cfg.xml完整代码如下:

实体类Emp.java完整代码如下:

映射关系文件Emp.hbm.xml完整代码如下:

HibernateUtil完整代码如下:

JUNIT测试类代码如下:

2 Hibernate映射类型

2.1 问题

使用Hibernate预定义类型配置属性和字段的映射关系。

2.2 方案

将项目HibernateDay01中,Emp.hbm.xml里面每个属性的配置,其type用Hibernate预定义类型来重构。由于Hibernate预定义类型支持布尔值,因此在该配置文件中追加marry属性的配置。

2.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:重构Emp.hbm.xml

重构Emp.hbm.xml,将各个属性的type由Java类型改为Hibernate预定义类型,同时追加marry属性,并使用布尔型来配置该属性,代码如下:


    
    
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping>
  6.     <!--配置实体类和表的关系 -->
  7.     <class name="com.tarena.entity.Emp" table="emp">
  8.         <!--配置主键属性和字段的关系 -->
  9.         <id name="id" type="integer" column="id">
  10.             <!--用来指明主键的生成方式 -->
  11.             <generator class="sequence">
  12.                 <!--指定用于生成主键的sequence -->
  13.                 <param name="sequence">emp_seq</param>
  14.             </generator>
  15.         </id>
  16.         
  17.         <!--配置实体类中属性与表中字段的关系 -->
  18.         <property name="name"
  19.             type="string" column="name"/>
  20.         <property name="age"
  21.             type="integer" column="age"/>
  22.         <property name="salary"
  23.             type="double" column="salary"/>
  24.         <property name="birthday"
  25.             type="date" column="birthday"/>
  26.         <property name="lastLoginTime"
  27.             type="timestamp" column="last_login_time"/>
  28.         <property name="marry"
  29.             type="yes_no" column="marry"/>
  30.     </class>
  31. </hibernate-mapping>

步骤二:测试

再次以JUNIT方式执行测试代码中的每个方法,看控制台输出结果是否正确。

2.4 完整代码

以下是本案例的完整代码。

其中Emp.hbm.xml完整代码如下:

其他代码不变,此处不再重复。

3 在NETCTOSS中引入Hibernate

3.1 问题

将Hibernate框架引入到NETCTOSS。

3.2 方案

将Hibernate框架引入到NETCTOSS,以保证在项目中可以使用Hibernate来进行数据库访问。根据Hibernate的使用步骤,我们需要在项目中引入Hibernate开发包、主配置文件,并创建HibernateUtil工具类。

3.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:导包

在NETCTOSS项目中,导入Hibernate开发包,导入后项目的包结构如下图:

图-2

步骤二:引入主配置文件

将Hibernate主配置文件引入到项目中,放于src根路径下,该文件可以从HibernateDay01项目中直接复制过来,并将声明映射关系文件部分代码去掉,代码如下:


    
    
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-configuration PUBLIC
  3.         "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  4.         "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
  5. <hibernate-configuration>
  6.     <session-factory>
  7.         <!--数据库连接信息,根据自己的数据库进行配置 -->
  8.         <property name="connection.url">
  9.             jdbc:oracle:thin:@localhost:1521:xe
  10.         </property>
  11.         <property name="connection.username">lhh</property>
  12.         <property name="connection.password">123456</property>
  13.         <property name="connection.driver_class">
  14.             oracle.jdbc.OracleDriver
  15.         </property>
  16.         
  17.         <!-- Hibernate配置信息 -->
  18.         <!-- dialect方言,用于配置生成针对哪个数据库的SQL语句 -->
  19.         <property name="dialect">
  20.             <!--方言类,Hibernate提供的,用于封装某种特定数据库的方言 -->
  21.             org.hibernate.dialect.OracleDialect
  22.         </property>
  23.         <!-- Hibernate生成的SQL是否输出到控制台 -->
  24.         <property name="show_sql">true</property>
  25.         <!--将SQL输出时是否格式化 -->
  26.         <property name="format_sql">true</property>
  27.         
  28.     </session-factory>
  29. </hibernate-configuration>

步骤三:创建HibernateUtil工具类

在com.netctoss.util包下,创建HibernateUtil工具类,该类可以直接从HibernateDay01项目中复制过来,代码如下:


    
    
  1. packagecom.netctoss.util;
  2. importorg.hibernate.Session;
  3. importorg.hibernate.SessionFactory;
  4. importorg.hibernate.cfg.Configuration;
  5. public class HibernateUtil {
  6.     private static SessionFactorysessionFactory;
  7.     
  8.     static {
  9.         // 加载Hibernate主配置文件
  10.         Configuration conf = new Configuration();
  11.         conf.configure("/hibernate.cfg.xml");
  12.         sessionFactory = conf.buildSessionFactory();
  13.     }
  14.     /**
  15.      * 创建session
  16.      */
  17.     public static Session getSession() {
  18.         returnsessionFactory.openSession();
  19.     }
  20.     
  21.     public static void main(String[] args) {
  22.         System.out.println(getSession());
  23.     }
  24. }

3.4 完整代码

下面是本案例的完整代码。

其中主配置文件完整代码如下:

HibernateUtil工具类完整代码如下:

4 使用Hibernate重构资费DAO

4.1 问题

使用Hibernate重构资费DAO的实现类。

4.2 方案

使用Hibernate的增删改查API,重构资费DAO的实现类。

4.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:创建资费的映射关系文件

在com.netctoss.entity包下,创建资费的映射关系文件,名为Cost.hbm.xml,代码如下:


    
    
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping>
  6.     <class name="com.netctoss.entity.Cost" table="cost">
  7.         <id name="id" type="integer" column="id">
  8.             <!--用来指明主键的生成方式 -->
  9.             <generator class="sequence">
  10.                 <param name="sequence">cost_seq</param>
  11.             </generator>
  12.         </id>
  13.         
  14.         <property name="name"
  15.             type="string" column="name" />
  16.         <property name="baseDuration"
  17.             type="integer" column="base_duration" />
  18.         <property name="baseCost"
  19.             type="double" column="base_cost" />
  20.         <property name="unitCost"
  21.             type="double" column="unit_cost" />
  22.         <property name="status"
  23.             type="string" column="status" />
  24.         <property name="descr"
  25.             type="string" column="descr" />
  26.         <property name="createTime"
  27.             type="date" column="creatime" />
  28.         <property name="startTime"
  29.             type="date" column="startime" />
  30.         <property name="costType"
  31.             type="string" column="cost_type" />
  32.     </class>
  33. </hibernate-mapping>

步骤二:声明映射关系文件

在hibernate.cfg.xml中声明映射关系文件,代码如下:


    
    
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-configuration PUBLIC
  3.         "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  4.         "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
  5. <hibernate-configuration>
  6.     <session-factory>
  7.         <!--数据库连接信息,根据自己的数据库进行配置 -->
  8.         <property name="connection.url">
  9.             jdbc:oracle:thin:@localhost:1521:xe
  10.         </property>
  11.         <property name="connection.username">lhh</property>
  12.         <property name="connection.password">123456</property>
  13.         <property name="connection.driver_class">
  14.             oracle.jdbc.OracleDriver
  15.         </property>
  16.         
  17.         <!-- Hibernate配置信息 -->
  18.         <!-- dialect方言,用于配置生成针对哪个数据库的SQL语句 -->
  19.         <property name="dialect">
  20.             <!--方言类,Hibernate提供的,用于封装某种特定数据库的方言 -->
  21.             org.hibernate.dialect.OracleDialect
  22.         </property>
  23.         <!-- Hibernate生成的SQL是否输出到控制台 -->
  24.         <property name="show_sql">true</property>
  25.         <!--将SQL输出时是否格式化 -->
  26.         <property name="format_sql">true</property>
  27.         
  28.         <!--在配置文件中关联映射文件 -->
  29.         <mapping resource="com/netctoss/entity/Cost.hbm.xml" />
  30.     </session-factory>
  31. </hibernate-configuration>

步骤三:使用Hibernate重构CostDaoImpl

使用HibernateUtil的增删改查API,来重构CostDaoImpl,代码如下:


    
    
  1. packagecom.netctoss.dao;
  2. importjava.util.List;
  3. importorg.hibernate.HibernateException;
  4. importorg.hibernate.Query;
  5. importorg.hibernate.Session;
  6. importorg.hibernate.Transaction;
  7. importcom.netctoss.entity.Cost;
  8. importcom.netctoss.util.HibernateUtil;
  9. /**
  10. *    当前阶段学习重点是Struts2,对于DAO的实现就模拟实现了。
  11. *    同学们可以使用JDBC/MyBatis自行实现该DAO。
  12. */
  13. public class CostDaoImpl implements ICostDao {
  14.     @Override
  15.     public List<Cost>findAll() {
  16.         String hql = "from Cost";
  17.         Session session = HibernateUtil.getSession();
  18.         Query query = session.createQuery(hql);
  19.         List<Cost> list = query.list();
  20.         session.close();
  21.         return list;
  22.     }
  23.     @Override
  24.     public void delete(int id) {
  25.         Cost cost = new Cost();
  26.         cost.setId(id);
  27.         Session session = HibernateUtil.getSession();
  28.         Transaction ts = session.beginTransaction();
  29.         try {
  30.             session.delete(cost);
  31.             ts.commit();
  32.         } catch (HibernateException e) {
  33.             e.printStackTrace();
  34.             ts.rollback();
  35.         } finally {
  36.             session.close();
  37.         }
  38.     }
  39.     @Override
  40.     public Cost findByName(String name) {
  41.         // 模拟根据名称查询资费数据,假设资费表中只有一条名为tarena的数据
  42.         if("tarena".equals(name)) {
  43.             Cost c = new Cost();
  44.             c.setId(97);
  45.             c.setName("tarena");
  46.             c.setBaseDuration(99);
  47.             c.setBaseCost(9.9);
  48.             c.setUnitCost(0.9);
  49.             c.setDescr("tarena套餐");
  50.             c.setStatus("0");
  51.             c.setCostType("2");
  52.             return c;
  53.         }
  54.         return null;
  55.     }
  56.     @Override
  57.     public Cost findById(int id) {
  58.         Session session = HibernateUtil.getSession();
  59.         Cost cost = (Cost) session.get(Cost.class, id);
  60.         session.close();
  61.         return cost;
  62.     }
  63. }

注:目前我们还没学习有条件的查询,因此先不重构findByName方法。

步骤四:测试

重新部署项目,并重启tomcat,访问资费模块,对其各功能进行测试。

4.4 完整代码

下面是本案例的完整代码。

其中映射关系文件完整代码如下:

主配置文件完整代码如下:

CostDaoImpl完整代码如下:http://pdf7.tarena.com.cn/tts8_source/ttsPage/JAVA/JSD_V04/HIBERNATE/DAY01/CASE/01/index.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值