java JDBC+Hibernate_第1页
java JDBC+Hibernate_第2页
java JDBC+Hibernate_第3页
java JDBC+Hibernate_第4页
java JDBC+Hibernate_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

1、4.2JDBC提供了三个类,用于向数据库发送SQL语句。Connection接口中的三个方法可用于创建这些类的实例。下面列出这些类及其创建方法:(1)Statement:由方法createStatement所创建。Statement对象用于发送简单的SQL语句。Statement con=conn.createStatement();(2)PreparedStatement:由方法prepareStatement所创建。PreparedStatement对象用于发送带有一个或多个输入参数(IN参数)的SQL语句。PreparedStatement拥有一组方法,用于设置IN参数的值。执行语句时,

2、这些IN参数将被送到数据库中。PreparedStatement的实例扩展了Statement,因此它们都包括了Statement的方法。PreparedStatement对象有可能比Statement对象的效率更高,因为它已被预编译过并存放在那以供将来使用。(3)CallableStatement:由方法prepareCall所创建。CallableStatement对象用于执行SQL储存程序一组可通过名称来调用(就象函数的调用那样)的SQL语句。CallableStatement对象从PreparedStatement中继承了用于处理IN参数的方法,而且还增加了用于处理OUT参数和INOU

3、T参数的方法。不过通常来说createStatement方法用于简单的SQL语句(不带参数)、prepareStatement方法用于带一个或多个IN参数的SQL语句或经常被执行的简单SQL语句,而prepareCall方法用于调用已储存过程。My sql数据库JDBC连接Jdbc连接数据库思想:1. 获得连接 getConnection加载驱动类:class . forName ( “ com.mysql.jdbc.Driver ”);建立连接对象:conn = DriverManager.getConnection( “jdbc:mysql:/localhost:3306/数据库名” ,

4、”数据库连接用户名” , ”数据库连接密码” ) ;2. 判断 Connectionif ( connection !=null ) 3. 执行操作(增加、删除、修改、查找)增 删 改( insert delete update )查( selsct )4. 处理操作结果5. 关闭数据库连接 connection.Close()数据库命令操作:1. show databases ;2. use test ;( test为数据库名 )3. 执行 增删改查 操作4.3Eclipse下搭建Spring MVC + Hibernate开发环境这里主要讲在Eclipse下如何搭配Spring MVC +

5、 Hibernate框架进行Web开发,至于Eclipse以及JDK以及MyEclipse等的安装不在此列,也不使用MyEclipse来搭建,只是手工搭建的方式。1.版本JDK1.50;Eclipse3.2;MyEclipse 5.0;Tomcat 5.0;Spring2.0;Hibernate3.2。2.准备安装好Eclipse和JDK环境,由于不使用MyEclipse,需要自行准备两个主要的包:Spring.jar包、Hibernate3.jar,还有commons-dbcp.jar,commons-pool.jar,spring-orm.jar等这些包安装好后Lib下包会有:activa

6、tion.jarantlr-2.7.6.jarasm.jarcglib-2.1.3.jarcommons-beanutils.jarcommons-collections.jarcommons-collections-2.1.1.jarcommons-digester.jarcommons-fileupload.jarcommons-logging.jarcommons-logging-1.0.4.jarcommons-validator.jardom4j-1.6.1.jarehcache-1.2.jarjakarta-oro.jarjstl.jarjta.jarlog4j-1.2.11.ja

7、rmail.jarojdbc14.jarstandard.jar以下几个是比较重要的:commons-dbcp.jarcommons-pool.jarhibernate3.jarspring.jarspring-orm.jar如果要用到Struts,会有一个struts.jar包。3.搭建:首先在"File"菜单下"new" 一个"Project",选择"Other"下的MyEclipse下的"Web Project",把上面的包放到WebRoot/WEB-INF/lib下;建立好工程后,我们在

8、项目下的WebRoot/WEB-INF/下新建两个.xml文件,名字可以随便起(也可新建一个,内容和两个文件里面的内容一样即可),在这里命名为web-config.xml和model-config.xml,顾名思义,web-config.xml下配置和servlet以及控制逻辑等与WEB相关的bean,model-config.xml下配置与数据模型层相关的Bean,如数据访问的bean。以下是model-config.xml内容:<?xml version="1.0" encoding="UTF-8"?> <beans xm

9、lns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/schema/beans /schema/beans/spring-beans-2.0.xsd">    <!- 设定数据库连接池

