Spring+SpringMVC+Hibernate整合+入门笔记

来源:互联网 发布:染色体核型分析软件 编辑:程序博客网 时间:2024/05/20 05:06

http://blog.csdn.net/baimusensen/article/details/16329835


新人自学SpringMVC,记录下学习心得,愿与众位分享。如有什么疏漏之处还望前辈们指教(求轻拍)

刚刚写了一篇日志,是写如何实现一个只有SpringMVC的项目的。现在这篇日志算是上一篇日志的续集,如果对SpringMVC一点也不了解的朋友请看我上一篇日志。上一篇日志链接——SpringMVC入门笔记


现在开始Spring+SpringMVC+Hibernate的整合

1.导入jar包

由于个人水平有限,没法像大神们一样精准的写出哪些jar包是干什么的,所以列出来的很多jar包可能是暂时用不到的。虽然臃肿点,不过导入这些jar包以后,项目是肯定能跑得起来的。

hibernate部分

然后是ojdbc6.jar

然后是Spring部分

Spring部分除此之外还有:

aspectj-1.6.10.jar、aspectjweaver-1.6.9.jar、org.springframework.web.servlet-3.1.3.RELEASE.jar

aspectj开头的jar包是能让Spring管理事务的jar包



2.修改web.xml

这里的web.xml与上一篇日志的没变化,不过也列在这里方便大家看

[java] view plaincopy
  1. <span style="font-size:14px;"><?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.5"   
  3.     xmlns="http://java.sun.com/xml/ns/javaee"   
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  5.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
  6.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
  7.     <servlet>  
  8.         <servlet-name>spring3mvc</servlet-name>  
  9.         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  10.         <!-- 如果不写这个init标签及其内容,那么SpringMVC的相关配置就要写在  
  11.                与<servlet-name>中的内容一致的xml里 -->  
  12.         <init-param>  
  13.             <param-name>contextConfigLocation</param-name>  
  14.             <!-- 这里是配置文件的路径 -->  
  15.             <param-value>classpath*:/applicationContext.xml</param-value>  
  16.         </init-param>  
  17.         <load-on-startup>1</load-on-startup>  
  18.     </servlet>  
  19.     <servlet-mapping>  
  20.         <servlet-name>spring3mvc</servlet-name>  
  21.         <!-- url-pattern里的内容的意思代表:告诉程序什么样格式的url地址才能算是action,  
  22.                并往action里走。对于我这里写的*.action的话,当我输入类似于findAll.action  
  23.                这样的url时,才会让程序开始寻找相应的action -->  
  24.         <url-pattern>*.action</url-pattern>  
  25.     </servlet-mapping>  
  26.     <welcome-file-list>  
  27.         <welcome-file>index.jsp</welcome-file>  
  28.     </welcome-file-list>  
  29. </web-app>  
  30. </span>  



3.添加applicationContext.xml

