Hibernate

来源:互联网 发布:爱剪辑mac能用吗 编辑:程序博客网 时间:2024/05/16 09:12
1.hibernate开发环境搭建》》引入jar:hibernate.jar+required+jpa+驱动包》》hibernate.cfg.xml配置文件>>javabean/*.hbm.xml实体类对应的映射文件2.hibernate api》》configuration加载默认配置文件SessionFactory sf;》》SessionFactorysf=new Configuration().configure().buildSessionFactory();>>Sessionsession=sf.openSession();session.beginTransaction()>>Transactionsession.getTransaction().commit();session.close()>>QueryQuery query=session.createQuery(stu); query.getList();Query query =session.createQuery("from Student where id=?");query.setParameter(0,1);(Student) query.list().get(0);>>Updatesession.update(stu);>>deletesession.delete(stu);Object obj=session.get(Student.class,id);>>savesession.save(stu);主框架<hibernate-mappingpackage="cn.itcast.c_hbm_config"auto-import="true"></hibernate-mapping>主键映射<!-- 主键,映射--><idname="empId"column="id"><!-- 主键的生成策略identity  自增长(mysql,db2)sequence  自增长(序列), oracle中自增长是以序列方法实现native  自增长【会根据底层数据库自增长的方式选择identity或sequence】如果是mysql数据库, 采用的自增长方式是identity如果是oracle数据库,使用sequence序列的方式实现自增长increment  自增长(会有并发访问的问题,一般在服务器集群环境使用会存在问题。)assigned  指定主键生成策略为手动指定主键的值uuid      指定uuid随机生成的唯一的值foreign   (外键的方式, one-to-one讲) --><generatorclass="uuid"/></id>属性映射<!-- 普通字段映射propertyname  指定对象的属性名称column 指定对象属性对应的表的字段名称,如果不写默认与对象属性一致。length 指定字符的长度, 默认为255type   指定映射表的字段的类型,如果不指定会匹配属性的类型java类型:     必须写全名hibernate类型:  直接写类型,都是小写--><propertyname="empName"column="empName"type="java.lang.String"length="20"></property><propertyname="workDate"type="java.util.Date"></property><!-- 如果列名称为数据库关键字,需要用反引号或改列名。 --><propertyname="desc" column="`desc`"type="java.lang.String"></property>复合主键映射<!-- 复合主键映射 --><composite-idname="keys"><key-propertyname="userName"type="string"></key-property><key-propertyname="address"type="string"></key-property></composite-id>1.集合映射private Set<String> address;<setname="address"table="t_address"> <keycolumn="uid"></key> <elementcolumn="address"type="string"></element> </set>private List<String> addressList = new ArrayList<String>();<listname="addressList"table="t_addressList">   <keycolumn="uid"></key>   <list-indexcolumn="idx"></list-index>   <elementcolumn="address"type="string"></element>  </list>private Map<String,String> addressMap = new HashMap<String, String>();<mapname="addressMap" table="t_addressMap"> <keycolumn="uid"></key> <map-keycolumn="shortName"type="string" ></map-key> <elementcolumn="address"type="string" ></element>  </map>2.关联映射一对一映射<!-- 一对多关联映射配置  (通过部门管理到员工)Dept映射关键点:1.  指定映射的集合属性: "emps"2.  集合属性对应的集合表: "t_employee"3.  集合表的外键字段   "t_employee. dept_id"4.  集合元素的类型 --> <setname="emps">   <!-- table="t_employee" -->  <keycolumn="dept_id"></key>  <one-to-manyclass="Employee"/> </set>多对一映射<!-- 多对一映射配置Employee 映射关键点:1.  映射的部门属性  :  dept2.  映射的部门属性,对应的外键字段: dept_id3.  部门的类型 --> <many-to-onename="dept"column="dept_id"class="Dept"></many-to-one>通过多对一的方式来维护关系,可以减少update语句的生成,提高hibernate的执行效率学生和班级关系,将班级的id放在学生表中,就是多对一的映射关联关系:Inverse属性FALSE不反转可以清除外键的作用多对一默认是falseTRUE控制反转当前方没有控制权,也就是受到外键的约束cascade属性cascade  表示级联操作  【可以设置到一的一方或多的一方】none          不级联操作,默认值2.hibernate开发环境搭建》》引入jar:hibernate.jar+required+jpa+驱动包save-update,delete    级联保存、更新、删除all                 同上。级联保存、更新、删除多对多映射<setname="developers"table="t_relation"cascade="save-update"> <keycolumn="prjId"></key> <many-to-manycolumn="did"class="Developer"></many-to-many> </set><setname="projects"table="t_relation"><keycolumn="did"></key><many-to-manycolumn="prjId"class="Project"></many-to-many></set>一.对象的状态1临时状态直接new出来的对象,还没有放入数据库中2持久化状态处于session的管理,会保存到数据库中3游离状态就是读出session后,session关闭,对象还存在,还被使用二、缓存一级缓存减少数据库的访问次数,当用save/get/load的时候会在缓存中,session关闭就会消失二级缓存二级缓存是作用在SessionFactory上面的插件,可以共享session,可以放入内存或者磁盘中一级缓存session.flush()让一级缓存与数据库同步session.evict(arg0)清空一级缓存中指定的对象session.clear()清空一级缓存中缓存的所有对象list()一次把所有的记录都查询出来在缓存中,但不会从缓存中获取数据iterator会放入缓存,也会从缓存中取数据!懒加载get:及时加载,只要调用get方法立刻向数据库查询load:默认使用懒加载,当用到数据的时候才向数据库查询ü  lazy 值true   使用懒加载false   关闭懒加载extra   (在集合数据懒加载时候提升效率)在真正使用数据的时候才向数据库发送查询的sql;如果调用集合的size()/isEmpty()方法,只是统计,不真正查询数据!组合映射和继承映射组合映射<!-- 组件映射 --><componentname="wheel"><propertyname="size"></property><propertyname="count"></property></component> 继承映射不建议使用一.hibernate查询1Get/load主键查询2对象导航查询3HQL查询注意,是用: select 类名 不能用 select * fromsession.createQuery("from Dept");4Criteria查询Criteria criteria = session.createCriteria(Employee.class);criteria.add(Restrictions.eq("empId", 12));System.out.println(criteria.list());5SQLQuery,本地SQL查询SQLQuery q = session.createSQLQuery("SELECT * FROM t_Dept limit 5;").addEntity(Dept.class);  // 也可以自动封装q.list()hibernate的分页查询 Query q = session.createQuery("from Employee"); // 从记录数 ScrollableResults scroll = q.scroll();  // 得到滚动的结果集scroll.last();//  滚动到最后一行int totalCount = scroll.getRowNumber() + 1;// 得到滚到的记录数,即总记录数// 设置分页参数 q.setFirstResult(0); q.setMaxResults(3);hibernate对连接池的支持,c3p0<propertyname="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property><!-- 配置连接池参数信息 --><propertyname="hibernate.c3p0.min_size">2</property><propertyname="hibernate.c3p0.max_size">4</property><propertyname="hibernate.c3p0.timeout">5000</property><propertyname="hibernate.c3p0.max_statements">10</property><propertyname="hibernate.c3p0.idle_test_period">30000</property><propertyname="hibernate.c3p0.acquire_increment">2</property>二级缓存一级缓存的范围小,时间短查看hibernate.properties配置文件,二级缓存如何配置?############################# Second-level Cache ##############################hibernate.cache.use_second_level_cache false【二级缓存默认不开启,需要手动开启】#hibernate.cache.use_query_cache true      【开启查询缓存】## choose a cache implementation【二级缓存框架的实现】#hibernate.cache.provider_class org.hibernate.cache.EhCacheProvider#hibernate.cache.provider_class org.hibernate.cache.EmptyCacheProviderhibernate.cache.provider_class org.hibernate.cache.HashtableCacheProvider 默认实现#hibernate.cache.provider_class org.hibernate.cache.TreeCacheProvider#hibernate.cache.provider_class org.hibernate.cache.OSCacheProvider#hibernate.cache.provider_class org.hibernate.cache.SwarmCacheProvider二级缓存,使用步骤1) 开启二级缓存2)指定缓存框架3)指定那些类加入二级缓存4)测试测试二级缓存!Hibernate.cfg.xml<!--****************** 【二级缓存配置】****************** --><!-- a.  开启二级缓存 --><propertyname="hibernate.cache.use_second_level_cache">true</property><!-- b. 指定使用哪一个缓存框架(默认提供的) --><propertyname="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property><!-- 开启查询缓存 --><propertyname="hibernate.cache.use_query_cache">true</property><!-- c. 指定哪一些类,需要加入二级缓存 --><class-cacheusage="read-write"class="cn.itcast.b_second_cache.Dept"/><class-cacheusage="read-only"class="cn.itcast.b_second_cache.Employee"/><!-- 集合缓存[集合缓存的元素对象,也加加入二级缓存] --><collection-cacheusage="read-write"collection="cn.itcast.b_second_cache.Dept.emps"/>查找Query q = session1.createQuery("from Dept").setCacheable(true);//从二级缓存找session的管理当线程结束的时候,session自动关闭
0 0
原创粉丝点击