Hibernate教程.xls_第1页
Hibernate教程.xls_第2页
Hibernate教程.xls_第3页
Hibernate教程.xls_第4页
Hibernate教程.xls_第5页
已阅读5页,还剩115页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一 ORM入门 二 第一个Hibernate程序 五 Hibernate核心API介绍 六 Hibernate主键 七 多对一单向关联映射 八 一对多单向关联映射 九 一对多 多对一双向关联 十 一对一关联映射 十一 多对多单向关联映射 十二 多对多双向关联映射 十三 关联映射课堂练习 十四 加载策略 十五 抓取策略 十二 Cascade的使用 十三 Hibernate检索 十四 Hibernate的缓存机制 十五 Hibernate事务 十六 Hibernate并发处理 ORMORM入入门门 一 程序的分层结构 双层应用 应用程序层 数据库层 三层应用 表述层 业务逻辑层 数据库层 四层应用 表述层 业务逻辑层 持久化层 数据库层 N层应用 二 持久层 三 JDBC编程的缺点 实现业务逻辑的代码和数据库访问代码掺杂在一起 使程序结构不清晰 可读性差 在程序代码中嵌入面向关系的SQL语句 使开发人员不能完全运用面向对象的思维来编写程序 业务逻辑和关系数据模型绑定 如果关系数据模型发生变化 例如修改了CUSTOMERS表的结构 那么必须手工修改程序代码中所有相关的SQL语句 这 增加了维护软件的难度 如果程序代码中的SQL语句包含语法错误 在编译时不能检查这种错误 只有在运行时才能发现这种错误 这增加了调试程序的难度 JDBC API ORM实现 如Hibernate 四 ORM简介 什么是ORM或ORMapping或对象关系映射 ORM是一种设计模式 用于解决对象 关系的不匹配问题 ORM模式的工作原理 ORM和MVC 实现框架 实现框架 MVC设计模式 ORM设计模式 Struts webwork等 Hibernate iBatis等 实现业务逻辑的代码和数据库访问代码掺杂在一起 使程序结构不清晰 可读性差 在程序代码中嵌入面向关系的SQL语句 使开发人员不能完全运用面向对象的思维来编写程序 业务逻辑和关系数据模型绑定 如果关系数据模型发生变化 例如修改了CUSTOMERS表的结构 那么必须手工修改程序代码中所有相关的SQL语句 这 如果程序代码中的SQL语句包含语法错误 在编译时不能检查这种错误 只有在运行时才能发现这种错误 这增加了调试程序的难度 Struts webwork等 Hibernate iBatis等 第第一一个个HibernateHibernate程程序序 一 使用Hibernate的步骤 创建Hibernate的配置文件 创建持久化类 创建数据库表 创建并配置对象 关系映射文件 通过Hibernate API操纵数据库 二 创建Hibernate的配置文件 三 创建持久化类Customer PO Entity 和表Customers 注意 持久化类符合JavaBean的规范 包含一些属性 以及与之对应的getXXX 和setXXX 方法 持久化类有一个id属性 用来惟一标识Customer类的每个对象 在面向对象术语中 这个id属性被称为对象标识符 OID Object Identifier 通常它都用整数表示 Hibernate要求持久化类必须提供一个不带参数的默认构造方法 true scott jdbc oracle thin localhost 1521 oracle org hibernate dialect Oracle9Dialect tiger oracle jdbc driver OracleDriver 如 四 创建并配置对象 关系映射文件 映射文件的作用 drop table CUSTOMERS create table CUSTOMERS ID number primary key NAME varchar 15 not null EMAIL varchar 128 import java io Serializable public class Customer implements Serializable private int id private String name private String email public Customer public String getEmail return email public void setEmail String email this email email public int getId return id public void setId int id this id id public String getName return name public void setName String name this name name 具体的配置如下 将该映射文件的信息写入Hibernate的配置文件中 五 通过Hibernater的API操作数据库 六 练习 封装一个DAO类 实现增 删 改查的功能 熟练 参参考考项项目目 demo 1 demo 1 持久化类符合JavaBean的规范 包含一些属性 以及与之对应的getXXX 和setXXX 方法 在面向对象术语中 这个id属性被称为对象标识符 OID Object Identifier 通常它都用整数表示 true scott jdbc oracle thin localhost 1521 oracle org hibernate dialect Oracle9Dialect tiger oracle jdbc driver OracleDriver drop table CUSTOMERS create table CUSTOMERS ID number primary key NAME varchar 15 not null EMAIL varchar 128 import java io Serializable public class Customer implements Serializable private int id private String name private String email public Customer public String getEmail return email public void setEmail String email this email email public int getId return id public void setId int id this id id public String getName return name public void setName String name this name name 一一 HibernateHibernate的的核核心心APIAPI Hibernate框架中三个核心的类有Configuration SessionFactory 和 Session 三者之间的关系是 二二 ConfigurationConfiguration的的使使用用 Configuration是一个类 完整的类名是org hibernate cfg Configuration 它的主要功能是根据配置文件的信息 做一些初始化的操作 得到Configuration对象的两种主要方式 第一种 使用默认的配置文件 创建Configuration对象 Configuration config new Configuration 运行configure 方法 进行初始化的工作 Configuration config config configure 或者 Configuration config new Configuration configure 第二种 通过指定的配置文件进行初始化操作 Configuration config new Configuration configure new File src myConfig xml 三三 SessionFactorySessionFactory的的使使用用 SessionFactory是一个接口 完整的类名是org hibernate SessionFactory 它的子类的功能主要是用来创建Session对象 SessionFactory是线程安全的 加上其本身比较消耗内存 尤其在PO对象较多的时候 所以 如果只连接一个数据库 则一个SessionFactory就足够了 如果要在一个项目中使用多个数据库 则需要创建多个SessionFactory对象 配置文件ConfigurationSessionFactory 得到SessionFactory对象的具体方式 先得到Configuration对象 Configuration config new Configuration configure 通过Configuration对象的buildSessionFactory 方法创建SessionFactory对象 SessionFactory sf config buildSessionFatory 四四 SessionSession的的使使用用 Session接口是Hibernate中用的最多的一个接口 对象的管理 事务处理等所有的数据库操作都是由它的子类完成的 得到Session对象的操作 创建SessionFactory对象 SessionFactory sf config buildSessionFatory 创建Session对象 Session s sf openSession Session的常用方法如下 五五 HibernateHibernate中中的的对对象象状状态态 Session的方法和对象状态的转变关系 save Object obj 持久化一个对象 saveOrUpdate Object obj 如果给定OID则执行更新 如果不给定则执行保存 get Class class Serializable id 根据给定的OID和class来加载指定的实体 如果不存在则返回null Load Class class Serializable id 根据给定的OID和class来加载指定的实体 如果不存在则返回空值异常 CreateQuery String queryString 根据给定的HQL查询条件创建一个Query对象 update Object obj 更新持久化对象 close 关闭该session对象 临时状态 transient 刚刚用new语句创建 还没有被持久化 不处于Session的缓存中 处于临时状态的Java对象被称为临时对象 持久化状态 persistent 已经被持久化 加入到Session的缓存中 处于持久化状态的Java对象被称为持久化对象 游离状态 detached 已经被持久化 但不再处于Session的缓存中 处于游离状态的Java对象被称为游离对象 对象的状态以及在JVM中的生命中期对比 Session的update 方法分析 update 方法完成以下的功能 1 把Customer对象重新加入到Session缓存中 使它变为持久化对象 2 计划执行一个update语句 值得注意的是 Session只有在清理缓存的时候才会执行update语句 并且在执行时才会把 Customer对象当前的属性值组装到update语句中 因此 即使程序中多次修改了Customer对象的属性 在清理缓存时只会 执行一次update语句 如下面的程序所示 创建一个新对象 此时 对象处于临时状态 Customer customer new Customer customer setName Tom Session session1 sessionFactory openSession Transaction tx1 session1 beginTransaction 将对象加入session中 对象此时处于持久化状态 session1 save customer mit 关闭session 此时Customer对象变为游离对象 session1 close 创建一个新的session Session session2 sessionFactory openSession Transaction tx2 session2 beginTransaction 在和session2关联之前修改Customer对象的属性 customer setName Linda 通过update 方法 将对象重新加入session 对象的状态转为持久化状态 session2 update customer 在和session2关联之后修改Customer对象的属性 customer setName Jack mit session2 close 注意 虽然修改了两次对象的值 但是 只执行一次更新 六六 SessionSession的的缓缓存存机机制制 当Session的save 方法持久化一个Customer对象时 Customer对象被加入到Session的缓存中 以后即使应用程序中的引 用变量不再引用Customer对象 只要Session的缓存还没有被清空 Customer对象仍然处于生命周期中 tx session beginTransaction Customer c1 new Customer Tom new HashSet Customer对象被持久化 并且加入到Session的缓存中 session save c1 Long id c1 getId c1变量不再引用Customer对象 c1 null 从Session缓存中读取Customer对象 使c2变量引用Customer对象 Customer c2 Customer session load Customer class id mit 关闭Session 清空缓存 session close 访问Customer对象 System out println c2 getName c2变量不再引用Customer对象 此时Customer对象结束生命周期 c2 null update 方法完成以下的功能 1 把Customer对象重新加入到Session缓存中 使它变为持久化对象 2 计划执行一个update语句 值得注意的是 Session只有在清理缓存的时候才会执行update语句 并且在执行时才会把 Customer对象当前的属性值组装到update语句中 因此 即使程序中多次修改了Customer对象的属性 在清理缓存时只会 执行一次update语句 如下面的程序所示 创建一个新对象 此时 对象处于临时状态 Customer customer new Customer customer setName Tom Session session1 sessionFactory openSession Transaction tx1 session1 beginTransaction 将对象加入session中 对象此时处于持久化状态 session1 save customer mit 关闭session 此时Customer对象变为游离对象 session1 close 创建一个新的session Session session2 sessionFactory openSession Transaction tx2 session2 beginTransaction 在和session2关联之前修改Customer对象的属性 customer setName Linda 通过update 方法 将对象重新加入session 对象的状态转为持久化状态 session2 update customer 在和session2关联之后修改Customer对象的属性 customer setName Jack mit session2 close 注意 虽然修改了两次对象的值 但是 只执行一次更新 Session缓存的作用 Session何时清理缓存呢 1 减少访问数据库的频率 2 应用程序从内存中读取持久化对象的速度显然比到数据库中查询数据的速度快多了 1 当应用程序调用net sf hibernate Transaction的commit 方法的时候 commit 方法先清理缓存 然后再向数据库 提交事务 2 当应用程序显式调用Session的flush 方法的时候 此时会执行sql语句 但注意 事务并未提交 当Session的save 方法持久化一个Customer对象时 Customer对象被加入到Session的缓存中 以后即使应用程序中的引 用变量不再引用Customer对象 只要Session的缓存还没有被清空 Customer对象仍然处于生命周期中 tx session beginTransaction Customer c1 new Customer Tom new HashSet Customer对象被持久化 并且加入到Session的缓存中 session save c1 Long id c1 getId c1变量不再引用Customer对象 c1 null 从Session缓存中读取Customer对象 使c2变量引用Customer对象 Customer c2 Customer session load Customer class id mit 关闭Session 清空缓存 session close 访问Customer对象 System out println c2 getName c2变量不再引用Customer对象 此时Customer对象结束生命周期 c2 null Session Session Hibernate框架中三个核心的类有Configuration SessionFactory 和 Session Configuration是一个类 完整的类名是org hibernate cfg Configuration 它的主要功能是根据配置文件的信息 做一些初始化的操作 Configuration config new Configuration configure new File src myConfig xml SessionFactory是一个接口 完整的类名是org hibernate SessionFactory 它的子类的功能主要是用来创建Session对象 SessionFactory是线程安全的 加上其本身比较消耗内存 尤其在PO对象较多的时候 所以 如果只连接一个数据库 则一个SessionFactory就足够了 如果要在一个项目中使用多个数据库 则需要创建多个SessionFactory对象 SessionFactory 通过Configuration对象的buildSessionFactory 方法创建SessionFactory对象 Session接口是Hibernate中用的最多的一个接口 对象的管理 事务处理等所有的数据库操作都是由它的子类完成的 save Object obj 持久化一个对象 saveOrUpdate Object obj 如果给定OID则执行更新 如果不给定则执行保存 get Class class Serializable id 根据给定的OID和class来加载指定的实体 如果不存在则返回null Load Class class Serializable id 根据给定的OID和class来加载指定的实体 如果不存在则返回空值异常 CreateQuery String queryString 根据给定的HQL查询条件创建一个Query对象 update Object obj 更新持久化对象 close 关闭该session对象 临时状态 transient 刚刚用new语句创建 还没有被持久化 不处于Session的缓存中 处于临时状态的Java对象被称为临时对象 持久化状态 persistent 已经被持久化 加入到Session的缓存中 处于持久化状态的Java对象被称为持久化对象 游离状态 detached 已经被持久化 但不再处于Session的缓存中 处于游离状态的Java对象被称为游离对象 update 方法完成以下的功能 1 把Customer对象重新加入到Session缓存中 使它变为持久化对象 2 计划执行一个update语句 值得注意的是 Session只有在清理缓存的时候才会执行update语句 并且在执行时才会把 Customer对象当前的属性值组装到update语句中 因此 即使程序中多次修改了Customer对象的属性 在清理缓存时只会 执行一次update语句 如下面的程序所示 创建一个新对象 此时 对象处于临时状态 Customer customer new Customer customer setName Tom Session session1 sessionFactory openSession Transaction tx1 session1 beginTransaction 将对象加入session中 对象此时处于持久化状态 session1 save customer mit 关闭session 此时Customer对象变为游离对象 session1 close 创建一个新的session Session session2 sessionFactory openSession Transaction tx2 session2 beginTransaction 在和session2关联之前修改Customer对象的属性 customer setName Linda 通过update 方法 将对象重新加入session 对象的状态转为持久化状态 session2 update customer 在和session2关联之后修改Customer对象的属性 customer setName Jack mit session2 close 注意 虽然修改了两次对象的值 但是 只执行一次更新 update 方法完成以下的功能 1 把Customer对象重新加入到Session缓存中 使它变为持久化对象 2 计划执行一个update语句 值得注意的是 Session只有在清理缓存的时候才会执行update语句 并且在执行时才会把 Customer对象当前的属性值组装到update语句中 因此 即使程序中多次修改了Customer对象的属性 在清理缓存时只会 执行一次update语句 如下面的程序所示 创建一个新对象 此时 对象处于临时状态 Customer customer new Customer customer setName Tom Session session1 sessionFactory openSession Transaction tx1 session1 beginTransaction 将对象加入session中 对象此时处于持久化状态 session1 save customer mit 关闭session 此时Customer对象变为游离对象 session1 close 创建一个新的session Session session2 sessionFactory openSession Transaction tx2 session2 beginTransaction 在和session2关联之前修改Customer对象的属性 customer setName Linda 通过update 方法 将对象重新加入session 对象的状态转为持久化状态 session2 update customer 在和session2关联之后修改Customer对象的属性 customer setName Jack mit session2 close 注意 虽然修改了两次对象的值 但是 只执行一次更新 当Session的save 方法持久化一个Customer对象时 Customer对象被加入到Session的缓存中 以后即使应用程序中的引 用变量不再引用Customer对象 只要Session的缓存还没有被清空 Customer对象仍然处于生命周期中 tx session beginTransaction Customer c1 new Customer Tom new HashSet Customer对象被持久化 并且加入到Session的缓存中 session save c1 Long id c1 getId c1变量不再引用Customer对象 c1 null 从Session缓存中读取Customer对象 使c2变量引用Customer对象 Customer c2 Customer session load Customer class id mit 关闭Session 清空缓存 session close 访问Customer对象 System out println c2 getName c2变量不再引用Customer对象 此时Customer对象结束生命周期 c2 null 当Session的save 方法持久化一个Customer对象时 Customer对象被加入到Session的缓存中 以后即使应用程序中的引 用变量不再引用Customer对象 只要Session的缓存还没有被清空 Customer对象仍然处于生命周期中 tx session beginTransaction Customer c1 new Customer Tom new HashSet Customer对象被持久化 并且加入到Session的缓存中 session save c1 Long id c1 getId c1变量不再引用Customer对象 c1 null 从Session缓存中读取Customer对象 使c2变量引用Customer对象 Customer c2 Customer session load Customer class id mit 关闭Session 清空缓存 session close 访问Customer对象 System out println c2 getName c2变量不再引用Customer对象 此时Customer对象结束生命周期 c2 null 1 减少访问数据库的频率 2 应用程序从内存中读取持久化对象的速度显然比到数据库中查询数据的速度快多了 1 当应用程序调用net sf hibernate Transaction的commit 方法的时候 commit 方法先清理缓存 然后再向数据库 提交事务 2 当应用程序显式调用Session的flush 方法的时候 此时会执行sql语句 但注意 事务并未提交 一一 HibernateHibernate的的主主键键生生成成方方式式 Hibernate中的主键又叫做对象标识符 Object IDentifier 简称OID 它唯一标识一个对象 为了应付多变的业务需求 Hibernate制定了多种主键生成方式 如下图 比较常用的主键生成方式如下 1 increment 相当于select Max id from 表 然后增加1 并写入数据库 和底层的数据库无关 可以移植到任何数据库 缺点是当有多个并发进程的时候可能导致出现重复值 2 assigned 和数据库无关 由应用程序自己定义主键 很灵活 但是需要程序员编写额外的代码 3 identity 使用数据库的主键生成机制 自动为主键赋值 不便于移植 比如 为软的SqlServer提供了自动生成主键的类型 但Oracle没有 但是 优点是 由于是数据库底层实现的 所以不会发生主键重复的冲突问题 4 sequence 对某些支持序列的数据库可用 如Oracle 参参考考项项目目 demo 2 demo 2 aaa Hibernate中的主键又叫做对象标识符 Object IDentifier 简称OID 它唯一标识一个对象 和底层的数据库无关 可以移植到任何数据库 缺点是当有多个并发进程的时候可能导致出现重复值 和数据库无关 由应用程序自己定义主键 很灵活 但是需要程序员编写额外的代码 不便于移植 比如 为软的SqlServer提供了自动生成主键的类型 但Oracle没有 但是 优点是 由于是数据库底层实现的 所以不会发生主键重复的冲突问题 aaa 关关系系映映射射 在开发的过程中 经常遇到多表关联的情况 如一对多或多对一关联 或者多对多关联 那么 如何在 Hibernate中映射这些关联关系呢 多对一单向关联 第一步 创建Hibernate的配置文件 第二步 创建持久化类和映射文件 true scott jdbc oracle thin localhost 1521 ora9i org hibernate dialect Oracle9Dialect tiger oracle jdbc driver OracleDriver 创建表 drop table TIANYI DEPT drop table TIANYI EMPLOYEE create table TIANYI DEPT IDNUMBER 3 not null DEPTNAME VARCHAR2 20 alter table TIANYI DEPT add constraint DID primary key ID create table TIANYI EMPLOYEE IDNUMBER 3 not null NAMEVARCHAR2 20 DEPTID NUMBER 3 alter table TIANYI EMPLOYEE add constraint EID primary key ID alter table TIANYI EMPLOYEE add constraint EDID foreign key DEPTID references TIANYI DEPT ID 创建持久化对象 部门表 public class Dept implements Serializable private int id private String deptName public String getDeptName return deptName public void setDeptName String deptName this deptName deptName public int getId return id public void setId int id this id id 创建持久化对象 员工表 public class Employee implements Serializable private int id private String employeeName private Dept dept public Dept getDept return dept public void setDept Dept dept this dept dept public String getEmployeeName return employeeName public void setEmployeeName String employeeName this employeeName employeeName public int getId return id public void setId int id this id id 映射文件之Dept hbm xml 映射文件之Employee hbm xml 创建表 drop table TIANYI DEPT drop table TIANYI EMPLOYEE create table TIANYI DEPT IDNUMBER 3 not null DEPTNAME VARCHAR2 20 alter table TIANYI DEPT add constraint DID primary key ID create table TIANYI EMPLOYEE IDNUMBER 3 not null NAMEVARCHAR2 20 DEPTID NUMBER 3 alter table TIANYI EMPLOYEE add constraint EID primary key ID alter table TIANYI EMPLOYEE add constraint EDID foreign key DEPTID references TIANYI DEPT ID 创建持久化对象 部门表 public class Dept implements Serializable private int id private String deptName public String getDeptName return deptName public void setDeptName String deptName this deptName deptName public int getId return id public void setId int id this id id 创建持久化对象 员工表 public class Employee implements Serializable private int id private String employeeName private Dept dept public Dept getDept return dept public void setDept Dept dept this dept dept public String getEmployeeName return employeeName public void setEmployeeName String employeeName this employeeName employeeName public int getId return id public void setId int id this id id 将该映射文件的信息写入Hibernate的配置文件中 第三步 通过Hibernater的API操作数据库 public static void main String args 得到Session对象 Session session HibernateSessionFactory currentSession 开始事务 Transaction transaction session beginTransaction 新增部门 Dept dept new Dept dept setId 101 dept setDeptName 财务部 session save dept mit 新增员工 Employee employee new Employee employee setId 10 employee setEmployeeName 张三 假设部门ID是 Dept dept Dept session get Dept class 101 employee setDept dept session save employee mit 加载部门 Dept dept Dept session get Dept class 101 System out println dept getDeptName 加载员工 Employee employee Employee session get Employee class 10 System out println employee getEmployeeName System out println employee getDept getDeptName 思考 如果在DAO中实现加载员工的方法 会出现什么问题 如何解决 映射文件之Dept hbm xml 映射文件之Employee hbm xml 参参考考项项目目 demo 3 demo 3 public static void main String args 得到Session对象 Session session HibernateSessionFactory currentSession 开始事务 Transaction transaction session beginTransaction 新增部门 Dept dept new Dept dept setId 101 dept setDeptName 财务部 session save dept mit 新增员工 Employee employee new Employee employee setId 10 employee setEmployeeName 张三 假设部门ID是 Dept dept Dept session get Dept class 101 employee setDept dept session save employee mit 加载部门 Dept dept Dept session get Dept class 101 System out println dept getDeptName 加载员工 Employee employee Employee session get Employee class 10 System out println employee getEmployeeName System out println employee getDept getDeptName 思考 如果在DAO中实现加载员工的方法 会出现什么问题 如何解决 在开发的过程中 经常遇到多表关联的情况 如一对多或多对一关联 或者多对多关联 那么 如何在 Hibernate中映射这些关联关系呢 true scott jdbc oracle thin localhost 1521 ora9i org hibernate dialect Oracle9Dialect tiger oracle jdbc driver OracleDriver 创建持久化对象 员工表 public class Employee implements Serializable private int id private String employeeName private Dept dept public Dept getDept return dept public void setDept Dept dept this dept dept public String getEmployeeName return employeeName public void setEmployeeName String employeeName this employeeName employeeName public int getId return id public void setId int id this id id 创建持久化对象 员工表 public class Employee implements Serializable private int id private String employeeName private Dept dept public Dept getDept return dept public void setDept Dept dept this dept dept public String getEmployeeName return employeeName public void setEmployeeName String employeeName this employeeName employeeName public int getId return id public void setId int id this id id 映射文件之Dept hbm xml 映射文件之Employee hbm xml 映射文件之Dept hbm xml 映射文件之Employee hbm xml public static void main String args 得到Session对象 Session session HibernateSessionFactory currentSession 开始事务 Transaction transaction session beginTransaction 新增部门 Dept dept new Dept dept setId 101 dept setDeptName 财务部 session save dept mit 新增员工 Employee employee new Employee employee setId 10 employee setEmployeeName 张三 假设部门ID是 Dept dept Dept session get Dept class 101 employee setDept dept session save employee mit 加载部门 Dept dept Dept session get Dept class 101 System out println dept getDeptName 加载员工 Employee employee Employee session get Employee class 10 System out println employee getEmployeeName System out println employee getDept getDeptName 思考 如果在DAO中实现加载员工的方法 会出现什么问题 如何解决 public static void main String args 得到Session对象 Session session HibernateSessionFactory currentSession 开始事务 Transaction transaction session beginTransaction 新增部门 Dept dept new Dept dept setId 101 dept setDeptName 财务部 session save dept mit 新增员工 Employee employee new Employee employee setId 10 employee setEmployeeName 张三 假设部门ID是 Dept dept Dept session get Dept class 101 employee setDept dept session save employee mit 加载部门 Dept dept Dept session get Dept class 101 Syste

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论