10、相关参数,这里使用的是Oracel的数据库 ->    <bean id="dataSource"    class="mons.dbcp.BasicDataSource"    destroy-method="close">   <property name="driverClassName">    <value>oracle.jd

11、bc.driver.OracleDriver</value>   </property>   <property name="url">    <value>jdbc:oracle:thin::1521:database</value>   </property>   <property name="username">  

12、;  <value>username</value>   </property>   <property name="password">    <value>password</value>   </property></bean>        <!- 定义Hibernate sessionFactor

13、y 和Hibernate映射文件,所有的Hibernate映射文件统一在这里定义 ->     <bean id="sessionFactory"           class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"         

14、  destroy-method="destroy">         <property name="dataSource" ref="dataSource"/>         <property name="mappingResources">      

15、;       <list> <!- Hibernate映射文件 把Hibernate的配置文件在这里映射,这里定义了一个UUser类的持久化类映射文件 ->                <value>com/yondor/yuejiao/orm/UUser.hbm.xml</value>   &#

16、160;        </list>         </property>         <property name="hibernateProperties">            

17、 <props>                 <prop key="hibernate.dialect">                     org.hibernate.dialect.

18、Oracle9Dialect                 </prop>             </props>         </property>    

19、; </bean>     <!- Spring hibernateTemplate 模板定义 ->    <bean id="hibernateTemplate"          class="org.springframework.orm.hibernate3.HibernateTemplate">     

20、;   <property name="sessionFactory" ref="sessionFactory"/>     </bean>   <!- Hibernate数据模型Bean定义 ->             <bean id="dbDAO"  

21、0;        class="mon.DbDAO">        <property name="hibernateTemplate" ref="hibernateTemplate"/>    </bean><!- 以下是业务逻辑Bean的定义 -><!- User模块开始 定义的bean可以在web-config

22、.xml配置文件中使用->    <bean id="userDAO"           class="com.yondor.yuejiao.model.example.UserDAO">        <property name="dbDAO" ref="dbDAO"/> 

23、     </bean>     <!- User模块结束 -></beans>以下是web-config.xml的内容:<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="/schema/beans"xmlns:xsi="/2001/XML

24、Schema-instance"xsi:schemaLocation="/schema/beans /schema/beans/spring-beans-2.0.xsd">      <!- Controller方法调用规则定义 ->    <bean id="paraMethodResolver" 

25、0;       class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">         <property name="paramName" value="action"/>        <

26、;property name="defaultMethodName" value="list"/>    </bean>       <!- 页面View层基本信息设定 ->    <bean id="viewResolver"          class="org.springf

27、ramework.web.servlet.view.InternalResourceViewResolver">        <property name="viewClass"            value="org.springframework.web.servlet.view.JstlView"/>   &

28、#160;    <property name="prefix" value="/yuejiao/"/>        <property name="suffix" value=".jsp"/>    </bean> <!- servlet映射列表,所有控制层Controller的servlet在这里定义 -> 

29、60;  <bean id="urlMapping"          class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">        <property name="mappings">     &

30、#160;      <props>                <prop key="example.do">userController</prop>            </props>  &

31、#160;     </property>    </bean><!- 以下控制层Controller Bean定义开始 -><!- User模块开始 -><!- 一共注入了7个属性(Bean),其中userDAO为业务逻辑Bean,该Bean定义在model-config.xml相应的模块中 ->    <bean id="userController"    

32、0;           class="com.yondor.yuejiao.controller.example.UserController">        <property name="methodNameResolver" ref="paraMethodResolver"/>     &#

33、160; <!- 使用了在model-config.xml文件里定义userDAO->        <property name="userDAO" ref="userDAO"/>        <!- 以下的属性与处理后的跳转有有关 ->        <property name="logi

34、n_success" value="example/login_success"/>        <property name="login_failure" value="example/login"/>        <property name="register_success" value="example/registe

35、r_success"/>        <property name="register_failure" value="example/register"/>        <property name="userInfoList" value="example/list"/>    </bean&g

36、t;     <!- User模块结束 -></beans>最后,还需要配置一下web.xml文件,内容如下:<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation=" version="2.4"> 

37、0;  <session-config>        <session-timeout>            30        </session-timeout>    </session-config>    <se

38、rvlet>        <servlet-name>dispatcherServlet</servlet-name>        <servlet-class>            org.springframework.web.servlet.DispatcherServlet 

39、0;      </servlet-class>        <init-param>            <param-name>contextConfigLocation</param-name>          

40、;  <param-value>/WEB-INF/model-config.xml,/WEB-INF/web-config.xml</param-value>        </init-param>        <load-on-startup>1</load-on-startup>    </servlet>  

41、0; <servlet-mapping>        <servlet-name>dispatcherServlet</servlet-name>        <url-pattern>*.do</url-pattern>    </servlet-mapping></web-app> 到此,基本上已完成开发环境的搭建,最后,右键

42、单击项目名称?properties?java bulid path ?libraries,Add Jars把刚才加入的包引入到工程里面去即可。hibernate中dialect的讲解(方言)RDBMS方言DB2org.hibernate.dialect.DB2DialectDB2 AS/400org.hibernate.dialect.DB2400DialectDB2 OS390org.hibernate.dialect.DB2390DialectPostgreSQLorg.hibernate.dialect.PostgreSQLDialectMySQLorg.hibernate.dialec

43、t.MySQLDialectMySQL with InnoDBorg.hibernate.dialect.MySQLInnoDBDialectMySQL with MyISAMorg.hibernate.dialect.MySQLMyISAMDialectOracle (any version)org.hibernate.dialect.OracleDialectOracle 9i/10gorg.hibernate.dialect.Oracle9DialectSybaseorg.hibernate.dialect.SybaseDialectSybase Anywhereorg.hibernat

44、e.dialect.SybaseAnywhereDialectMicrosoft SQL Serverorg.hibernate.dialect.SQLServerDialectSAP DBorg.hibernate.dialect.SAPDBDialectInformixorg.hibernate.dialect.InformixDialectHypersonicSQLorg.hibernate.dialect.HSQLDialectIngresorg.hibernate.dialect.IngresDialectProgressorg.hibernate.dialect.ProgressD

45、ialectMckoi SQLorg.hibernate.dialect.MckoiDialectInterbaseorg.hibernate.dialect.InterbaseDialectPointbaseorg.hibernate.dialect.PointbaseDialectFrontBaseorg.hibernate.dialect.FrontbaseDialectFirebirdorg.hibernate.dialect.FirebirdDialectHibernate框架搭建截图:映射文件<?xml version="1.0"?><!DOC

46、TYPE hibernate-mapping PUBLIC "-/Hibernate/Hibernate Mapping DTD 3.0/EN" " <hibernate-mapping package="test">package="包路径" <class name="UserTest" table="usertest" catalog="test">name="实体类" table="数据库表"&l

47、t;id name="id" type="java.lang.Integer">数据库字段idtype=字段类型<column name="id" /><generator class="native" />自动增长(id 列)</id><property name="name" type="java.lang.String">数据库字段nametype=字段类型<column name="name&quo

48、t; /></property><property name="password" type="java.lang.String">数据库字段passwordtype=字段类型<column name="password" /></property> </class></hibernate-mapping>详细配置截图:hibernate.cfg.xml配置文件hibernate.cfg.xml<?xml version="1.0"

49、 encoding="utf-8" ?><!DOCTYPE hibernate-configuration PUBLIC "-/Hibernate/Hibernate Configuration DTD 3.0/EN" "<hibernate-configuration> <session-factory > <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <p

50、roperty name="connection.url">jdbc:mysql:/:3306/test</property> jdbc:mysql:/(IP地址、localhost):3306/(数据库名) <property name="connection.username">root</property> <property name="connection.password">root</property> <property name

51、="dialect">org.hibernate.dialect.MySQLDialect</property>MySQL 的方言 org.hibernate.dialect.MySQLDialect <property name="vider_class">org.hibernate.cache.NoCacheProvider</property> <property name="show_sql">true</property> <mappi

52、ng resource="test/user.hbm.xml"/><mapping resource="映射文件可以再次添加 "/> </session-factory></hibernate-configuration>Java测试类package test;import java.util.List;import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hib

53、ernate.Transaction;import org.hibernate.cfg.Configuration;import test.UserTest;public class Test /* param args*/public static void main(String args) UserTest user = new UserTest();/user.setId(1);增/user.setName("111");/user.setPassword("11");/user.setId(6);删/user.setId(7);改/user.s

54、etName("6666");/user.setPassword("1555");Configuration cfg = new Configuration();SessionFactory ss = cfg.configure().buildSessionFactory();Session session = ss.openSession();session.beginTransaction();/session.save(user); 增加/session.delete(user);删除/session.update(user); 修改/from 实

55、体(Java类)Query sk = session.createQuery("from UserTest");/查询方法(1)List<UserTest> list =sk.list();for(int a=0; a<list.size(); a+ )UserTest d = list.get(a);System.out.println(d.getName();/强转/查询方法(2)泛型/*List m = sk.list();for(int a=0; a<m.size(); a+ )UserTest ut = (UserTest) m.get(a

56、);System.out.println(ut.getName();*/提交事物session.getTransaction().commit();/关闭事物session.close();/关闭连接ss.close();System.out.println("ok");Hibernate缓存分为一级缓存,二级缓存,和三级缓存。一级缓存是session级的缓存。在一个session内。一旦调用过一个对象,下次调用将不会再次发送SQL语句。二级缓存是跨Session的缓存,总缓存,不用单独进入某个缓存操作,二级缓存有很多种:Hashtable,EHCache,OSCache,

57、SwarmCache,JBoss Cache1.X,JBoss Cache2他们都有不同的供应商。可以查看文档,二级缓存适合放1.经常访问2改动不大3数量有限的文件使用二级缓存:1。打开二级缓存在hibernate.cfg.xml中,把 Disable the second-level cache<propertyname="vider_class">org.hibernate.cache.NoCacheProvider</property> 注释掉,因为这个信息是关闭二级缓存。然后是设置缓存<proper

58、tyname="cache.use_second_level_cache">true</property>使用二级缓存<property name="vider_class">org.hibernate.cache.EhCacheProvider</property>示例是设置缓存。使用哪个提供商的缓存。设置了EhCache,然后要加入配置文件,在本地电脑下载的hibernate包文件里。hibernate-distribution-3.6.2.Finalprojectetc里面有个ehcach

59、e.xml的文件。讲这个文件COPY到项目的src里面,配置文件里设置了缓存的属性,比如缓存时间,缓存个数等等。2。Cache注解目前使用的还是hibernate标准的Cache,因为JPA1.0目前还没有对二级缓存做出标准。然后在实体类加以注释Cache(usage = CacheConcurrencyStrategy.READ_WRITE)注意READ_WRITE是一种策略方式,还有很多种,根据实际情况再选择3.加入EhCache的架包,地址在hibernate包里有,路径是hibernate-distribution-3.6.2.Finalliboptionalehcache。还需要加入

60、commons-logging-1.1.1架包load和iterate是默认使用二级缓存,list默认往二级缓存加数据Hibernate Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。中文名: 对象关系映射框架外文名: Hibernate应 

61、;   用: EJB的J2EE架构中取代CMP属    性: 开放源代码的对象关系映射框架核心接口Hibernate的核心接口一共有6个,分别为:Session、SessionFactory、Transaction、Query、Criteria和Configuration。这6个核心接口在任何开发中都会用到。通过这些接口,不仅可以对持久化对象进行存取,还能够进行事务控制。下面对这6个核心接口分别加以介绍。SessionSession接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的S

62、QL语句。)。但需要注意的是Session对象是非线程安全的。同时,Hibernate的session不同于JSP应用中的HttpSession。这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSession对象称为用户session。SessionFactorySessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据

63、库时,可以为每个数据库指定一个SessionFactory。TransactionTransaction 接口是一个可选的API,可以选择不使用这个接口,取而代之的是Hibernate 的设计者自己写的底层事务处理代码。 Transaction 接口是对实际事务实现的一个抽象,这些实现包括JDBC的事务、JTA 中的UserTransaction、甚至可以是CORBA 事务。之所以这样设计是能让开发者能够使用一个统一事务的操作界面,使得自己的项目可以在不同的环境和容器之间方便地移植。QueryQuery接口让你方便地对数据库及持久对象进行查询,它可以有两种表达方式:HQL语言或本地数据库的SQ

64、L语句。Query经常被用来绑定查询参数、限制查询记录数量,并最终执行查询操作。CriteriaCriteria接口与Query接口非常类似,允许创建并执行面向对象的标准化查询。值得注意的是Criteria接口也是轻量级的,它不能在Session之外使用。ConfigurationConfiguration 接口的作用是对Hibernate 进行配置,以及对它进行启动。在Hibernate 的启动过程中,Configuration 类的实例首先定位映射文档的位置,读取这些配置,然后创建一个SessionFactory对象。虽然Configuration 接口在整个Hibernate 项目中只扮

65、演着一个很小的角色,但它是启动hibernate 时所遇到的每一个对象。hibernate性能优化初用 hibernate 的人也许都遇到过性能问题,实现同一功能,用 hibernate 与用JDBC性能相差十几倍很正常,如果不及早调整,很可能影响整个项目的进度。 大体上,对于HIBERNATE性能调优的主要考虑点如下:.数据库设计调整.HQL优化.API的正确使用(如根据不同的业务类型选用不同的集合及查询API).主配置参数(日志,查询缓存,fetch_size, batch_size等).映射文件优化(ID生成策略,二级缓存,延迟加载,关联优化).一级缓存的管理.针对二级缓存,还有许多特有

66、的策略.事务控制策略。数据库设计a) 降低关联的复杂性b) 尽量不使用联合主键c) ID的生成机制,不同的数据库所提供的机制并不完全一样d) 适当的冗余数据,不过分追求高范式HQL优化HQL如果抛开它同HIBERNATE本身一些缓存机制的关联,HQL的优化技巧同普通的SQL优化技巧一样,可以很容易在网上找到一些经验之谈。主配置a) 查询缓存,同下面讲的缓存不太一样,它是针对HQL语句的缓存,即完全一样的语句再次执行时可以利用缓存数据。但是,查询缓存在一个交易系统(数据变更频繁,查询条件相同的机率并不大)中可能会起反作用:它会白白耗费大量的系统资源但却难以派上用场。b) fetch_size,同

67、JDBC的相关参数作用类似,参数并不是越大越好,而应根据业务特征去设置c) batch_size同上。d) 生产系统中,切记要关掉SQL语句打印。缓存a) 数据库级缓存:这级缓存是最高效和安全的,但不同的数据库可管理的层次并不一样,比如,在Oracle中,可以在建表时指定将整个表置于缓存当中。b) SESSION缓存:在一个HibernateSESSION有效,这级缓存的可干预性不强,大多于HIBERNATE自动管理,但它提供清除缓存的方法,这在大批量增加/更新操作是有效的。比如,同时增加十万条记录,按常规方式进行,很可能会发现OutofMemeroy的异常,这时可能需要手动清除这一

68、级缓存:Session.evict以及 Session.clearc) 应用缓存:在一个SESSIONFACTORY中有效,因此也是优化的重中之重,因此,各类策略也考虑的较多,在将数据放入这一级缓存之前,需要考虑一些前提条件:i. 数据不会被第三方修改(比如,是否有另一个应用也在修改这些数据?)ii. 数据不会太大iii. 数据不会频繁更新(否则使用CACHE可能适得其反)iv. 数据会被频繁查询v. 数据不是关键数据(如涉及钱,安全等方面的问题)。缓存有几种形式,可以在映射文件中配置:read-only(只读,适用于很少变更的静态数据/历史数据),nonstrict-read- write,

69、read-write(比较普遍的形式,效率一般),transactional(JTA中,且支持的缓存产品较少)d) 分布式缓存:同c)的配置一样,只是缓存产品的选用不同,oscache, jboss cache,的大多数项目,对它们的用于集群的使用(特别是关键交易系统)都持保守态度。在集群环境中,只利用数据库级的缓存是最安全的。延迟加载a) 实体延迟加载:通过使用动态代理实现b) 集合延迟加载:通过实现自有的SET/LIST,HIBERNATE提供了这方面的支持c) 属性延迟加载:方法选用a) 完成同样一件事,Hibernate提供了可供选择的一些方式,但具体使用什么方式,可能用性能/代码都会

70、有影响。显示,一次返回十万条记录 (List/Set/Bag/Map等)进行处理,很可能导致内存不够的问题,而如果用基于游标(ScrollableResults)或 Iterator的结果集,则不存在这样的问题。b) Session的load/get方法,前者会使用二级缓存,而后者则不使用。c) Query和list/iterator,如果去仔细研究一下它们,你可能会发现很多有意思的情况,二者主要区别(如果使用了Spring,在HibernateTemplate中对应find,iterator方法):i. list只能利用查询缓存(但在交易系统中查询缓存作用不大),无法利用二级缓存中的单个实体,但list查出的对象会写入二级缓存,但它一般只生成较少的执行SQL语句,很多情况就是一条(无关联)。ii. iterator则可以利用二级缓存,对于一条查询语句,它会先从数据库中找出所有符合条件的记录的ID,再通过ID去缓存找,对于缓存中没有的记录,再构造语句从数据库中查出,因此很容易知道,如

温馨提示

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

评论

0/150

提交评论