Hibernate汇总整理解读

上传人:小** 文档编号:50496157 上传时间:2022-01-20 格式:DOC 页数:31 大小:476.50KB
返回 下载 相关 举报
Hibernate汇总整理解读_第1页
第1页 / 共31页
Hibernate汇总整理解读_第2页
第2页 / 共31页
Hibernate汇总整理解读_第3页
第3页 / 共31页
点击查看更多>>
资源描述
Hibernate汇总整理单表(多表)的增/删/改/查(ID查询/查询所有)/ 一对多/多对一 /多对多/级联/延迟加载/控制反转/Hibernate搭建一般步骤:1. 下载jar包:2. 创建实体类对象:3. 配置Hibernate配置文件:hibernate.cfg.xml文件(链接数据库,关联实体类与数据库表映射配置文件):(1)链接数据库信息配置:方言、驱动、url、用户名、密码: I 三 昇f 勺车 15 弁冇 Wr iH-X 土 ,、J L_I - II -J J*lj J T Jr萨:name=Hdialectlorg. hibernatedialect .MySQLDialectjdbc : mpql :/lo匚alhost訂1smbms?characterEncodingutf8 com - mysql * jdb 匸.Driver :- name= connection usErname糸rxxytk/p_ 二name=rpconnection. password1,|123456(2)是否显示执行的sql语句:name= hibernate. show_sqlrtrue/(3)关联实体类与数据库表的关系映射文件:4. 配置类与表映射的文件:类名.hbm.xml文件,与实体类一起放在 model层中(配置实体类与数据库表映射关系信息):实体类包名、 实体类与数据库表对应的关系、实体类中属性与数据库表中字段对应关系(如果数据库字段名与实体类属性名一样,可以省略column属性)亡 实f本类名茜bl亡对应旳数据阡:表名-?ktlass nannE=5y:5RQlE t甘I !-主键生成策略:native本地订调用数据库自身的生成方式 Kproperty name;=r61NWiii巨讦 七丫戸已二灯云七孑壬行冒匸口丄unin=r&T巨二斤自帀巨灯 了h name=HcreateDatehl type=hjavautil.Dateh column= createdate /| prcipertj7 namWstatfSrrate-mapping5调用hibernate的API,创建测试类,进行测试;二. 单表的增、删、改、查写一般方法:(一般创建一个生成session对象的工具类方法,增、删、改要通过sessioi调用beginTransaction()方法开启事务,先通过 sessioi调用增、删、改的方法,然后在通过事务提交信息)工具类生成session对象的方法:pub lie clas d HibEtna/tdJti 1 public static Ses吕ion 呂EtS亡启sion() configure (hibernate* cfg. xml); VsessiorJirConfiguration cfg=new Configuration();SessionFactory sessionFactory = cfgbuildSessionFdutoTyO; /iSiJsessionFactorytTfF sessionSession session = sessionFactory. openSessionO ;)return session;3#1增:通过session调用save(Object object)方法,然后事务提交,最#后关闭session:(注意:增加后会将该主键ID返回到该对象中)public void addRole(SysRole role) Sessi口口 session 二 HibernateUtil. getSession();2删:先通过session调用get()通过ID查询方法返回一个对象,然后再通过session调用delete(Object object)方法,然后通过事务提交,最后关闭 session即可;public void d巳1Rol巳(Long id) Session session - HibernateUti 1. g巳;Transaction tx = session.beginTransactionO;Object role 二 session, get (SysRole, class, id);昌es昌ion, d亡let巳rol亡丿;tx. coiroiit 0: |sEssioTL C1US0()订3.改:通过session调用update(Object object)方法,然后通过事务提交,最后关闭session即可;(注意:对象中为空的属性在数据库中对应字段值便修改为null 了)5public void updateR口巳 role) Session session = HibernateUtil. getSessionO :Trans aft ion tx 二 esiorLbeginTTansctioiiO;s合s吕ion. update(role); |1 X,counniit U :Isession, closeU ;1 一丨4通过ID查询:通过session调用get()方法返回一个对象,然后关闭sessi on 即可;public SysRole queryRoleXong id) hessian session 二 HibernateUtil. getSessionO;SysRo 1 e rol e = (SysRole.) session. getSysRole. class, id),session, close(),return role;J5. 查询所有:先通过session调用createQuery( from实体类对象名”)方法返回一个Query类型对象,通过返回的对象调用list()方法即可得到查询的结果集合,最后关闭sessio n即可;publicList queryAl1() List roleList=new ArrayList C);Sessian session = HibernateUtil. getSessionO :根据hql查询语句,.创建query对象”Query query = session, cr eat eQuery (J from SysRole);/调用query对象的liwtO方袪,返回列表 roleListquery. l.ist 0 ;return roleList:6. 增加或修改方法:saveOrUpdate(Object object方法,如果object对象有id那就执行修改,如果没有id那就执行增加;三. 通过ID查询的两种方法及其区别:(1) 通过ID查询的方法有:session.get(和sessionoad(两种方法;(2) 区别:如果数据库中没有该ID,那么get()方法会返回一个null 对象,load()方法会在你使用该对象的时候抛出一个异常;(因此:强 烈推荐使用get()方法来通过ID查询一条记录)四. Hibernate在Java中存在的3种状态:(1) Hibernate在Java中存在的状态有:瞬时状态、持久状态、 游离 状态;(2) 三种状态的理解:三种状态都是相对于数据库而言的: (跟数据库从来都没有关系的就 是瞬时状态;跟数据库有关系的就是持久状态; 跟数据库之前有关系, 后来又没有关系了那现在就是游离状态 )瞬时状态:就是在java中通过new创建一个新的对象,并且该对 象的信息并没有写入数据库;持久状态:就是通过session调用方法将对象的信息写入了数据库 中,对象中信息与数据库有关系了,那就是持久状态;游离状态:就是对象之前跟数据库有关系,事务提交,写入数据 库, session 关闭后,该对象跟数据库就没有关系了,就变成了游离 状态了;持久状态r:delete!)! r a j垃圾回收游离状态update)垃圾回收五. Hibernate的优缺点及与 Mybatis的区别:(1) Hibernate 的优点:对面向对象性能支持良好;可移植性好;(2) Hibernate 的缺点:需要使用数据库的特定优化机制时不适合用Hibernate;需要对数据进行大规模批量处理的时候不适合用Hibernate;(3) Hibernate 与 Mybatis 的区别:相对于 Mybatis 而言,Hibernate 的 ORM(Object Relation Mapping)实现更加完善;面向对象,开发者不必关注 SQL的生成;使用自由度不如直接使用 SQL的Mybatis灵活;六. Map对象转换为Set对象:对于Map对象不方便进行遍历,可 以先将Map对象转换为Set对象,然后通过foreach遍历Set对象即可,具体操作如下:通过Map对象调用entrySet()方法即可返回一个EntryvString,Object类型的集合Set,然后通过遍历Set集合来实现对Map的遍历;SetEntryString, Object entrySet =| paraFaip巴(); far (Ent ryJ,fr1 e where 1=1 i”String countHqselect count () fxoni SysKole where 1-1 ”;HashMap paraMap=new HashNap():if (StringUtils* isNotBlank(searchBean.呂亡tRoleName () lhql+二and roleName like :nameKeycountHql+- and roleName Like inaioeKey ;| paraiappm (口餌朮5* r%,r+searchBean. eetRoleNamel) +|Query query = session, ere at eQuery (hql);Query countQuery=session creat eQuery (countHql);query- setProperties(paraHap): countQuery. setProperties (paraJlap);3给hql中参数进行赋值:(1) 如果参数类型确定,可以用:set参数类型(int positioin,String val) 和set参数类型(string name,String val两种方法进行赋值,第一种是通 过角标,第二种是通过对应的 name进行赋值;(2) 如果参数类型不确定,可以用:setParameter角标,Object object); 进行赋值;(3) 如果参数的值保存在一个Map集合中,然后通过调用setProperties(Map map)进行赋值(对于多条件多参数赋值时, 强烈推荐用此方法进行赋值)十.HQL实现动态查询的方法:(思路:通过if判断查询条件是否存在,如果存在就给hql进行字符串的拼接,与写sql动态查询一致)打罡文一t分页查询方牡public PageBean query4Page(SnibmsProvider jmtmisProvider, PageBean pageBean) Session session = HibernateUtil.;String hql = from SmbmsProvider where 1=1 ;七工1件官 uoutrfcHal吕e亡亡七 jzount(*) 干广巾whmr皀 丄=1 11;Map paramMap = new HashMp()j if广ingUtiLs * 让Nathql+=r, and proCode = : proCode; countHql+=r, and proCode = :proCode; paramHap.put(hbproCodenj smbmsProvider.getProCode();if (StringUtils . isWotFLar?fe( smbmsProvider.getProN日mm() hql+=T1 and proName like:proName; countHql+-M and pro Name like j proName1;parsmMap.put(*hproNanteHt M%H+sfflbmsProvidergetProName()+*%1h);if (StringUtils. tsA/otBLanfefsmbmsProvider. getlProPone() hql+= and proPone = :prcPone; courrtHql+二 and proPone = : proPone; paramap. put(r,proPoner,j smbmsProvider. get?roPoneO );if(smbmsProvider,getCreatianDate f)t =null) hql+= snd creationDate = :creationDate; 匚ountHql+=r,日nd urm日七ionD日七总 =:ureatianDate; paramMap,putereationDatej smbrnsProvider.getCreationDateQ);1一. HQL实现分页的方法:(思路:在动态查询的基础之上调用相应的方法求出符合查询条件的总记录数、分页的结果集合)1213Session session = HibernateUtil.getSession();String hql = fromSmbms Provider where 1=1君 匸quntHq丄 =乜己1皀亡七Frain Embin吕Proy找由li旨rhfZi 11 ;MsipfStringObj昔pa广arniMeip = n电如 H自shMaipctringjObjwutAQ; if (S 七 ringlTtilg. isWotfllan/rt smbmsProvider. get ProCode () hql+= and proCode = proCode; countHql+= and proCode = :proCcde; paramMap.putCnproCode4 smbmsPrcvider,呂虔tProCode();if (StringUtils*isA/otBtan/ffsmbmsProvidar,getProName() hql+=M and prohlame like : prohlame; countHql+=n snd proName like :proName;paramMap. put(proName, %,+smbnisProvider. getProName( ) + r,X)-Query query = session.createQuery(hql)Query countQuery = session.createQuery(countHql); query.setProperties fparamMap);countQuery * setPrope rties(par-amMap);query. setFirspm 巨芒日己已门.get St art ();query+setMaxResultBean.getPdgeSize();Long total = (Long) count Query. uniqueResult(); 通过调用 uniqueR&que$t()方擬取官 i 陽 pageBean.setTotal(totali.ntValue() j通过调fflsetfiretResultO法设置开丈卜位置 邇过调用鸵tMaxR&sulte)方送适直阳geSi比List smbmsProviderList = query*list()j 通过调用I【或防迭返回皓棘 pageBean.setRows(smbmsProvideLigt)jreturn十二.投影(只用于统计显示,显示某几个字段,不查询所有字段):1. 基础知识:(1) 如果查询显示所有字段返回的是Object对象;(2) 如果查询显示部分字段返回的是Object数组;2投影就是在查询显示时不显示所有字段,而是只显示自己需要的字 段信息,那么返回的就是一个Object数组,非常不方便,可以通过以下方法让投影返回一个对象:(投影主要用于统计中)(1)如果查询显示信息是在一个已经在 xml文件中定义的实体类对 象时:那么可以直接在select new实体类名(各个属性名之间用逗号 隔开)#名字模糊查询,状态二,日期String hql=/,select new SysRole (r, rol eNaiDe r. createDate) from SysRole r ”;Query query = session. createQuery (hql);(2)如果查询显示的信息是自己新创建的一个实体类,未在xml中进行配置,那么在select后面通过构造方法创建对象时, 需要填写该 实体类所在的包名:/用容宇模诽腫询,状态二,日期String halseled new rsler vo, RoleVstr上口 1 亡亡.r亡亡自t亡D凸from SysRsle rQuery query 二 sess io nP cr eat eQuery (hql);十三.一对多、多对一关联配置以及级联增/删/改:1一对多关联在*hbm.xml文件中配置:(one-to-many)在配置实体类与数据库表映射关系中,增加一个fe签,然后主要配置name、class column(与此表主键id相关联的另一个表中的 关联字段),如果需要级联给set增加一个cascade属性,如果需要延 迟加载给set增加一个lazy=”alse”默认就是false (在相应的dao层 中,通过业务进行判断,如果需要获取一对多中的属性值,那么需要调用Hibernate类中的静态方法initialize对象一对多集合的get方法) 来初始化一对多的集合对象),如果需要控制反转给set增加一个inv erse 属性; 才 IBi Z/L 4.*才曰疋大子圧心 zrts 八2多对一关联在*.hbm.xml文件中配置:(many-to-one)在配置实体类与数据库表映射关系中,增加一个many-to-one标签,主要加属性name、class column(此表与另一张表主键 ID相关联的某列的列名),默认就是lazy二”false” ; ! - - column 联部门表的外键 -3.级联在*hbm.xml文件中配置:级联只需要在一对多中的set标签中增加一个属性cascade集合,属性值一般有 save-update/delete/all ;(一般都写 all 所有)4级联增:在一对多中增加,只需要传递一个一的对象即可,多的集合存储在一的对象中,这样可以通过级联增来实现添加一对象的同时 又添加了多的对象集合;(级联增加中也需要用到通过ID查询出一个 对象,千万不能new对象将ID赋值进去)5级联删:在一对多中删除,只需要传递一个一的ID即可,然后通 过ID查询出一个一的对象(千万不能 new对象将ID赋值进去),然 后通过级联删除一的对象就可以同时删除一的对象下的所有子信息 集合;6级联改:(一般用不到,只是了解有这个功能)十四.一对多延迟加载:(默认lazy二true )(实体类中与Set集合,不要写List集合)十五.在一对多中延迟加载,一般设置lazy为true (因为设置成false 后,所有查询都会查询所有的子信息,这样会导致性能比较差,因此一对多中一般都将lazy设置为true),需要非常注意的是,此时需要 在对应的dao层中根据业务进行判断,如果业务需要一对多下的属性值,那么需要在查询到一的对象后,调用Hibernate的静态方法initialize()方法将对象中的Set集合进行初始化,如果不初始化 set中 对象是null,没有任何属性值的;*查询单个部门以及部门下的员工* Qparain id* returnpublic Dept getDept(Long id) Dept dept=null;Session session = HibernateUti1. gdtS巳ssion();dept= (Dept) session, get (Dept., class, id);System 口ut. pTiirtlnCao调用HibernateJi的初始化方法,去加载孔丈集合中对象Hibernate, initialize (dept.耳etEitpSet 0 );session close();ruturn dept;十六.多对一查询时一般不用延迟加载,都是自己写hql查询多表(这 样的话只需要执行一个hql,查询的性能会很好):publ i c 亏 t atic void, main (String LI args J I./ TODO Auto-eneratedl meth口d stubSession session 二 HibematieUlLL gEtScssionO;Transaction ti - sessian. beginTransactionO ;/*Einp ctp = (Ent) sessionr loadCEirpclass, 111);Systeox out. trintln.(en. fetEnaire()+w:所属部门十已砂 getDept (), getDeiXNajne0);*/St ring hql=SEle ct new enrt. v 口 EnpV 口 (u-id e 亡巩沏匕.d i 比 dup tNaiTK! from Ent1 pb Dept d where r- dept, id=d- idQuery qutTy 二 session. cre-ateQueryCh-ql);List list = QeryB listO;for (EccpVo vu : list) Systeni, out - printin (vo t oStringO);ti. coiinit ();1 session, closet);十七.控制反转(in verse):(控制权在哪个表中是根据业务进行判 断的,如:员工表-部门表,那么控制权在员工表中比较好;如:订 单表-订单详情表,那么控制权在订单表中比较好)1控制反转在一对多中有用,在多对一中没有用(因为在多对一中默 认就是有控制权,不能进行反转);2如果控制权在多的表中,那么在增加一条多的记录时,网页传递过来的一个一的ID然后通过session调用get()方法获取一个一的对象,然后将一的对象赋值给多的对象中的属性即可,最终保存的是多的一个对象;Testpublic void testAddO Session session 二 HibernateUtil, getSessionO Transaction tx 二 sessionb巳茗inTransaction(); Enip Kiaofang=new Entp ().xiaofang setBname(,/开发部増加一个叫小券的员工dev=(Dept)session get (Dept, classj18#xi aofang. setDept (dev); sessi口口. save (siaofang); :name=empSetT,匸日sc日日巳=日1丄|tx. commit 0; session. close 0 ;十八.Hibernate中创建实体类 model时一般技巧:在Hibernate框架下,创建数据库中表对应的 model实体类时,需 要注意,一般的如果数据库中 对应的字段是外键(某个表的ID值), 在映射文件中配置的是实体类中与此字段对应的实体类属性 (因为页 面一般显示的不是可读性差的ID而是可读性比较强的内容),而不是 创建一个Long类型的属性;public class Material private Integer id; /主融private String material Mo; /卜贲峯号铝 St 广ins: mmti&irialName:W 沁二/private Integer sortld;在nib盯wt审匡黑匸夹伍真味下爲蔓栩资粪别I口类以外邕 宜接用料密卿对毀private String sortName; TTWTETi- private String m at erial Type i/规朴型号private String materialUniitj private Integer isrecycled /.是舌可回收 private String i.sReGycleStr;/-$a3!stringS1 private String description-普注Privat integer cresteUserld/总.1 建老idprivate Date GreataTime;/刨建旺可private Integer modifyllserld; /SJtSid private Date modify Time;2/里新时旬oirtCoLm七呂;/岀片訪址p r ivai:电! Mzt:m 总1 占口r-F m b t e 广 i m 15口 广七;/ / 料空匸别 十九.一对多、多对一配置文件中 column属性值选择技巧分析:一对多或多对一中,column属性值永远都是在多中选择与一中主键ID相关联的某列的列名;二十.多对多的配置:(多对多需要借助一个中间表,拆成两个一对 多进行处理)例如:角色与用户是多对多(在不同场合同一个用户可 以有不用角色),拆分成角色表、用户表、用户角色表共三张表,实 际需要建立实体类的是角色表和用户表共两个实体类。 具体配置信息 如下:1实体类中配置信息:(1)在角色表对应的实体类中的属性增加一个用户对象的Set集合属性,并同时创建一个HashSet集合,防止出现空指针异常;public class SysRole implements Serializable private Long id;private String roleName;|/角色下的用户private Set userset = new HashSetUser();(2)在用户表对应的实体类中的属性增加一个角色对象的Set集合属性,并同时创建一个HashSet集合,防止出现空指针异常;public class User private Long id;private String userName;/*用户拥有的角色*/private Set roleSet=new HaEhSet();2实体类对应配置文件*hbm.xml文件中的一对多配置信息:(1)用户实体类对应的*.hbm.xml配置文件中一对多配置信息:L+r InlA k7i 1 fFP1日1表习用尸表天麻田5T卿夕呱 iarclass=role.model,SysRolecolumn= role_id /邑表关:联的外电(2)角色实体类对应的*.hbm.xml配置文件中一对多配置信息:3实体类对应dao层中各个方法体中代码:多对多因为拆分成了 2个一对多,因此在某一个实体类对应的dao 层中的增/删/改/查的方法与一对多中实体类对应的 dao层中的方法 基本一致(需要非常注意的是:增加时控制权在谁手里的问题, 还有 延迟查询时对象中属性集合的初始化,以及增加时通过ID查询获取对象等几个重要的问题); 二一.多对多的延迟加载查询:一般分为两种延迟加载查询:查询一个用户所拥有的各种角色、查询一个角色下所有的用户,查询基本思路类似于一对多中的延迟加 载查询(需要特别注意的是:一对多中 lazy=”alse”,根据业务需要 显示子信息的时候需要在 dao 层中调用 Hibernate 中的静态方法 initialize(方法进行初始化)二十二多对多的级联增加 /删除/修改:1、级联增加:类似于一对多的级联增加( 需要特别注意的是: 1:控 制权在谁的手里 :2:在给对象中的对象属性赋值的时候,不是新创建 一个对象,而是通过session调用get()方法通过ID查询出一个对象, 然后将对象赋值给属性的 )2、级联删除:3、级联修改:(一般级联修改的意义不大, 因为数据库中多表关主要 是通过主键ID进行关联的)二十三多表连接查询:1. 多表查询基本知识:( 1)多表查询的连接:内连: =或 join左外连: left join右外连: right join2. 多表查询的思路:首先:创建一个vo实体类,然后通过编写HQL(如果方便最好是将 编写的HQL创建一个视图)运行HQL查询出一个vo实体类的对象集 合即可;3. 多表查询的一般步骤: (多用于统计的多表查询 )(1) 根据要显示的内容创建一个vo实体类,该实体类中的属性一般 不要出现对象属性,尽量都是基本类型或基本类型对应的包装类, 这 样hql执行时只执行一句hql,可以优化查询的效率;(2) 编写多表查询的hql,运行hql得到一个vo实体类的对象集合(如果有条件最好是根据hql创建一个视图,同时创建一个与vo实体类对应的配置文件,将视图与vo实体类进行映射配置,最后直接通过查询视图集合得到vo实体类的对象集合)(3) 得到结果集合后,将结果集合传递给网页显示出来即可;二十四.利用Hql多表外联查询:(与sql有差别,需特别记忆,因为 hql是面向对象的,并且实体类中有关外键的都变成了相应的实体类 属性,因此利用Hql进行多表外联查询是通过先访问一个大的实体 类,然后通过left join大实体类别名外键的对象属性名,实现多表 外联查询)* #统计部门的人辄显示部门辿部门名称 select d. idd. dept_iiarae, count t e. id) from dept d left join emp e on e. dept_ld=d. id group by dL id, d. dept_name*/ ” ”StringBuffer countHql=new StringBuffer C select d. id, d. deptNamej count (e. id)countHql. append from Emp e right join dept d 7append(u);countHql. append (TJ group by dd. deptName);System, out. pr int In (countHql);Query cauntQuery = sessionuieBtuQueryF(ucjuntHqL”tcjStiiTi();Listublic cl&sa Dett inpltmerits Serialiaaible 根据底层裁据库自动选择(默认)若数据库支持自增长类型则为自动增长希 Id#GeneratedValue(strategy=GenerationType. AUTOprivate Long id;SC al umn (name- dep t _namr )private StTing deptNauc;倉Columnprivate String loc;fiOneTciM any (mappe dBy= dep it 、privat e Listem?Li st=nc/f ArrayListEnpO ;|(2)多对多的注解:(多对多的注解同单表注解不同的地方也是在于多对多中控制权在谁手里的问题,通过注解实现控制权在谁手里的问题,其余注解与单表注解相同)1有控制权的实体类中的注解:需要写ManyToMany(cascade二CascadeType.ALL注解,还需要写 JoinTable(name=中间 表名”,JoinColumns=JoinColumn(name=+间表与此类对应表关联的 夕卜键列名 ”),1 nverseJoinColumns=JoinColumn(namg”中间表与另一 个表相关联的外键列名”)(Ent ity (name-ptifcil ic las3 User SliK=nEratedf-3bjje (st rat SK/G-EnjETat ianTxt. AUTXl)| pri vate Liq i.d;9Colum (nai=uiB4r_nae*)privsts Strinc usvrtfaDE!,+用户拥有的角邑中阖审与月一个英旋的外联刮名r itwnrsc jQiMcdnfi=#JciirtDl wt (ie=bolu_iG )MEnnyT olany (c-as(Joinlabl e 佃胡阳爲畐阳er_rol e, joiro uiri8Jciirolijjm(nanc=rHer_i4*),?private Set ralsStt-nsw HashSetroleSet) 用卢对象通rttroleSel属性进行操作来维护双方的关系 private Set userSet = new HashSet();二十九.多表注解的实体类需要在核心配置文件中注册:就是将有注解的实体类在核心配置文件中写在实体类所在的包路径:三十.注解总结:1首先实体类上需要配置实体类及相应的表名;2.主键ID属性上需要配置主键ID及主键生成策略;3属性名与对应表列名一样的只需要写 Column注解即可;4属性名与对应表列名不一样的不仅要写 Column注解还要列名;5在多表中有控制权的实体类中对应的对象或集合属性上,需要配置 一对多或多对一或多对多, 并配置级联, 还需要配置关联的列名或中 间表名或另一个表中的外键列
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!