Hibernate单独使用 (二)表操作深入、主键、自动生成映射文件

//读取配置文件,可以增加configure参数,或者addResource(String path)动态指定hbm文件路径
//或者使用addClass(Class persistentClass)方法指定类相当于读取hbm
Configuration conf = new Configuration().configure();
//生成SessionFactory来管理Session,SessionFactory是唯一的,SessionFactory耗内存,适合放在(application内)
SessionFactory sf = conf.buildSessionFactory();
//需要手动关闭,什么时候打开Session,设计了一个类,帮助生成
Session session = sf.openSession();
session.clos();


//查询
新建一个包,右键建立Hibernate SessionFactory类,选择项目内空的包,会生成HibernatSessionFactory的类
HibernatSessionFactory的类内涵上面的conf和sf都不需要了,直接写下面,test是HibernateSessionFactory的包
Session session = test.HibernateSessionFactory.getSession();
Object obj = (Object)session.get(School.class,"001");(此处必须为字符串,并且po里都为字符串,但是数据库内是可以其他类型,Hibernate会自动把数据库内数据类型转化为字符串)
test.HibernateSessionFactory.closeSession();




//修改:增加事务提交
Session session = test.HibernateSessionFactory.getSession();
Customer cus = new Customer();
session.load(cus,"111");
cus.setCbalance(cus.getCbalance()+1000);
Transaction tran = session.beginTransaction();
增加异常处理
try{
session.update(cus);
tran.commit();
}catche(){
tran.rollback();
}finally{
test.HibernateSessionFactory.closeSession();
}




//如果已经有主键并存在,不报错误
session.saveOrUpdate();
//如果已经有主键并存在,报错误
session.save();
//如果已经不存在,找不到,报错误
session.load();
//如果已经不存在,找不到,不报错误
(强制转换)session.get();




==================================================================
复杂批量查询1主要方式:(HQL)
//Customer是类 cbalance是类的属性
//from 类名 as 对象名(where 属性条件)as对象名可以省略
//Select 内容 from 类名 as 对象名(where 属性条件)
Session session = test.HibernateSessionFactory.getSession();
String hql = "from Customer where cbalance> 1000";
Query query = session.createQuery(hql);(hibernate.Query)
//query.list()或者query.iterate() 用while循环
List list = query.list()(java.util)
for(list.size())
Customer cus = (Customer)list.get(i)
test.HibernateSessionFactory.closeSession();




Session session = test.HibernateSessionFactory.getSession();
double money = 1000;
String hql = "Select cname,cbalance from Customer where cbalance> :money";
Query query = session.createQuery(hql);(hibernate.Query)
query.setDouble("money",money)
//query.list()或者query.iterate() 用while循环
List list = query.list()(java)
for(list.size())
Object[] obj = (Object[])list.get(i)
syso(obj[0],obj[1])
test.HibernateSessionFactory.closeSession();
===================================================================
复杂批量查询2:(准则查询)适合复合查询,给分页带来方便
Session session = test.HibernateSessionFactory.getSession();
Criteria cri = session.createCriteria(Customer.class)
//gt大于
cri.add(Restrictions.gt("",1000.0));
//添加排序
cri.addOrder(Order.asc("cbalance"));
List list = cri.list();
//给分页带来方便
cri.setFirstResult(1);//从第一条记录显示
cri.setMaxResult(3);//显示3条记录
test.HibernateSessionFactory.closeSession();
=====================================================================
复杂批量查询3:(SQL)
Session session = test.HibernateSessionFactory.getSession();
SQLQuery SQLQuery = session.createSQLQuery("SELECT");
sqlQuery.addEntity(Customer.class);
List list = sqlQuery.list();
test.HibernateSessionFactory.closeSession();


===================================================================
调用存储过程
java.sql.Connection con = session.connection();
con.prepareCall(arg0);
===================================================================
复合主键
1.编写一个类(实现序列化接口),封装主键,并写属性
原来的类就没有主键的属性了,并且构造函数也可以不写。
把原来的类增加新类的set和get函数,新类必须序列化接口Serializable
2.PO内编写各个属性,包括主键类型
3.在映射文件中写明:
<composite-id name="属性名" class="主键类名">
<key-property name="属性名" class="列名"/>
<key-property name="属性名" class="列名"/>
</composite-id>
=================================================================
主键生成策略
assigned 手动生成主键
increment 自增生成主键
identify 由数据库生成主键
sequence 由数据库根据序列生成
hilo 由Hibernate特殊算法生成
native 系统自动选择identify、sequence、hilo
uuid.hex 利用uuid唯一算法生成主键
===============================================================
动态模型
可以取消PO的编写(不推荐)
===============================================================
MyEclipse自动生成映射文件
选择数据库内的表,点击右键,选择Hibernate Raverse Engineering
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值