[java] view plaincopy
  1. <span style="font-size:14px;"><?xml version="1.0" encoding="UTF-8"?>  
  2. <beans  
  3.     xmlns="http://www.springframework.org/schema/beans"  
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  5.     xmlns:p="http://www.springframework.org/schema/p"  
  6.     xmlns:aop="http://www.springframework.org/schema/aop"  
  7.     xmlns:context="http://www.springframework.org/schema/context"  
  8.     xmlns:tx="http://www.springframework.org/schema/tx"  
  9.     xmlns:mvc="http://www.springframework.org/schema/mvc"  
  10.     xsi:schemaLocation="http://www.springframework.org/schema/beans  
  11.                         http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
  12.                         http://www.springframework.org/schema/aop  
  13.                         http://www.springframework.org/schema/aop/spring-aop-2.5.xsd  
  14.                         http://www.springframework.org/schema/context  
  15.                         http://www.springframework.org/schema/context/spring-context-2.5.xsd  
  16.                         http://www.springframework.org/schema/tx  
  17.                         http://www.springframework.org/schema/tx/spring-tx-2.5.xsd  
  18.                         http://www.springframework.org/schema/mvc  
  19.                         http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">  
  20.     <!-- 扫描com这个包里的所有类,把里面配上相应注解的类全都放在容器中进行管理 -->  
  21.     <context:component-scan base-package="com"/>  
  22.     <!-- 添加注解驱动 -->  
  23.     <mvc:annotation-driven />  
  24.     <!-- 定义跳转的文件的前后缀 -->  
  25.     <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
  26.         <!-- 这里的配置我的理解是自动给后面action的方法return的字符串加上前缀和后缀,变成一个  
  27.               可用的url地址 -->  
  28.         <property name="prefix" value="/jsp/" />  
  29.         <property name="suffix" value=".jsp" />  
  30.     </bean>  
  31.       
  32.     <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
  33.         <property name="driverClassName">  
  34.             <!-- 这里要根据自己用的什么数据库而变,我用的是oracle -->  
  35.             <value>oracle.jdbc.driver.OracleDriver</value>  
  36.         </property>  
  37.         <property name="url">  
  38.             <value>jdbc:oracle:thin:@KEWPIE-HP:1521:KEWPIE</value>  
  39.         </property>  
  40.         <property name="username">  
  41.             <value>数据库用户名</value>  
  42.         </property>  
  43.         <property name="password">  
  44.             <value>密码</value>  
  45.         </property>  
  46.     </bean>  
  47.       
  48.     <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">  
  49.         <property name="dataSource">  
  50.             <!-- 连接数据源 -->  
  51.             <ref bean="dataSource"/>  
  52.         </property>  
  53.         <!--注解形式的配置,只写包路径就可以了-->  
  54.         <property name="packagesToScan">  
  55.             <list>  
  56.                 <value>com.bean</value>  
  57.             </list>  
  58.         </property>  
  59.         <!-- 配置数据库方言 -->  
  60.         <property name="hibernateProperties">  
  61.             <props>  
  62.                 <prop key="hibernate.dialect">  
  63.                     org.hibernate.dialect.Oracle9Dialect  
  64.                 </prop>  
  65.                 <prop key="hibernate.show_sql">true</prop>  
  66.                 <prop key="hibernate.format_sql">true</prop>  
  67.             </props>  
  68.         </property>  
  69.     </bean>  
  70.   
  71.     <!-- 从这开始就是开启事务的配置了 -->  
  72.     <bean id="transactionManager"   
  73.                 class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
  74.         <property name="dataSource" ref="dataSource"/>  
  75.     </bean>  
  76.     <tx:advice id="txAdvice" transaction-manager="transactionManager">  
  77.         <tx:attributes>  
  78.             <tx:method name="*" propagation="REQUIRED"/>  
  79.         </tx:attributes>  
  80.     </tx:advice>  
  81.     <aop:config>  
  82.     <!-- 在这里,我将事务控制在service层,如果你想改,就改底下那个括号里的包名什么的吧 -->  
  83.     <aop:pointcut id="personDaoPC"  
  84.                 expression = "execution(* com.service.impl.*.*(..))"/>  
  85.         <aop:advisor advice-ref="txAdvice" pointcut-ref="personDaoPC"/>  
  86.     </aop:config>  
  87.       
  88.     <!-- 这个是我为了调试代码创建的一个dao -->  
  89.     <bean id="userDao" class="com.dao.impl.UserDaoImpl">  
  90.         <property name="sessionFactory" ref="sessionFactory"/>  
  91.     </bean>  
  92. </beans>  
  93. </span>  


4.dao、service和action

dao和service接口的代码我就不贴出来了,就是简单地方法声明,其他什么也没有

dao的代码

[java] view plaincopy
  1. <span style="font-size:14px;">package com.dao.impl;  
  2.   
  3. import java.util.List;  
  4.   
  5. import org.springframework.orm.hibernate3.support.HibernateDaoSupport;  
  6.   
  7. import com.bean.User;  
  8. import com.dao.IUserDao;  
  9.   
  10. /** 
  11.  * 这里要注意,我继承了一个HibernateDaoSupport类,然后在Spring的配置文件中给这个类注入了一个 
  12.  *      sessionFactory。这是为了能得到Hibernate的Session对象 
  13.  * @author 百木森森 
  14.  * 
  15.  */  
  16. public class UserDaoImpl extends HibernateDaoSupport implements IUserDao {  
  17.   
  18.     public List<User> findAll() {  
  19.         //这里的getSession()方法是继承自父类的方法  
  20.         return this.getSession().createQuery("from User").list();  
  21.     }  
  22.   
  23.     public void modify(User user) {  
  24.         this.getSession().update(user);  
  25.     }  
  26.   
  27. }  
  28. </span>  

