你的位置:首页 > 软件开发 > 网页设计 > Hibernate一些_方法_@注解_代码示例

Hibernate一些_方法_@注解_代码示例

发布时间:2015-10-24 22:00:47
操作数据库7步骤 : 1 创建一个SessionFactory对象 2 创建Session对象 3 开启事务Transaction : hibernat ...

操作数据库7步骤 : 1 创建一个SessionFactory对象    Configuration :     // 4.0之后为了分布式,用了这种设计  链接hibernate框架    SessionFactory :        //创建一个SessionFactor对象         给SessionFactory对象赋值            sessionFactory = configuration.buildSessionFactory(serviceRegistry);    getCurrentSession :     opensession :         创建session对象,别管有没有,都创建        并且,用手动关闭资源,//第三步    3 开启事务:hibernate中,然后数据库操作,都必须是事务的,哪怕是查询//第四步    4 执行数据保存操作    //增     Save();//添加语句方法,生成insert into 表名(列,列)values(?,?)    //删            Delete();//删除语句方法,生成delete from 表 where id=?;    //改        Update();//修改语句,    //查        Load();//查询语句方法,生成查询语句,select * from 表 where id=?    Get :        Get();//查询语句方法,生成查询语句,select * from 表 where id=?//Get()和Load()的区别   Load()和Get()的区别        Get() : 只要调用Get()方法并提交,就直接生成查询语句去访问数据库//第五步 //第六步 //第七步//强注解,强注释  !!!对表来说,只有多的一方保存少的一方的引用,那些设置都是给程序看的,和数据库没有任何关系!!!@ :         @Table :             unique 设置该列是否设置唯一约束 默认值是false            nullable 设置该列的值是否可以为空,默认值是false            insertable 该列是否作为生成insert语句中的一个列,默认值是true  就是添加的时候,不在此列添加值            updatetable 该列是否作为生成updatetable语句中的一个列,默认是true  就是修改的时候,不修改此列            columnDefinition   为这个特定列覆盖sql ddl片段(这可能导致无法在不同数据库间移植)              table 定义对应的表 默认为主表            length 列长度, 默认值255            precision 列十进制精度(decimal precision) 默认值0   此列最大值为N位  位数            scale 如果列十进制数值范围(decimal scale)可用,在此设置,默认值0从数据库查询出来的数据,我都保存在这里    @TableGenerator   生成器 写在类上面    //有什么好处,能够解决数据跨平台保存的问题,因为不同的数据库平台生成数据的方式不一样,比如primary key(pk),如何还能保证呢?自己写个类库,兼容不同平台    @TableGenerator( //生成器    @Id 在实体类的getId()上面强注释    @GeneratedValue //在@id和getId()直接设置的  去生成器里面拿值,让每次要添加的数据,ID不相同,不唯一  设置该列自增    generator="生成器的名字"  //在哪个生成器取Id    @OneToOne     @ManyToOne        告诉hibernate我们是多对一的关系    @JoinTable : //更改表的名字和列的名字    @ManyToMany//多对多    // 想更改表的名字和列的名字            //在少的表,设置多的表中,保存少的表的引用的列的列名    @Embedded!!!只有在一对一的时候,才有主键映射和外键映射        @PrimaryKeyJoinColumn//外键映射mappedBy :     只要是有双向的关系,就必须保持对方的引用,必须有mappendBy(对面)(限于双向) 少的一方必须用set集合保存多的一方的引用,且两边都注明多对以@ManyToOne(多的写) 和@OneToMany(一个的写)    对表来说,只有多的一方保存少的一方的引用,那些设置都是给程序看的,和数据库没有任何关系@OneToMany(mappedBy="group",//就是在对面表中,生成一个列,这个列,专门保存本表的id的引用,当本表添加的时候,就让对面表的这个列,生成一个值,当对面表添加的时候,会参考这个列,生成一个ID,当做对面表的IDcascade :     cascade={CascadeType.ALL/DETACH/MERGE/PERSIST/REFRESH/REMOVE/自定义};    fetch=FetchType.EAGER/LAZY   //这是级联操作的时机,        生成语句 :         LAZY : 的时候,是如果 A里面有个列保存了B的引用,如果这里设置的是LAZY,那取出或者查看的时候,不会把这个保存B的引用的那个列拿出来,只取出别的列,如果在关闭session对象(缓冲)之前,用到那个保存B的引用的那个列,就会再生成一个查询语句,去数据库查询,再把那个列拿出来         生成语句 : //执行顺序    @Before :     @BerforeClass    @Test :     @After :     @AfterClass : //三种状态 :         瞬时状态(临时状态)--->持久状态(保存到数据库)--->游离状态(保存完成后关闭session对象 (session.close()))    Transient(瞬时状态) : 内存中一个实体类对象,没有ID,缓存中也没有 Persistent :     Persistent(持久状态) : 内存中有,缓存中有,数据库中有(ID) Detached :     Detached(游离状态) : 内存有,缓存没有,数据库有,ID    //这三种状态需要关注的问题是在该状态下,如果进行数据库操作会发生什么结果,比如改变属性的值会不会发出update语句    @EmbeddedId : 嵌入的,写在实体类中,主键类的引用上面,对应的get主键类();方法上面  2    new SchemaExport(new AnnotationConfiguration().configure()).create(false, true);//面向对象的形式 : HQL : Query : //-----------------简单的查询--------------        Query q = session.createQuery("from Category ");//Category是对象,不是数据库里面的表        List<Category> topics = q.list(); //这个是获取查询之后的对象,然后遍历集合,获取每个属性//----------------------where限定查询    Query q = session.createQuery("from Category c where c.name > 'c5'");//Category:Category那个类,c是别名,c.name是属性//--------------------排序查询oraer_by :     oraer by : 排序 值有 : //------------------去除重复distinct : //----------------预准备语句,就是SQL中带???问号的语句                .setInteger("min", 2)//设置对应位置的值  就是用 2 把 :min替换      !!!  :min 就相当于SQL语句中的 ? 问号 :冒号后面的名字,是自己指定的,用?也行  !!!      //直接写问号//--------------------------分页        Query q = session.createQuery("from Category c order by c.name desc");//这个是对Category这个对象对应的表进行操作,别名c order by排序  以Category对象里面的name为标准 降序setMaxResults :         q.setMaxResults(4);//从查询的那个语句中(结果集) 每页显示多少条 int类型setFirstResult :         q.setFirstResult(2);//从查询的那个语句中(结果集) 从第几条开始显示 int类型//--------------------查询特定的字段,查询指定列取出两个字段,返回结果是个Object数组,然后封装到了List中Query q = session.createQuery("select c.id,  c.name from Category c order by c.name desc");//查询Category对象中的 id 属性和 name 属性 别名c order by 排序 以name为准 降序        for (Object[] o : categories) {//foreach循环  只能遍历 数组 和 集合//--------------------------多表联查//多表联查的问题    Topic中 保存了Category的引用    Query q = session.createQuery("from Topic t where t.category.id = 1");//查询Topic 别名t 且 t中category的属性是Category的引用,通过t.cascade可以找到Category中的 id属性 为 1 的 ,然后显示全部            返回所有条数  返回值是long类型//---------------------------使用聚合函数    Query q = session.createQuery("select max(m.id), min(m.id), avg(m.id), sum(m.id) from Msg m");//------------------------使用条件限制between_and :         //值在...之间...                Query q = session.createQuery("from Msg m where m.id between 3 and 5");//查询msg 别名为m where限定 m的值在 3 和 5 之间in :     //值在(值,值,值...)里面就行//-------------------------is null 与 is not null@NamedQuery :     @NamedQueries( { @NamedQuery(name="名字", query="语句" ) } )//------------------------ is empty 为空     is not empty 不为空-empty :  is empty 为空     is not empty 不为空     is not empty 不为空 ----> exists 存在     Query q = session.createQuery("from Topic t where t.msgs is not empty");//-------------------------like的使用    % : 表示 任意多位,每位上可以为任意字符//---------------------------常用函数    lower(列/属性);// 全部小写        Query q = session.createQuery("select lower(t.title)," +//----------------------集群环境中,一台数据库服务        Query q = session.createQuery("select current_date, sysdate, current_timestamp, t.id from Topic t");//同步时间  如果有人在外地的添加时间,在我这就不对了,对应不上,同步一下        Query q = session.createQuery("from Topic t where t.createDate < :date");//查询topic  where 限定 createDate(创建时间) 小于 ?   当前时间//-----------------group by , having    //having//---------------------------------查询平均值 小于平均值         Query q = session.createQuery("from Topic t where t.id < (select avg(t.id) from Topic t)") ;// 查询topic对象 里面的id属性 小于 (查询topic对象 里面的id属性的平均值) avg(列) : 求指定列的平均值//---------------限定子查询ANY : 任意一个.如 小于任意一个 就是小于最大的就行   值 < any (1,4,8) 小于任意一个 ,就等于是小于最大值//-------------in , not , in , exists , not exists         Query q = session.createQuery("from Topic t where not exists (select m.id from Msg m where m.topic.id=t.id)") ; //查询 topic对象 别名 t  where限定 不存在(查询msg对象中的id属性,且 m里面的topic属性里面的id属性 等于 t里面的id属性) 通过m找到topic对象 再去访问topic对象里面的id属性        Query q = session.createQuery("from Topic t where exists (select m.id from Msg m where m.topic.id=t.id)") ;//查询 topic对象 别名 t  where限定 存在(查询msg对象中的id属性,且 m里面的topic属性里面的id属性 等于 t里面的id属性) 通过m找到topic对象 再去访问topic对象里面的id属性        //先查询msg对象中的id属性 where限定 通过m找到topic 再找到里面的id属性 等于 t里面的id属性//----------------------update  and  delete    两种写法 :     1 Query q = session.createQuery("update Topic t set t.title = upper(t.title)") ;//修改topic对象 别名t 设置里面的title属性  值为 upper(title)对应列名转为大写;//-----------------Native 原生  原生语言Native :     limit : 分页 (MySQL数据库用的)        SQLQuery q = session.createSQLQuery("select * from category limit 2,4").addEntity(Category.class);QBC : criterion :     Restrictions :     lt :     like :     createCriteria :     between :         Criteria c = session        前提条件是有继承关系的类中        父类  : @Inheritance(strategy = InheritanceType.格式) //一个实体类对应一个表,有继承关系的类,生成表的格式,在这能设置,有三种 : (生成表的格式)@DiscriminatorColumn :         辨别器 :        @DiscriminatorColumn(name = "列名", discriminatorType = DiscriminatorType.列的值的数据类型)//这是一个辨别器  , 就是在同一张表中,多生成一个列,这个列的列名,可以自己任意指定,后面是这个列中的属性(是integer(数字)还是string(字符串)还是char(字符))@DiscriminatorValue :         前提 : 是在继承关系的类中,并且,父类中设置生成表的格式,是SINGLE_TABLE,(都生成再同一个表中),才有效        这个意思是 : 当多个类生成同一个表的时候,会创建一个新的列,用于区分表中的每行数据是谁的,通过 @DiscriminatorColumn()辨别器,能设置此列的列名,和此列值的数据类型 , 然后再把每次存入的每行数据(就是对象),用辨别器来区分这个对象(这行数据)是谁的,然后再去类中找到这个标签 @DiscriminatorValue,把里面自己指定的名字,显示再创建的那个新的列上面(一般名字都用作本类的类名,容易区分)//---------------------------模糊查询        Example e = Example.create(tExample).ignoreCase().enableLike();// 静态方法 添加模糊查询的方法//-----------------1+N    //1+N:只要查询当前对象,他就会查询别的        @BatchSize(size = 5);////@BathSize: 默认是一个一个抓取,这里可以指定每次抓取的个数left_outer_join_fetch  :     (用iterator(迭代器)就不能使用join)     Query q = session.createQuery("from Topic t left outer join fetch t.category c ");//Topic是对象,对象里面有个属性是另外一个表的引用,t.category就能获得另外一个类对应的表和其中的属性        List<Category> topics = q.list();//把查询出来的值,封装到对应的对象中,再封装到list集合中前提 : 必须有一个对象(表)中的属性(列),保存的是另一个表的引用    如 :  List<Category> topics = session.createQuery("from 表1 别名(t) left outer join fetch t.表名2 别名(c)");    inner_join_fetch :          List<Category> topics = session.createQuery("from Topic t inner join fetch t.category c");    left_outer_join_fetch :      结果集 :     right_outer_join_fetch :     结果集 : iterator :         // iterator: 如果使用不允许使用join        while (categories.hasNext()) {//hasNext(),是问下一位还有没有元素,返回值为boolean型,true/falseCacheable :         开启缓存,要和ehcache.        List<Category> categories = session.createQuery("from Category").setCacheable(true).list();//查询Category对象对应的表,然后放入缓存中,封装到list集合中


原标题:Hibernate一些_方法_@注解_代码示例

关键词:Hibernate

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录