hibernate入门

***********

1,hibernate.hbm.xml,

表与对象的映射规律

2,hibernate.cfg.xml

hibernate的配置文件

比如还有那些其他资源文件,在什么地方

hibernate将要映射成那种数据库的语言

hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.hbm2ddl.auto=update <!--是否需要根据映射源数据生产数据表结构 -->
hibernate.show_sql=true
hibernate.format_sql=false

注:

hibernate.hbm2ddl.auto可以取值:

create-drop:每次创建,关闭时删除

create:每次创建前删除,关闭时不删除(测试时方便)

update:每次发现有不同,则更新

validate:每次发现有不同,不会更新,而是报错,所以更安全

连接数据库的信息,如驱动名,url,username,password

3,hibernate默认把自动提交事务关闭了

所以要显式提交

tx=s.beginTransaction()

tx.commit();

4,mysql默认的engine=myisam

不支持事务,不能回滚

而InnoDB支持事务,可以回滚

二,入门小例子

 hibernate工具类,提供session接口

public final class HibernateUtil {
    private static SessionFactory sessionFactory;
    static{
        Configuration cfg=new Configuration();
        cfg.configure();
        sessionFactory=cfg.buildSessionFactory();
    }
    public static SessionFactory getSessionFactory(){
        return sessionFactory;
    }
    public static Session getSession(){
        return sessionFactory.openSession();
    }
}

使用工具类进行对象的crud

public class Base {
    public static void main(String[] args) {

        
        User user = new User();
        user.setBirthday(new Date());
        user.setName("maple");
        saveUser(user);
        //tx.commit();// 提交事务,必须显示提交事务,hibernate把自动提交事务关闭了
        
        System.out.println("end");
    }
    static void saveUser(User user){ 
        Session s=null;
        Transaction tx=null;
        try{
            s=HibernateUtil.getSession();
            tx=s.beginTransaction();
            s.save(user);
            tx.commit();
        }catch(HibernateException e){
            if(tx!=null)
                tx.rollback();
            throw e;//还要抛出异常,向方法调用者报告异常,否则只是回滚,是将异常隐藏了,调用者不知            
        }finally{
            if(s!=null){
                s.close();
            }
        }
    }
    
    static void saveUser1(User user){
        Session s=null;
        Transaction tx=null;
        try{
            s=HibernateUtil.getSession();
            tx=s.beginTransaction();
            s.save(user);
            tx.commit();
        }finally{
            if(s!=null){
                s.close();
            }
        }
    }
}

 2014.11.15

1,get(Class,id),有select语句

2,load(),没有select语句,如果使用load后,立即

User user=(User) s.load(User.class, id);

//com.maple.hibernate.domain.User$$EnhancerByCGLIB$$db1767bftttt
System.out.println(user.getClass().getName()); //返回的是user子类的名称
System.out.println(user.getName()+"gggg");//可正确执行,产生select语句,无异常

3,save(),如果不开启事务,虽然有insert语句,即开始进行了插入,但发现未开启事务,没有提交,后来会回滚;

pesist(),无事务时,无insert语句,不会进行插入,

4,saveorupdate(),根据id和version判断是保存还是更新,调用merge,对象还是脱管的

5,lock(),对象变为持久化对象,但不会同步对象的状态

2014.11.16

1,query.uniqueResult(),最多只有一条语句

2,User.hbm.xml,如果类名映射的表名和数据库中的关键字一样,为避免冲突,column,table改写,或者加单撇号

3,Query接口的分页查询

query.setFirstResult(0); //起始记录号
query.setMaxResults(1); //共查找出多少条
List<User> list=query.list(); //一条select语句
for(User user:list){
System.out.println(user.getName());
}

mysql分页语句:

select * from user limit 0,2;

从记录索引0开始,查找2条记录

 oracle分页

1,

select * from t_base_menu where
rowid in
(select rid from

(select rownum rn,rid from(select rowid rid,menu_name from

t_base_menu order by menu_name desc) where rownum<2)

where rownum>0)

order by menu_name desc;

三,过程中遇到的一些问题

1,TBaseUser,TBaseRole,

 ...?????

主外键

***********

有问题在公众号【清汤袭人】找我,时常冒出各种傻问题,然一通百通,其乐无穷,一起探讨


原文地址:https://www.cnblogs.com/qingmaple/p/4096035.html