service的代码

[java] view plaincopy
  1. <span style="font-size:14px;">package com.service.impl;  
  2.   
  3. import java.util.List;  
  4.   
  5. import javax.annotation.Resource;  
  6.   
  7. import org.springframework.stereotype.Service;  
  8.   
  9. import com.bean.User;  
  10. import com.dao.IUserDao;  
  11. import com.service.IUserService;  
  12.   
  13. /** 
  14.  * service层我用的注解的方式配的,所以没写在Spring配置文件里 
  15.  * @author 百木森森 
  16.  * 
  17.  */  
  18. @Service("userService")  
  19. public class UserServiceImpl implements IUserService {  
  20.   
  21.     @Resource  
  22.     private IUserDao userDao;  
  23.       
  24.     public List<User> findAll() {  
  25.         return this.userDao.findAll();  
  26.     }  
  27.   
  28.     public void modify(User user) {  
  29.         this.userDao.modify(user);  
  30.     }  
  31.   
  32. }  
  33. </span>  
action代码

[java] view plaincopy
  1. <span style="font-size:14px;">package com.action;  
  2.   
  3. import java.util.List;  
  4.   
  5. import javax.annotation.Resource;  
  6.   
  7. import org.springframework.stereotype.Controller;  
  8. import org.springframework.web.bind.annotation.RequestMapping;  
  9.   
  10. import com.bean.User;  
  11. import com.service.IUserService;  
  12.   
  13. /** 
  14.  * action层我也是用注解配的,这里面的注解@RequestMapping的具体作用见上一篇SpringMVC入门笔记 
  15.  * @author 百木森森 
  16.  * 
  17.  */  
  18. @Controller  
  19. @RequestMapping("testPath")  
  20. public class TestAction {  
  21.   
  22.     @Resource  
  23.     private IUserService userService;  
  24.       
  25.     @RequestMapping("testMethod/testA")  
  26.     public String test(){  
  27.         System.out.println("进到了Action!");  
  28.         List<User> list=this.userService.findAll();  
  29.         for(User u:list){  
  30.             System.out.println(u.getId()+","+u.getNickName());  
  31.         }  
  32.         return "success";  
  33.     }  
  34. }  
  35. </span>  

到此为止,启动项目以后,在地址栏中输入http://localhost:8080/springmvc11_14/testPath/testMethod/testA.action后可以成功跳转到success.jsp,而且也能成功的从数据库读取User集合。modify方法也试过了,可以成功修改数据,说明Spring自动管理事务没问题,能正常使用。


========================================================================================================

execution(* com.aptech.jb.epet.dao.hibimpl.*.*(..)) 

 

这样写应该就可以了 这是com.aptech.jb.epet.dao.hibimpl 包下所有的类的所有方法。。

第一个*代表所有的返回值类型 

第二个*代表所有的类

第三个*代表类所有方法 最后一个..代表所有的参数。

 

 

下面给出一些常见切入点表达式的例子:

  • 任意公共方法的执行:

    execution(public * *(..))
  • 任何一个以“set”开始的方法的执行:

    execution(* set*(..))
  • AccountService 接口的任意方法的执行:

    execution(* com.xyz.service.AccountService.*(..))
  • 定义在service包里的任意方法的执行:

    execution(* com.xyz.service.*.*(..))
  • 定义在service包或者子包里的任意类的任意方法的执行:

    execution(* com.xyz.service..*.*(..))
========================================================================================================

http://www.cnblogs.com/wj-wangjun/archive/2009/10/21/1587624.html


Hibernate SQL方言 (hibernate.dialect)

数据库

hibernate方言

DB2org.hibernate.dialect.DB2DialectDB2 AS/400org.hibernate.dialect.DB2400DialectDB2 OS390org.hibernate.dialect.DB2390DialectPostgreSQLorg.hibernate.dialect.PostgreSQLDialectMySQLorg.hibernate.dialect.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.hibernate.dialect.SybaseAnywhereDialectMicrosoft SQL Serverorg.hibernate.dialect.SQLServerDialectSAP DBorg.hibernate.dialect.SAPDBDialectInformixorg.hibernate.dialect.InformixDialectHypersonicSQLorg.hibernate.dialect.HSQLDialectIngresorg.hibernate.dialect.IngresDialectProgressorg.hibernate.dialect.ProgressDialectMckoi SQLorg.hibernate.dialect.MckoiDialectInterbaseorg.hibernate.dialect.InterbaseDialectPointbaseorg.hibernate.dialect.PointbaseDialectFrontBaseorg.hibernate.dialect.FrontbaseDialectFirebirdorg.hibernate.dialect.FirebirdDialect    

