ssm框架整合快速入門


寫在前面:

  公司一直都是使用ssh框架(Struts2,Spring,Hibernate)來開發,但是現在外面的公司大多數都是使用的ssm框架,所以也有必要多學習一下外面的新技術。這里就快速搭建一個小的demo來入門了解一下。

 

  ssm的分別表示:SpringMVC、Spring、Mybatis。

 

  由於只是想快速搭建一個ssm框架,所以這里也沒有對SpringMVC、Spring、Mybatis的概念以及內部原理去做過多的深究,因為個人覺得還是要先學會使用輪子。一開始就去看一些太多理念或者原理,也不會很理解,當然了,理念的東西在開始做之前還是要稍微的了解一下的。

  比如就要知道SpringMVC對應着ssh中的Struts2,都是web層,主要用於接收用戶發送的請求,與給予響應。

  再者就是Spring,它是一個大大的容器,用來管理各種實體類,以及配置數據庫事務等。它的兩大特性主要是IOC與AOP

  IOC:Inversion of Control,控制反轉,讓Spring容器去管理裝載bean,即把java類的初始化交給spring容器去執行,需要用時直接引用。

  AOP:Aspect Oriented Programming,面向切面編程。通過動態代理或cglib代理把重復的具有相同功能的代碼橫向獨立出來或橫向插入。

  圖中可以看到方法1,方法2,方法3中都有相同的代碼A,B,把代碼A,B提取出來,只留下不同的代碼。將代碼A,B進行統一管理。

  面向切面場景舉例:事務管理

  現在有兩個方法,方法一:開啟事務,更新表里的數據,提交事務;方法二:開啟事務,刪除表里面的數據,提交事務。

  代碼是偽代碼,也是借用斌哥做的ppt上的圖。這兩個方法都有相同的功能代碼(開啟事務,提交事務)。將事務開啟,與事務的提交單獨抽取出來,然后統一管理。這就是aop的作用。

  最后,Mytabis是一個持久層框架,它可以使用簡單的XML文件或注解來配置和映射原生信息,將接口(Mapper層)和java的POJOs(Plain Old Java Objects,普通的Java對象)映射成數據庫中的記錄。它是可以直接在xml文件里寫sql語句的。

  與之都是ORM(Object Relational Mapping,對象關系映射)框架的Hibernate,卻是使得程序員可以直接以面向對象的方式來操縱數據庫,一般使用hql語句,雖然也可以使用sql語句,但是使用sql語句的靈活度不如Mybatis。兩者的區別也不是幾句話就能說清楚的,但是基本的還是要了解。

  對三個框架有個基本的認知后,下面就開始整合。這里使用Maven來創建web項目,這里如何創建就不細說了可以參考之前的博客https://www.cnblogs.com/eleven258/p/9842633.html

 

  准備工作:

  首先我們需要創建數據庫,並創建對應的表,這里只創建一個簡單的測試表,然后插入一條數據。

DROP TABLE IF EXISTS `user_t`;
 
