1. 程式人生 > >SpringMVC+MyBatis+MySql環境搭建

SpringMVC+MyBatis+MySql環境搭建

第一次搭建springmvc+mybatis框架踩了不少坑,比如缺少jar包,配置引數出錯,路徑問題等等。通過不斷的搜尋和比對別人的搭建過程,還是讓我搭建出來了。於是,打算總結一下我的搭建過程,並附上所需的jar包。希望能幫到有打算自己搭建SpringMVC框架的人。

搭建框架的大致步驟是:
- 匯入相關jar包;
- 新增並配置springmvc、mybatis檔案;
- 在web.xml中配置springmvc和mybatis檔案;
- 在程式碼中的使用。

一、依賴的jar包

我用到的jar包主要是spring的框架包,這個可以到官網下載最新版。還有mybatis的jar包,mybatis-spring(這個儘量用最新版的,可以到

這裡下載,之前搭建的時候因為用的是舊版的,有出現了強轉失敗的情況,新版則沒有。)以及其他相關的jar包。具體如下圖

springmvc_jar

二、新增springmvc-servlet.xml配置檔案

這個檔案我是放到WEB-INF目錄下(這個路徑在後面web.xml配置中需要用到)。主要配置了需要註解驅動、掃描包檔案、已經jsp路徑,程式碼如下

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd"
>
<!-- 啟動註解驅動的Spring MVC功能,註冊請求url和註解POJO類方法的對映--> <mvc:annotation-driven /> <!-- 啟動包掃描功能,以便註冊帶有@Controller、@Service、@repository、@Component等註解的類成為spring的bean --> <context:component-scan base-package="com.jarvis" /> <!-- 啟動SpringMVC的註解功能,完成請求和註解POJO的對映 --> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> </bean> <!-- 對模型檢視名稱的解析,在請求時模型檢視名稱新增前後綴,除了index.jsp,其他jsp頁面都放在了WEB-INF/view下面了。 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/view/" p:suffix=".jsp" /> </beans>

三、配置mybatis

(1)、spring-mybatis配置檔案

1、前提是mysql資料庫已經裝好,且測試正常。那麼,接下來就是配置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">
    <!-- 自動掃描,dao目錄下的介面檔案 -->
    <context:component-scan base-package="com.jarvis.dao" />
    <!-- 引入配置檔案 -->
    <bean id="propertyConfigurer"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="classpath:datasource.properties" />
    </bean>
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="${driver}" />
        <property name="url" value="${url}" />
        <property name="username" value="${username}" />
        <property name="password" value="${password}" />
        <!-- 初始化連線大小 -->
        <property name="initialSize" value="${initialSize}"></property>
        <!-- 連線池最大數量 -->
        <property name="maxActive" value="${maxActive}"></property>
        <!-- 連線池最大空閒 -->
        <property name="maxIdle" value="${maxIdle}"></property>
        <!-- 連線池最小空閒 -->
        <property name="minIdle" value="${minIdle}"></property>
        <!-- 獲取連線最大等待時間 -->
        <property name="maxWait" value="${maxWait}"></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:com/jarvis/mapping/*.xml"></property>
    </bean>
    <!-- DAO介面所在包名,Spring會自動查詢其下的類 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.jarvis.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>  

(2)、mysql配置引數

在上面的配置檔案中,可以看到引數是通過

 <!-- 引入配置檔案 -->
    <bean id="propertyConfigurer"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="classpath:datasource.properties" />
    </bean>

來引入的,引入的檔案為datasource.properties,新增properties檔案主要是為了方便資料庫配置

driver=com.mysql.jdbc.Driver
#訪問地址和埠號,test為資料庫名
url=jdbc:mysql://127.0.0.1:3306/test
#使用者名稱
username=root
#密碼
password=123456
#定義初始連線數
initialSize=0
#定義最大連線數
maxActive=20
#定義最大空閒
maxIdle=20
#定義最小空閒
minIdle=1
#定義最長等待時間
maxWait=60000  

四、配置web.xml

基本的配置檔案都寫完後,需要在web.xml配置把它們配置進去,才能在專案啟動時載入它們。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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID" version="3.0">

    <!-- Spring和mybatis的配置檔案 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring-servlet.xml,
        classpath*:spring-mybatis.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <!-- 配置spring核心servlet -->
    <servlet>
        <servlet-name>spring</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <!-- url-pattern配置為/,不帶檔案字尾,會造成其它靜態檔案(js,css等)不能訪問。如配為*.do,則不影響靜態檔案的訪問 -->
    <servlet-mapping>
        <servlet-name>spring</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <!-- 編碼過濾器 -->
    <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.util.IntrospectorCleanupListener</listener-class>
    </listener>
    <welcome-file-list>
        <welcome-file>/index.jsp</welcome-file>
    </welcome-file-list>
    <!-- 配置SESSION超時,單位是分鐘 -->
    <session-config>
        <session-timeout>15</session-timeout>
    </session-config>
</web-app>   

五、使用流程

到這邊的話,就基本是配置完了。接下來,就來看看如何使用了。首先,我們假設一個業務流程,根據使用者的id來獲取使用者名稱,並顯示到頁面上。

1、新增表及資料

我在mysql中建立了一個test資料庫,並添加了一個user的表
- 建表語句

create table user 
( 
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '編號', 
name varchar(32) NOT NULL  COMMENT '姓名',
password varchar(128) NOT NULL  COMMENT '密碼'

);
  • 新增的資料
insert into user values(2,"test","123456")

2、新增constroller

首先是在com.jarvis包下新增一個constroller包,專門用來方式constroller。然後建立一個LoginConstroller.java,程式碼如下

package com.jarvis.constroller;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import com.jarvis.pojo.User;
import com.jarvis.serv.IUserService;

@Controller  
@RequestMapping("/user")
public class LoginConstroller {
@Resource
private IUserService userService;
public LoginConstroller() {}  
   @RequestMapping(value = "/login/{id}", method = RequestMethod.GET)  
   public ModelAndView myMethod(HttpServletRequest request,HttpServletResponse response,   
           @PathVariable("id") String id, ModelMap modelMap) throws Exception {  

                User users = userService.getUserById(Integer.valueOf(id));
       modelMap.put("loginUser", users.getUserName());  
       return new ModelAndView("/login/hello", modelMap);  
   }  

上面這個方法是通過url傳入id,然後通過id查詢資料庫,並取出使用者,資訊輸入使用者名稱,然後跳轉到/login下的hello.jsp。從這個類中可以看到,除了查詢資料庫的service外,還有一個pojo類User。接下來,就先建立pojo類。

3、新增pojo

package com.jarvis.pojo;
public class User {
    private Integer id;
    private String userName;
    private String password;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName == null ? null : userName.trim();
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password == null ? null : password.trim();
    }
}  

4、新增userService

這邊需要注意的是,在controller中使用到的userService,是通過註解來完成,而註解的名稱就是userService。所以在新增userService時,需要注意一下,不要寫錯了。
- 先新增一個介面IUserService

package com.jarvis.serv;
import com.jarvis.pojo.User;
public interface IUserService {
    public User getUserById(int userId);
}
  • 新增實現類UserServiceImpl
package com.jarvis.serv.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import com.jarvis.dao.IUserDao;
import com.jarvis.pojo.User;
import com.jarvis.serv.IUserService;

@Service("userService")
public class UserServiceImpl implements IUserService {
@Autowired
    @Qualifier("IUserDao")
private IUserDao IUserDao;
@Override
public User getUserById(int userId) {
return this.IUserDao.selectByPrimaryKey(userId);
}

}

這裡用到的IUserDao是直接在UserServiceImpl這個類中註解的。

5、新增dao

package com.jarvis.dao;

import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.jarvis.pojo.User;
@Transactional(propagation=Propagation.REQUIRES_NEW,readOnly=false,isolation=Isolation.DEFAULT)
public interface IUserDao {
    User selectByPrimaryKey(Integer id);
}

6、新增dao對應的mapper檔案

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.jarvis.dao.IUserDao" >

  <resultMap id="BaseResultMap" type="com.jarvis.pojo.User" >
    <id column="id" property="id" jdbcType="INTEGER" />
    <result column="name" property="userName" jdbcType="VARCHAR" />
    <result column="password" property="password" jdbcType="VARCHAR" />
  </resultMap>

  <sql id="Base_Column_List" >
    id, name, password
  </sql>

  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
    select 
 <include refid="Base_Column_List" />
   from user where id = #{id,jdbcType=INTEGER}
  </select>

</mapper>  

7、新增對應的頁面

因為在springmvc-servlet中,我們把頁面的路徑放到了WEB-INF目錄下的view目錄,而在LoginController中返回的路徑是login下的hello.jsp,所以,我們首先要在WEB-INF下建立一個view目錄,在view下,建立一個login目錄,在login目錄下建立一個名為hello的jsp檔案。
hello.jsp的程式碼如下

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
<%  
String path = request.getContextPath();  
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
%>  
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
<html>  
<head>  
<base href="<%=basePath%>">  
<title>My JSP 'hello.jsp' starting page</title>  
<meta http-equiv="pragma" content="no-cache">  
<meta http-equiv="cache-control" content="no-cache">  
</head>  
<body>  
    你好:<%=request.getAttribute("loginUser") %>,現在時間是<%= new Date() %>  
</body>  
</html>    

8、測試

到這邊,就可以開始測試了。不過首先,我們要搞清楚訪問的url。首先肯定是http://ip:埠/專案名,然後是看LoginController中,類的@RequestMapping是”/user”,方法的@RequestMapping是”/login/{id}”。其中的{id}是我們要傳的值。所以,訪問的url是

http://localhost:8080/專案名/user/login/id

執行效果如下:

執行效果