<?xml version="1.0" encoding="GBK"?>
<!-- 指定Spring配置文件的Schema信息 -->
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:aop="http://www.springframework.org/schema/aop"
 xmlns:tx="http://www.springframework.org/schema/tx"
 xsi:schemaLocation="http://www.springframework.org/schema/beans 
 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
 http://www.springframework.org/schema/tx 
 http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
 http://www.springframework.org/schema/aop 
 http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">

 <!-- 定义数据源Bean,使用C3P0数据源实现 -->
 <bean id="dataSource" destroy-method="close"
  class="com.mchange.v2.c3p0.ComboPooledDataSource">
  <!-- 指定连接数据库的驱动 -->
  
  <!-- 指定连接数据库的URL -->
  <!-- 指定连接数据库的用户名 -->
  <!-- 指定连接数据库的密码 -->
  <!-- 指定连接数据库连接池的最大连接数 -->
  <!-- 指定连接数据库连接池的最小连接数 -->
  <!-- 指定连接数据库连接池的初始化连接数 -->
  <!-- 指定连接数据库连接池的连接的最大空闲时间 -->
  <!-- 连mysql 
  <property name="driverClass" value="com.mysql.jdbc.Driver"/>
  <property name="jdbcUrl"
   value="jdbc:mysql://localhost:3306/auction"/>
  <property name="user" value="root"/>
  <property name="password" value="32147"/>
  <property name="maxPoolSize" value="40"/>
  <property name="minPoolSize" value="1"/>
  <property name="initialPoolSize" value="1"/>
  <property name="maxIdleTime" value="20"/>
  -->
  
  <!--连MS-SQL-->
   <property name="driverClassName"
   value="net.sourceforge.jtds.jdbc.Driver"></property> <property
   name="url"
   value="jdbc:jtds:sqlserver://10.11.68.28:1433;DatabaseName=txDB"></property>
   <property name="username" value="sa"></property> 
   <property name="password" value="Wang.Jun2009"></property>
  
  <!-- 连 Oracle -->
  <!-- 
  <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"></property>
  <property name="url" value="jdbc:oracle:thin:@10.12.3.106:1521:orcl"></property>

  <property name="username" value="pms"></property>
  <property name="password" value="zerobugpms"></property>

  <property name="maxActive" value="100"></property>
  <property name="maxIdle" value="30"></property>
  <property name="maxWait" value="500"></property>
  <property name="defaultAutoCommit" value="true"></property>
  -->
 </bean>

 <!-- 定义Hibernate的SessionFactory -->
 <bean id="sessionFactory"
  class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  
  <!-- 依赖注入数据源,注入上面定义的dataSource -->
  <property name="dataSource" ref="dataSource"/>
  <!-- mappingResouces属性用来列出全部映射文件 -->
  <property name="mappingResources">
   <list>
    <!-- 以下用来列出Hibernate映射文件 -->
    <value>org/crazyjava/auction/model/AuctionUser.hbm.xml</value>
    <value>org/crazyjava/auction/model/Bid.hbm.xml</value>
    <value>org/crazyjava/auction/model/Item.hbm.xml</value>
    <value>org/crazyjava/auction/model/Kind.hbm.xml</value>
    <value>org/crazyjava/auction/model/State.hbm.xml</value>
   </list>
  </property>
  <!-- 定义Hibernate的SessionFactory的属性 -->
  <property name="hibernateProperties">
   <props>
    <!-- 指定数据库方言 -->
    <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>
    <!-- 
    <prop key="hibernate.dialect">
     org.hibernate.dialect.MySQLInnoDBDialect</prop>
     -->
    <!-- 是否根据需要每次自动创建数据库 -->
    <prop key="hibernate.hbm2ddl.auto">update</prop>
    <!-- 显示Hibernate持久化操作所生成的SQL -->
    <prop key="hibernate.show_sql">true</prop>
    <!-- 将SQL脚本进行格式化后再输出 -->
    <prop key="hibernate.format_sql">true</prop>
   </props>
  </property>
 </bean>

 <!-- 配置Hibernate的局部事务管理器,使用HibernateTransactionManager类 -->
 <!-- 该类实现PlatformTransactionManager接口,是针对Hibernate的特定实现-->
 <bean id="transactionManager" 
  class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  <!-- 配置HibernateTransactionManager时需要依注入SessionFactory的引用 -->
  <property name="sessionFactory" ref="sessionFactory"/>
 </bean>

 <!-- 配置事务切面Bean,指定事务管理器 -->
 <tx:advice id="txAdvice" transaction-manager="transactionManager">
  <!-- 用于配置详细的事务语义 -->
  <tx:attributes>
   <!-- 所有以'get'开头的方法是read-only的 -->
   <tx:method name="get*" read-only="true"/>
   <!-- 其他方法使用默认的事务设置 -->
   <tx:method name="*"/>
  </tx:attributes>
 </tx:advice>
 <aop:config>
  <!-- 配置一个切入点,匹配指定包下所有以Impl结尾的类执行的所有方法 -->
  <aop:pointcut id="leeService"
   expression="execution(* org.crazyjava.auction.service.impl.*Impl.*(..))"/>
  <!-- 指定在leeService切入点应用txAdvice事务切面 -->
  <aop:advisor advice-ref="txAdvice" 
   pointcut-ref="leeService"/>
 </aop:config>

 <!-- 定义JavaMailSenderImpl,它用于发送邮件 -->
 <bean id="mailSender"
  class="org.springframework.mail.javamail.JavaMailSenderImpl">
  <!-- 指定发送邮件的SMTP服务器地址 -->
  <property name="host" value="smtp.163.com"/>
  <property name="javaMailProperties">
   <props>
    <prop key="mail.smtp.auth">true</prop>
    <prop key="mail.smtp.timeout">25000</prop>
   </props>
  </property>
  <!-- 指定登录邮箱的用户名、密码 -->
  <property name="username" value="spring_test"/>
  <property name="password" value="123abc"/>
 </bean>
 <!-- 定义SimpleMailMessage Bean,它代表了一份邮件 -->
 <bean id="mailMessage"
  class="org.springframework.mail.SimpleMailMessage">
  <property name="from" value="spring_test@163.com"/>
  <!-- 指定邮件标题 -->
  <property name="subject" value="竞价通知"/>
 </bean>

 <!-- 配置业务逻辑组件 -->
 <bean id="mgr"
  class="org.crazyjava.auction.service.impl.AuctionManagerImpl">
  <!-- 为业务逻辑组件注入所需的DAO组件 -->
  <property name="userDao" ref="auctionUserDao"/>
  <property name="bidDao" ref="bidDao"/>
  <property name="itemDao" ref="itemDao"/>
  <property name="kindDao" ref="kindDao"/>
  <property name="stateDao" ref="stateDao"/>
  <property name="mailSender" ref="mailSender"/>
  <property name="message" ref="mailMessage"/>
 </bean>
 <!-- 配置一个TimerTask Bean -->
 <bean id="checkWiner" class="org.crazyjava.auction.schedule.CheckWiner">
  <!-- 依赖注入业务逻辑组件 -->
  <property name="mgr" ref="mgr"/>
 </bean>
 <!-- 将TimerTask Bean:checkWiner包装成可周期性执行的任务调度Bean -->
 <bean id="scheduledTask"
  class="org.springframework.scheduling.timer.ScheduledTimerTask">
  <!-- 指定调度频率和延迟 -->
  <property name="delay" value="0"/>
  <property name="period" value="86400000"/>
  <property name="timerTask" ref="checkWiner"/>
 </bean>
 <!-- 启动实际调度 -->
 <bean id="timerFactory" 
  class="org.springframework.scheduling.timer.TimerFactoryBean">
  <!-- 下面列出所有需要调用的任务调度Bean -->
  <property name="scheduledTimerTasks">
   <list>
    <ref bean="scheduledTask"/>
   </list>
  </property>
 </bean>
</beans>


0 0
原创粉丝点击