CREATE TABLE `user_t` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_name` varchar(40) NOT NULL,
  `password` varchar(255) NOT NULL,
  `age` int(4) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
 
/*Data for the table `user_t` */
 
insert  into `user_t`(`id`,`user_name`,`password`,`age`) values (1,'蚊子','abcd',23);

  然后將對應所需要的一些文件夾,包名都建好。

  

  開始SSM整合:

  1.使用maven引入所需jar包

  pom.xml配置文件

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
    <!-- spring版本號 -->
    <spring.version>4.0.2.RELEASE</spring.version>
    <!-- mybatis版本號 -->
    <mybatis.version>3.2.6</mybatis.version>
    <!-- log4j日志文件管理包版本 -->
    <slf4j.version>1.7.7</slf4j.version>
    <log4j.version>1.2.17</log4j.version>
  </properties>

    <dependencies>
      <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
        <!-- 表示開發的時候引入,發布的時候不會加載此包 -->
        <scope>test</scope>
      </dependency>

      <!-- spring核心包 -->
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring.version}</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>${spring.version}</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-oxm</artifactId>
        <version>${spring.version}</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
        <version>${spring.version}</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>${spring.version}</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${spring.version}</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>${spring.version}</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>${spring.version}</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>${spring.version}</version>
      </dependency>

      <!-- mybatis核心包 -->
      <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>${mybatis.version}</version>
      </dependency>

      <!-- mybatis/spring包 -->
      <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>1.2.2</version>
      </dependency>

      <!-- 導入java ee jar 包 -->
      <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>7.0</version>
      </dependency>

      <!-- 導入Mysql數據庫鏈接jar包 -->
      <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.30</version>
      </dependency>

      <!-- 導入dbcp的jar包,用來在applicationContext.xml中配置數據庫 -->
      <dependency>
        <groupId>commons-dbcp</groupId>
        <artifactId>commons-dbcp</artifactId>
        <version>1.2.2</version>
      </dependency>

      <!-- JSTL標簽類 -->
      <dependency>
        <groupId>jstl</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
      </dependency>

      <!-- 日志文件管理包 -->
      <!-- log start -->
      <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>${log4j.version}</version>
      </dependency>
      <!-- 格式化對象,方便輸出日志 -->
      <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.1.41</version>
      </dependency>
      <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>${slf4j.version}</version>
      </dependency>
      <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>${slf4j.version}</version>
      </dependency>
      <!-- log end -->

      <!-- 引入JS-->
      <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.9.13</version>
      </dependency>

      <!-- 上傳組件包 -->
      <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.3.1</version>
      </dependency>
      <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.4</version>
      </dependency>
      <dependency>
        <groupId>commons-codec</groupId>
        <artifactId>commons-codec</artifactId>
        <version>1.9</version>
      </dependency>

  </dependencies>

  配置好后,點擊右側的Maven Projects,點擊重新導入按鈕,等待引入相關的jar包。

  

  

  2.配置spring與mybatis的整合

  首先配置jdbc.properties

jdbc.driverClass = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/ssm?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf8
jdbc.username = root
jdbc.password = 123456

 建立spring-mybatis.xml文件並配置,此文件是完成spring與mybatis整合的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                        http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
                        http://www.springframework.org/schema/context
                        http://www.springframework.org/schema/context/spring-context-3.1.xsd
                        http://www.springframework.org/schema/mvc
                        http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
    <!-- 自動掃描 -->
    <context:component-scan base-package="com.ssm" />

    <!--加載jdbc配置文件-->
    <context:property-placeholder location="classpath:jdbc.properties"/>

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
          destroy-method="close">
        <property name="driverClassName" value="${jdbc.driverClass}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        <!-- 初始化連接大小 -->
        <property name="initialSize" value="0"></property>
        <!-- 連接池最大數量 -->
        <property name="maxActive" value="20"></property>
        <!-- 連接池最大空閑 -->
        <property name="maxIdle" value="20"></property>
        <!-- 連接池最小空閑 -->
        <property name="minIdle" value="1"></property>
        <!-- 獲取連接最大等待時間 -->
        <property name="maxWait" value="60000"></property>
    </bean>

    <!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <!-- 自動掃描mapping.xml文件 -->
        <property name="mapperLocations" value="classpath:mapping/*.xml"></property>
    </bean>

    <!-- DAO接口所在包名,Spring會自動查找其下的類 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.ssm.dao" />
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
    </bean>

    <!-- (事務管理)transaction manager, use JtaTransactionManager for global tx -->
    <bean id="transactionManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>

</beans>

  3.配置spring-mvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                        http://www.springframework.org/schema/beans/spring-beans-3.1.xsd  
                        http://www.springframework.org/schema/context  
                        http://www.springframework.org/schema/context/spring-context-3.1.xsd  
                        http://www.springframework.org/schema/mvc  
                        http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
    <!-- 自動掃描該包,使SpringMVC認為包下用了@controller注解的類是控制器 -->
    <context:component-scan base-package="com.ssm.controller "/>
    <!--避免IE執行AJAX時,返回JSON出現下載文件 -->
    <bean id="mappingJacksonHttpMessageConverter"
          class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
        <property name="supportedMediaTypes">
            <list>
                <value>text/html;charset=UTF-8</value>
            </list>
        </property>
    </bean>
    <!-- 啟動SpringMVC的注解功能,完成請求和注解POJO的映射 -->
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <list>
                <ref bean="mappingJacksonHttpMessageConverter" />    <!-- JSON轉換器 -->
            </list>
        </property>
    </bean>
    <!-- 定義跳轉的文件的前后綴 ,視圖模式配置-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 這里的配置我的理解是自動給后面action的方法return的字符串加上前綴和后綴,變成一個 可用的url地址 -->
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>

    <!-- 配置文件上傳,如果沒有使用文件上傳可以不用配置,當然如果不配,那么配置文件中也不必引入上傳組件包 -->
  <!--  <bean id="multipartResolver"
          class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        &lt;!&ndash; 默認編碼 &ndash;&gt;
        <property name="defaultEncoding" value="utf-8" />
        &lt;!&ndash; 文件大小最大值 &ndash;&gt;
        <property name="maxUploadSize" value="10485760000" />
        &lt;!&ndash; 內存中的最大值 &ndash;&gt;
        <property name="maxInMemorySize" value="40960" />
    </bean>-->

</beans>

  4.配置web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">
  <display-name>Archetype Created Web Application</display-name>
  <!-- Spring和mybatis的配置文件 -->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring-mybatis.xml</param-value>
  </context-param>
  <!-- 編碼過濾器 -->
  <filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <async-supported>true</async-supported>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <!-- Spring監聽器 -->
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <!-- 防止Spring內存溢出監聽器 -->
  <listener>
    <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
  </listener>

  <!-- Spring MVC servlet -->
  <servlet>
    <servlet-name>SpringMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    <async-supported>true</async-supported>
  </servlet>
  <servlet-mapping>
    <servlet-name>SpringMVC</servlet-name>
    <!-- 此處可以可以配置成*.do,對應struts的后綴習慣 -->
    <url-pattern>/</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>/index.jsp</welcome-file>
  </welcome-file-list>

</web-app>

  5.log4j的配置,(這里就不再貼對應的配置文件了),讓其能在控制台輸出信息,如果需要可以去查看之前的資料https://www.cnblogs.com/eleven258/p/7380396.html

  到這一步,所需要的配置文件已經全部配置完畢。目錄結構圖如下:

  6.使用Mybatis Generator自動創建代碼

  這個可以用寫好的配置文件,根據數據庫表來自動的創建對應的實體類,對應的mapping.xml文件以及對應的mapper接口(dao層)。

  第一步,首先在pom.xml文件中添加插件mybatis-generator-maven-plugin

<plugin>
          <groupId>org.mybatis.generator</groupId>
          <artifactId>mybatis-generator-maven-plugin</artifactId>
          <version>1.3.2</version>
          <configuration>
            <verbose>true</verbose>
            <overwrite>true</overwrite>
          </configuration>
        </plugin>

  第二步,在src/main/resources 目錄下建立名為 generatorConfig.xml的配置文件,作為mybatis-generator-maven-plugin 插件的執行目標,模板如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
    <!-- 數據庫驅動-->
    <classPathEntry  location="D:\my_maven_local_repository\mysql\mysql-connector-java\5.1.30\mysql-connector-java-5.1.30.jar"/>
    <context id="DB2Tables"  targetRuntime="MyBatis3">
        <commentGenerator>
            <property name="suppressDate" value="true"/>
            <!-- 是否去除自動生成的注釋 true:是 : false:否 -->
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>
        <!--數據庫鏈接URL,用戶名、密碼 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/ssm" userId="root" password="123456">
        </jdbcConnection>
        <!-- 非必需,類型處理器,在數據庫類型和java類型之間的轉換控制-->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

        <!-- 生成模型的包名和位置
             targetPackage     指定生成的model生成所在的包名
            targetProject     指定在該項目下所在的路徑
        -->
        <javaModelGenerator targetPackage="com.ssm.bean" targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>
        <!-- 生成映射文件的包名和位置-->
        <sqlMapGenerator targetPackage="mapping" targetProject="src/main/resources">
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>
        <!-- 生成DAO的包名和位置-->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.ssm.dao" targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>
        <!-- 要生成的表 tableName是數據庫中的表名或視圖名 domainObjectName是實體類名-->
        <table tableName="user_t" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>
    </context>
</generatorConfiguration>

  第三步,在Intellij IDEA添加一個“Run運行”選項,使用maven運行mybatis-generator-maven-plugin插件 :

  其中Command line輸入的是 mybatis-generator:generate -e

  如果添加成功,則會在run 選項中有“generator” 選項,如下:

  然后點擊運行,如果運行成功的話,會在控制台看到BUILD SUCCESS,如果有錯誤的話,由於添加了-e 選項,會把具體的詳細錯誤信息打印出來的,根據錯誤信息修改即可。  

  這時你的目錄下面就多了剛自動創建生成的文件了

  這里要特別注意下,最好是將XXXMapper.xml文件放在resources路徑下,因為在測試的時候我把自動生成的mapper.xml文件放在src/main/java下一直掃描不到.所以這里最好注意下。對應的參考連接https://blog.csdn.net/zhwyj1019/article/details/79088073

  7.到這里我們就可以去編寫代碼啦,首先我們,編寫業務層的代碼

  UserService接口

public interface UserService {
    public User getUserById(int id);
}

  UserServiceImpl.java

@Service("userService")
public class UserServiceImol implements UserService{

    //引入mapper接口
    @Resource
    private UserMapper userMapper;

    @Override
    public User getUserById(int id) {
        //這里調用的方法是與UserMapper.xml文件中對應的id名是一致的
        return userMapper.selectByPrimaryKey(id);
    }
}

  8.編寫對應的Controller層的代碼

@Controller("UserController")
@RequestMapping("/user")
public class UserController {
    //引入service接口
    @Resource
    private UserService userService;

    @RequestMapping("/showUser")
    public String test(HttpServletRequest request, Model model){
        String id = request.getParameter("id");
        User user = userService.getUserById(Integer.parseInt(id));
        model.addAttribute("user",user);
        return "showUser";
    }
}

  9.編寫對應的jsp頁面,這里簡單的測試下showUser.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>測試</title>
</head>
<body>
    ${user.userName}
</body>
</html>

  10.部署項目,啟動,在瀏覽器地址欄輸入:http://localhost:8080/ssmDemo/user/showUser?id=1 回車,可以看到,出現名字,成功啦~~~~

 

  到這里ssm三大框架的快速整合就完成了,對於使用generator插件自動生成的代碼,可以自己下去生成看看對應的內容,這里就不再把代碼貼上來了 。

  這里附上完整的項目結構目錄:

  

  還有值得注意的是,對於jdbc文件的配置,在參考資料的時候,寫的是username,前面沒有加jdbc,這個時候會報錯的,因為會變成系統管理員的名字,所以這里也要注意下。

 

 

  參考資料:

  https://blog.csdn.net/zhshulin/article/details/37956105------SSM框架——詳細整合教程(Spring+SpringMVC+MyBatis)

  https://www.cnblogs.com/liaojie970/p/7058543.html------IDEA 中使用MyBatis-generator 自動生成MyBatis代碼

  https://blog.csdn.net/zhwyj1019/article/details/79088073------spring boot 整合mybatis org.apache.ibatis.binding.BindingException: Invalid bound state 

 

  還有也要看看斌哥附上的學習資料

  https://blog.csdn.net/litianxiang_kaola/article/details/79169148

  https://blog.csdn.net/bieleyang/article/details/77862042

  https://www.cnblogs.com/dongying/p/4142476.html

  https://www.cnblogs.com/1880su/p/7965461.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM