Hibernate开源的使用ORM框架实现操作数据库的技术。
ORM(Object/RelationMapping)对象-关系映射是一种数据持久化技术。
1. hibernate3.3.2.GA.rar文件夹下lib/require下的所有架包和hibernate3.jar和ojdbc14.jar。共9个架包。
2. 将hibernate的配置文件hibernate.cfg.xml复制到src下
注意<mapping resource="com/wu/myuser/User.hbm.xml"/>,在com.wu.myuser包下。
3. 导入实体类配置文件User.hbm.xml,User是你的实体类的名
4. 如下
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/HibernateMapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.wu.myuser.User"table="REGIST_TABLE_TEST">
<id name="userId"column="userid" type="java.lang.Integer"><!-- 主键 --><!—name是你的实体类属性名,column是数据库中的列名 -->
<generator class="assigned"></generator>
</id>
<property name="UserName"column="username" type="java.lang.String"/>
<property name="age"column="age" type="java.lang.Integer"></property>
<property name="sex"column="sex" type="java.lang.String"></property>
<property name="password"column="password" type="java.lang.String"></property>
</class>
</hibernate-mapping>
5. 例子如下
public class Test {
private static final ThreadLocal<Session> tl = new ThreadLocal<Session>();//保存session和使用,管理
private Session session = null;
private Transaction transaction = null;
private static SessionFactory sf = null;
static {
Configurationcfg = new Configuration().configure();
sf = cfg.buildSessionFactory();
}
public static Session getSession() {
Sessionsession = tl.get();
if (session == null) {
session= sf.openSession();
tl.set(session);
}
return session;
}
public staticvoid closeSession() {
Sessionsession = tl.get();
session.close();
tl.set(null);
}
public void save(User user) {
try {
session = getSession();
transaction = session.beginTransaction();
session.save(user);
transaction.commit();
System.out.println("用户信息保存成功!");
}catch (RuntimeException re) {
if (null != transaction) {
transaction.rollback();
throw re;
}
}finally {
closeSession();
}
}
public void update(User user) {
session = getSession();
transaction = session.beginTransaction();
session.update(user);
transaction.commit();
System.out.println("用户信息修改成功!");
closeSession();
}
public void delete(User user) {
session = getSession();
transaction = session.beginTransaction();
session.delete(user);
transaction.commit();
System.out.println("用户信息删除成功!");
closeSession();
}
public User queryById(int userId) {
session = getSession();
Useruser = null;
Stringhql = "fromUser r where r.userId=?";// hibernate都是对实体对象操作,并不是“from
// 表名”,而是“from 实体类名 where
// 实体类属性=?”
Queryquery = session.createQuery(hql);
query.setInteger(0,userId);
Iteratoriter = query.list().iterator();
if (iter.hasNext()) {
user= (User) iter.next();
}
System.out.println("主键精确查询!");
closeSession();
return user;
}
public List queryLike(String userName) {
session = getSession();
List list = null;
String hql = "from User r where r.userName like?";// hibernate都是对实体对象操作,并不是“from
// 表名”,而是“from 实体类名
// where 实体类属性=?”
Query query = session.createQuery(hql);// 注意检查配置文件中的属性名是否与实体属性名相同
query.setString(0, "%" + userName + "%");
list = query.list();
System.out.println("模糊查询!");
closeSession();
return list;
}
public List queryAll() {
session = getSession();
List list = null;
String hql = "from User";// hibernate都是对实体对象操作,并不是“from 表名”,而是“from
// 实体类名”
Query query = session.createQuery(hql);
list = query.list();
System.out.println("查询表中的所有记录!");
closeSession();
return list;
}
}
查询时:this.session.get(Class User.class,Serializableid);id是主键.User.class是User的类的类名。用查询时不用transaction和提交事务。但是entity实体需要实现serializable接口。
6. Hibernate实体对象的三种状态
1. 自由状态(临时状态)刚new语句创建,还没被持久化。VO
2. 持久状态 已经被持久化,加入到Session的缓存中(调用了save()或saveOrUpdate()方法)。PO
3. 游离状态 已经被持久化,但不能处于Session的缓存中(调用了close()方法或flush()方法或clear()方法)。VO
游离状态调用delete()方法成为自由状态;
7.ThreadLocal管理Session
第二种方法需要在hibernate.cfg.xml文件中配置 <property name="hibernate.current_session_context_class">thread</property>
需要改成
publicstatic Session getSession(){
return sf.getCurrentSession();
}
而且每个方法需要开启事务,及加上transaction = session.beginTransaction();
多对一
many-to-one
<many-to-one name="zongbiao"cascade="all" class="com.wu.myuser.Zongbiao">
<column name="zid"></column>
</many-to-one>
一对多
<set name="users"table="REGIST_TABLE_TEST" fetch="join" cascade="all"order-by="userId desc" inverse="true">
<key column="zid"></key>
<one-to-many class="com.wu.myuser.User"/>
</set>
注意实体类需要加set集合属性privateSet<User> users = new HashSet<User>();
fetch 属性join或select 提高搜索性能
cascade 属性all 既是表关联属性,many-to-many时需要两端都配置
inverse 属性当为true时一方将关联关系维护给了多方维护
主键生成策略<generator class=”assigned”/>
配置序列 aaa为在数据库中的序列.
<generator class=”sequence”>
<paramname=”sequence”>aaa</param>
</generator>
可以将参数绑定?可以用=:来绑定参数
可以将参数封装一个类,setProperties(Object bean) 注意拼hql 使用if判断
Condition c = newCondition();
if(something!=””&…){
hql = hql+” and something= :something”;
}
投影查询一个以上都泛型Object[]数组
List<Object[]>list = sess.createQuery(“select 1row,2row from tablename”).list();
一个列时泛型为String类型
Hibernate分页
//分页
Session session = Test.getSession();
Transaction transaction =session.beginTransaction();
//获取总记录数
String hql1 = "select count(*) from User";
int total =((Long)session.createQuery(hql1).uniqueResult()).intValue();
System.out.println(total);
//设置每页显示数量
double pageSize1=5;
int pageSize = (int)pageSize1;
//设置当前页
int pageIndex = 2;
//计算总页数(向上取整)
int totalPage = (int) Math.ceil(total/pageSize1);
//计算开始和结束页
Query query = session.createQuery("from User order by useridasc");
query.setFirstResult((pageIndex-1)*pageSize);//设置第一条记录的位置
query.setMaxResults(pageSize);//设置最大返回的记录条数
List<User> list = query.list();
for (User user : list) {
System.out.println(user.getUserId()+"<<<"+user.getUserName());
}
内联接查询
from User innerjoin [fetch] Entity.Score
或者用User.score.scorenum….类似用.它的属性
Creteria查询
Configurationcfg = new Configuration().configure();
SessionFactory sf =cfg.buildSessionFactory();
Session session = sf.openSession();
Criteria c = session.createCriteria(User.class);
//c.add(Restrictions.like("userName","%s%"));
//c.add(Restrictions.not(Restrictions.between("userId",1, 3)));
//c.add(Restrictions.eq("userId", 14));
//c.add(Restrictions.in("userId", new Integer[]{2,5}));
//c.add(Restrictions.ilike("userName", "赵"));
ProjectionList pl = Projections.projectionList();
pl.add(Property.forName("userName"));//查询多列
pl.add(Property.forName("userId"));
c.setProjection(pl);
c.add(Restrictions.or(Restrictions.between("userId", 1, 3),Restrictions.eq("userId", 2)));
List<Object[]> list = c.list();
System.out.println(list.size());
for (Object[] user : list) {
System.out.println(user[0]+"****"+user[1]);
}