1 简答题(写概念,思原理)
1.1 Hibernate框架作用
参考答案:
hibernate是一个数据访问框架(持久层框架),在项目中利用Hibernate框架可以实现对数据库的增删改查操作,为业务层构建一个持久层
1.2 Hibernate框架原理–(ORM)
参考答案:
ORM–Object Relation Mapping,对象关系映射.
主要思想:将Java对象与关系表进行自动映射,这样可以将对象直接更新到数据库;查询时,可以自动将数据表记录封装成Java对象.
1.3 Hibernate主要的体系结构
参考答案:
a.实体类(Xxx),可以有n个
与数据表对应,用于封装数据表的一行记录
b.XML映射文件(Xxx.hbm.xml),可以有n个
用于描述实体类与数据表之间的对应关系;类属性与表字段之间的对应关系。
c.主配置文件(hibernate.cfg.xml),可以有1个
用于指定连接数据库的参数,框架参数等
1.4 Hibernate开发的基本步骤
参考答案:
a.引入hibernate框架开发包
b. 添加Hibernate主配置文件
c. 根据数据表,编写实体类,映射文件
d. 利用Hibernate API操作实体对象
2 填空题(读代码、加注释)
2.1 阅读下面的代码,并在指定位置添加注释。
- <?xml version="1.0" encoding="utf-8"?>
- “http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd”>
- <!—此句代码的作用是( 将类Fee与数据库表COST做映射 )–>
-
<class name="com.tarena.netctoss.pojo.Fee" table="COST">
-
<!—此句代码的作用是( Fee类的id属性和数据库表的ID列做映射 )-->
-
<id name="id" column="ID" type="integer">
-
<!—此句代码的作用是( 使用序列作为主键的生产方式 )-->
-
<generator class="sequence">
-
<param name="sequence">FEE_SEQ</param>
-
</generator>
-
</id>
-
<property name="feeName" column="NAME"
-
type="string">
-
</property>
-
<property name="baseDuration" column="BASE_DURATION"
-
type="integer">
-
</property>
-
<property name="baseCost" column="BASE_COST"
-
type="float">
-
</property>
-
<property name="unitCost" column="UNIT_COST"
-
type="float">
-
</property>
-
<property name="status" column="STATUS"
-
type="string">
-
</property>
-
<property name="descr" column="DESCR"
-
type="string">
-
</property>
-
<property name="costType" column="COST_TYPE"
-
type="string">
-
</property>
-
<property name="createTime" column="CREATIME"
-
type="date">
-
</property>
-
<property name="startTime" column="STARTIME"
-
type="date">
-
</property>
-
</class>
3 编程题(改代码,写代码)
3.1 重构“NETCTOSS登录检查拦截器”案例
重载Struts2的Day05的“NETCTOSS登录检查拦截器”案例,使用Hibernate实现修改和删除功能。
参考答案:
1.按照Struts2的Day02的“NETCTOSS资费的分页显示”案例中,拷贝工程的方法,拷贝struts05_2创建hibernate01_3工程。如图-4,图-5所示。
图- 4
图- 5
2.创建Fee.hbm.xml
- <?xml version="1.0" encoding="utf-8"?>
- “http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd”>
-
<class name="com.tarena.netctoss.pojo.Fee" table="COST">
-
<id name="id" column="ID" type="integer">
-
<generator class="sequence">
-
<param name="sequence">FEE_SEQ</param>
-
</generator>
-
</id>
-
<property name="feeName" column="NAME"
-
type="string">
-
</property>
-
<property name="baseDuration" column="BASE_DURATION"
-
type="integer">
-
</property>
-
<property name="baseCost" column="BASE_COST"
-
type="float">
-
</property>
-
<property name="unitCost" column="UNIT_COST"
-
type="float">
-
</property>
-
<property name="status" column="STATUS"
-
type="string">
-
</property>
-
<property name="descr" column="DESCR"
-
type="string">
-
</property>
-
<property name="costType" column="COST_TYPE"
-
type="string">
-
</property>
-
<property name="createTime" column="CREATIME"
-
type="date">
-
</property>
-
<property name="startTime" column="STARTIME"
-
type="date">
-
</property>
-
</class>
3.创建hibernate.cfg.xml
- <?xml version='1.0' encoding='UTF-8'?>
-
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
-
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
-
<property name="dialect">
-
org.hibernate.dialect.OracleDialect
-
</property>
-
<property name="connection.url">
-
jdbc:oracle:thin:@192.168.0.20:1521:tarena
-
</property>
-
<property name="connection.username">task</property>
-
<property name="connection.password">mistarena</property>
-
<property name="connection.driver_class">
-
oracle.jdbc.driver.OracleDriver
-
</property>
-
<!-- 将hibernate底层执行的sql语句从控制台显示 -->
-
<property name="show_sql">true</property>
-
<property name="format_sql">true</property>
-
<mapping resource="com/tarena/netctoss/pojo/Fee.hbm.xml" />
4.修改FeeDAO,修改update方法,findById方法,deleteById方法,使用Hibernate操作数据库。
- package com.tarena.netctoss.dao;
- import java.sql.Connection;
- import java.sql.Date;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import java.util.ArrayList;
- import java.util.List;
- import org.hibernate.Session;
- import org.hibernate.Transaction;
- import com.tarena.netctoss.pojo.Fee;
- import com.tarena.netctoss.utils.ConnectionUtils;
- import com.tarena.netctoss.utils.HibernateUitl;
- public class FeeDAO {
-
private static final String findAll =
-
"select ID, NAME, BASE_DURATION, BASE_COST, UNIT_COST, CREATIME, STARTIME, STATUS, DESCR,COST_TYPE from (" +
-
"select rownum r, ID, NAME, BASE_DURATION, BASE_COST, UNIT_COST, CREATIME, STARTIME, STATUS, DESCR,COST_TYPE from COST where rownum < ?) a " +
-
"where a.r > ? ";
-
private static final String getTotalPages = "select count(*) from COST";
-
private static final String findByName = "select ID, NAME, BASE_DURATION, BASE_COST, UNIT_COST, CREATIME, STARTIME, STATUS, DESCR,COST_TYPE from COST where NAME=?";
- // private static final String findById = “select ID, NAME, BASE_DURATION, BASE_COST, UNIT_COST, CREATIME, STARTIME, STATUS, DESCR,COST_TYPE from COST where ID=?”;
- // private static final String deleteById = “delete from COST where ID=?”;
- // private static final String update =“update COST set NAME=?,BASE_DURATION=?,BASE_COST=?,UNIT_COST=?,”
- // + " DESCR=?,COST_TYPE=? where ID=?";
-
public void update(Fee fee){
-
Session session = HibernateUitl.getSession();
-
Transaction tx = session.beginTransaction();
-
fee.setCreateTime(new Date(System.currentTimeMillis()));
-
session.update(fee);
-
tx.commit();
-
session.close();
-
}
-
public Fee findById(int id){
-
Session session = HibernateUitl.getSession();
-
Fee fee = (Fee)session.get(Fee.class, id);
-
session.close();
-
return fee;
-
}
-
public Fee findByName(String name){
-
Connection con = null;
-
PreparedStatement stmt = null;
-
ResultSet rs = null;
-
try {
-
con = ConnectionUtils.openConnection();
-
stmt = con.prepareStatement(findByName);
-
stmt.setString(1, name);
-
rs = stmt.executeQuery();
-
Fee fee = null;
-
if (rs.next()) {
-
fee = new Fee();
-
fee.setId(rs.getInt("ID"));
-
fee.setFeeName(rs.getString("NAME"));
-
fee.setBaseDuration(rs.getInt("BASE_DURATION"));
-
fee.setBaseCost(rs.getFloat("BASE_COST"));
-
fee.setUnitCost(rs.getFloat("UNIT_COST"));
-
fee.setCreateTime(rs.getDate("CREATIME"));
-
fee.setStartTime(rs.getDate("STARTIME"));
-
fee.setStatus(rs.getString("STATUS"));
-
fee.setDescr(rs.getString("DESCR"));
-
fee.setCostType(rs.getString("COST_TYPE"));
-
}
-
return fee;
-
} catch (Exception e) {
-
e.printStackTrace();
-
throw new RuntimeException(e);
-
}finally{
-
ConnectionUtils.closeConnection();
-
}
-
}
-
public void deleteById(int id){
-
//创建fee对象
-
Fee fee = new Fee();
-
fee.setId(id);
-
//删除
-
Session session = HibernateUitl.getSession();
-
Transaction tx = session.beginTransaction();
-
session.delete(fee);
-
tx.commit();
-
session.close();
-
}
-
public int getTotalPages(int pageSize) {
-
Connection con = null;
-
PreparedStatement stmt = null;
-
ResultSet rs = null;
-
try {
-
con = ConnectionUtils.openConnection();
-
stmt = con.prepareStatement(getTotalPages);
-
rs = stmt.executeQuery();
-
rs.next();
-
int totalRows = rs.getInt(1);
-
if (totalRows % pageSize == 0) {
-
return totalRows / pageSize;
-
} else {
-
return totalRows / pageSize + 1;
-
}
-
} catch (Exception e) {
-
e.printStackTrace();
-
throw new RuntimeException(e);
-
}finally{
-
ConnectionUtils.closeConnection();
-
}
-
}
-
public List<Fee> findAll(int page,int pageSize) {
-
Connection con = null;
-
PreparedStatement stmt = null;
-
ResultSet rs = null;
-
try {
-
con = ConnectionUtils.openConnection();
-
stmt = con.prepareStatement(findAll);
-
int begin = (page-1)*pageSize;
-
int end = page*pageSize+1;
-
stmt.setInt(1, end);
-
stmt.setInt(2, begin);
-
rs = stmt.executeQuery();
-
List<Fee> list = new ArrayList<Fee>();
-
while (rs.next()) {
-
Fee fee = new Fee();
-
fee.setId(rs.getInt("ID"));
-
fee.setFeeName(rs.getString("NAME"));
-
fee.setBaseDuration(rs.getInt("BASE_DURATION"));
-
fee.setBaseCost(rs.getFloat("BASE_COST"));
-
fee.setUnitCost(rs.getFloat("UNIT_COST"));
-
fee.setCreateTime(rs.getDate("CREATIME"));
-
fee.setStartTime(rs.getDate("STARTIME"));
-
fee.setStatus(rs.getString("STATUS"));
-
fee.setDescr(rs.getString("DESCR"));
-
fee.setCostType(rs.getString("COST_TYPE"));
-
list.add(fee);
-
}
-
return list;
-
} catch (Exception e) {
-
e.printStackTrace();
-
throw new RuntimeException(e);
-
}finally{
-
ConnectionUtils.closeConnection();
-
}
-
}
- }