hibernate笔记

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 属性joinselect 提高搜索性能

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]);

       }

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值