--指定方言,决定Hibernate生成哪种SQL-->
org.hibernate.dialect.OracleDialect
--不知道数据库版本就写OracleDialect-->
--可在hibernate3.jar中org.hibernate.dialect包下查看名字-->
jdbc:
oracle:
thin:
@localhost:
1521:
dbchang
system
chang
oracle.jdbc.driver.OracleDriver
--框架参数,将hibernate底层执行的SQL语句从控制台显示-->
true
--格式化显示的SQL-->
true
--指定映射描述文件-->
◆注意事项:
应该放在源文件的src目录下,默认为hibernate.cfg.xml。
文件内容是Hibernate工作时必须用到的基础信息。
step4:
编写Entity实体类(也叫POJO类),例如:
资费实体类Cost
privateIntegerid;//资费IDprivateStringfeeName;//资费名称
privateIntegerbaseDuration;//基本时长privateFloatbaseCost;//基本定费
privateFloatunitCost;//单位费用privateStringstatus;//0:
开通;1:
暂停;
privateStringdescr;//资费信息说明privateDatecreateTime;//创建日期
privateDatestartTime;//启用日期privateStringcostType;//资费类型
……getter/setter方法
◆注意事项:
POJO类表示普通类(PlainOrdinaryOldObject),没有格式的类,只有属性和对应的getter/setter方法,而没有任何业务逻辑方法的类。
这种类最多再加入equals()、hashCode()、toString()等重写父类Object的方法。
不承担任何实现业务逻辑的责任。
step5:
编写hbm.xml映射(文件)描述信息:
映射文件用于指明POJO类和表之间的映射关系(xx属性对应xx字段),一个类对应一个映射文件。
例如:
Cost.hbm.xml内容如下:
xmlversion="1.0"encoding="utf-8"?
>
DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN"
"
--定义COST_CHANG表和Cost类型之间的映射信息-->
---->
--name:
包名.类名,指定是哪个类;table:
数据库中哪个表;catalog:
对Oracle而言为哪个数据库,对MySQl而言为某个用户(MySQl是在用户下建表,Oracle是在库中建表),
不写也行(若用工具则会自动生成)。
例如,select*fromcost_chang则会在hibernate.cfg配置文件中定义的库(或用户)下去找表。
若写了则为select*fromsystem.cost_chang-->
--表明此为主键列,且必须写否则xml报错,主键映射-->
--或双标签-->
--指定主键值生成方式,采用序列方式生成主键,仅对添加操作有效-->
COST_SEQ_CHANG--指定序列名-->
--以下为非主键映射-->
--可有length、not-null属性,如:
length="20"-->
--映射顺序没关系-->
--类型要和实体定义的相同-->
--列名写错则报错读不到实体-->
--junit测试右键点CopyTrace查看错误列-->
--也可写成,主键列同理!
-->
…………其他省略…………
◆注意事项:
v映射文件默认与POJO类放在一起;命名规则为:
类名.hbm.xml。
vhbm.xml中已写出的属性与字段的映射要一一对应,若表中没有某个字段,却写了映射关系,则报错:
找不到实体类。
step6:
利用HibernateAPI实现DAO
1)新建HibernateUtil类,用于封装创建Session的方法。
如下:
每个用户会对应一个Session,但是SessionFactory是共享的。
publicclassHibernateUtil{
privatestaticSessionFactorysf;
static{//不用每次都加载配置信息,所以放static块中,否则每次都加载会耗费资源
Configurationconf=newConfiguration();//加载主配置hibernate.cfg.xml
conf.configure("/hibernate.cfg.xml");
sf=conf.buildSessionFactory();//获取SessionFactory}
publicstaticSessiongetSession(){//获取Session
Sessionsession=sf.openSession();returnsession;}}
2)新建CostDAO接口
publicCostfindById(intid);publicvoidsave(Costcost);
publicvoiddelete(intid);publicvoidupdate(Costcost);
publicListfindAll();
3)新建CostDAOImpl类,用于实现CostDAO接口
publicclassCostDAOImplimplementsCostDAO{
privateSessionsession;
publicCostDAOImpl(){//不想老写获得session的方法,就写在构造器中
session=HibernateUtil.getSession();}
/**get方法执行查询,按主键当条件查询,如何判断是主键,是根据写的描述文件来定,get方法就是findById,就是按主键去查,需指定:
操作哪个类和id(主键)条件值即可,其他条件查询做不了*/
publicCostfindById(intid){
//Sessionsession=HibernateUtil.getSession();
Costcost=(Cost)session.get(Cost.class,id);session.close();returncost;}
/**save方法执行增加操作,注意1:
获取事务并开启,增删改要注意,查询可以不管事务,因为没对数据库进行修改;注意2:
主键值根据hbm.xml中的定义生成,执行后,会先获取序列值,再去做insert操作。
即先:
selectCOST_SEQ_CHANG.nextvalfromdual;然后:
insertinto……*/
publicvoidsave(Costcost){
//Sessionsession=HibernateUtil.getSession();
Transactiontx=session.beginTransaction();//打开事务session.save(cost);
mit();//提交事务session.close();//释放}
/**delete方法执行删除操作,由于Hibernate以“对象”为单位进行数据库操作,所以这里要传进去一个对象,虽然是个对象,但还是按主键做条件删除,只要把主键值设置上就行,其他非主键值不用管。
也可先通过id查再删*/
publicvoiddelete(intid){
//Sessionsession=HibernateUtil.getSession();
Transactiontx=session.beginTransaction();Costcost=newCost();
cost.setId(id);session.delete(cost);mit();session.close();}
/**update方法执行修改操作,*/
publicvoidupdate(Costcost){
//Sessionsession=HibernateUtil.getSession();
Transactiontx=session.beginTransaction();
session.update(cost);//将cost对象更新到数据库mit();
session.close();}
/**特殊查询,SQL语句:
Stringsql="select*fromCOST_CHANG";
HQL语句:
Stringhql="fromCost";(HibernateQueryLanguage)是面向对象的查询语句。
from后写映射的类名,它是Hibernate中特有的查询语句,根据映射的类去查询。
*/
publicListfindAll(){
//Sessionsession=HibernateUtil.getSession();
Stringhql="fromCost";//HQL语句
Queryquery=session.createQuery(hql);
Listlist=query.list();//执行查询,返回List集合
session.close();returnlist;}}
4)新建TestCostDAO类,使用junit测试
@Test
publicvoidtestFindById(){//当get方法没有记录时,返回null
CostDAOcostDao=newCostDAOImpl();Costcost=costDao.findById
(1);
System.out.println(cost.getName());System.out.println(cost.getBaseDuration());
System.out.println(cost.getBaseCost());System.out.println(cost.getUnitCost());
System.out.println(cost.getDescr());}
@Test
publicvoidtestSave(){//id主键列由Hibernate管理,这里不用设置
Costcost=newCost();cost.setName("2013计时");
cost.setUnitCost(0.8f);cost.setDescr("2013-08-09计时,0.8元/小时。
");
cost.setStatus("0");cost.setCreaTime(newDate(System.currentTimeMillis()));
CostDAOcostDao=newCostDAOImpl();costDao