1. 程式人生 > >SSM項目搭建(二)mybatis和spring的集成

SSM項目搭建(二)mybatis和spring的集成

刪除 internal code odi 自動獲取 over 初級 character upload

上一篇文章大概搭建了一下ssm的框架,其實還是不完整,我們往項目中添加了spring和mybatis的配置文件,還差一個spring mvc的配置文件,在resource中在新建一個ApplicationContext-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:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"
> <mvc:annotation-driven/> <mvc:default-servlet-handler/> <context:component-scan base-package="com.m_gecko.controller" /> <!-- 對靜態資源文件的訪問,跳過spring mvc的dispatch,防止被springmvc錯誤攔截 --> <mvc:resources mapping="/admin/**" location="/,/admin/" />
<mvc:resources mapping="/static/**" location="/,/static/" /> <mvc:resources mapping="/plugins/**" location="/,/plugins/" /> <mvc:resources mapping="/uploadFiles/**" location="/,/uploadFiles/" /> <!-- 訪問攔截 --> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**/**"/> <bean class="com.m_gecko.interceptor.SpringInterceptor"/> </mvc:interceptor> </mvc:interceptors> <!-- 配置SpringMVC的視圖解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean> <!-- 異常處理 --> <bean id="exceptionResolver" class="com.m_gecko.resolver.MyExceptionResolver"></bean> <!-- 上傳攔截,如最大上傳值及最小上傳值 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" > <property name="maxUploadSize"> <value>104857600</value> </property> <property name="maxInMemorySize"> <value>4096</value> </property> <property name="defaultEncoding"> <value>utf-8</value> </property> </bean> </beans>

裏面有些配置暫時可能還不會用到,如果項目運行不起來,註釋掉就好了。或者添加相應缺少的jar包。本文章主要在於記錄和思考,在項目運行過程中有遇到很多bug,無法運行的情況,都是摸石頭過河解決的,所以無法一一記錄。

至此ssm三大框架的配置文件都已編寫好了,但是如何將他們串起來呢。我們知道,web項目在啟動的時候,首先會啟動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"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    version="2.5">
    <!-- 加載spring配置文件 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            classpath:ApplicationContext.xml,
        </param-value>
    </context-param>
    <!-- 加載log4j配置文件 -->
    <context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>classpath:log4j.properties</param-value>
    </context-param>
    <!-- 字符編碼過濾器 -->
    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <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>
    <context-param>
        <param-name>webAppRootKey</param-name>
        <param-value>www.m_gecko.com</param-value>
    </context-param>
    <filter>
        <filter-name>DruidWebStatFilter</filter-name>
        <filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>
        <init-param>
            <param-name>exclusions</param-name>
            <param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>DruidWebStatFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <servlet>
        <servlet-name>DruidStatView</servlet-name>
        <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>DruidStatView</servlet-name>
        <url-pattern>/druid/*</url-pattern>
    </servlet-mapping>
    <!-- 監聽器 -->
    <listener>
        <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
    </listener>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <!-- 以下配置是spring mvc -->
    <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:ApplicationContext-mvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springMvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <error-page>
        <error-code>404</error-code>
        <location>/404.jsp</location>
    </error-page>
    <session-config>
        <session-timeout>600</session-timeout>
    </session-config>
</web-app>

這樣以後就可啟動了,啟動可能會報錯,說:java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener

如果你是maven項目,tomcat在發布項目的時候沒有同時發布maven依賴所添加的jar包,
你需要設置一下eclipse:
項目 —> 屬性 -> Deployment Assembly -> Add -> Java Build Path Entries -> 選擇Maven Dependencies -> Finish -> OK
把對應的Maven依賴包也發布到tomcat,調試時會自動把那些jar發布到指定目錄下,tomcat也能找到那些jar了。
我們查看控制臺,啟動的日誌如下。
技術分享

終於將ssm框架配置完成,但目前看來,程序現在還做不了任何事情,我們只是配置了一些基礎的信息,並沒有寫任何類。

目前我們的項目的框架如下圖所示。

技術分享

 其中SpringInterceptor和MyExceptionResolver可以就建立一個文件,什麽都不用寫,到時候我們需要用到的時候再來寫。
-----------------------------------------------------------------------------分割線-----------------------------------------------------------
下面我們要來寫一個簡單的demo,實現數據的增刪改查,在這個demo裏,我們將spring和mybatis集成起來用。
1.首先在com.m_gecko.dao中創建所有dao的基類BaseDao,定義一些最常用的方法,我暫時寫了幾個,該基類利用了反射和泛型。代碼如下。
package com.m_gecko.dao;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;

import javax.annotation.Resource;

import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.stereotype.Repository;

/**
 * 所有dao基類
 * 
 * @author xdx
 *
 * @param <T>
 * @param <PK>
 */
@Repository("baseDao")
public class BaseDao<T, PK extends Serializable> {
    private Class<T> enetityClass;
    @Resource(name = "sqlSessionTemplate")
    private SqlSessionTemplate sqlSessionTemplate;

    // 構造方法,根據實例類自動獲取實體類型,這邊利用java的反射
    public BaseDao() {
        this.enetityClass = null;
        Class c = getClass();
        Type t = c.getGenericSuperclass();
        if (t instanceof ParameterizedType) {
            ParameterizedType p = (ParameterizedType) t;
            Type[] type = p.getActualTypeArguments();
            this.enetityClass = (Class<T>) type[0];
        }
    }

    /**
     * 獲取實體
     * 
     * @param id
     * @return
     */
    public T getT(String sql, Object param) {
        return sqlSessionTemplate.selectOne(sql, param);
    }
    /**
     * 不帶查詢參數的列表
     * @param str
     * @return
     * @throws Exception
     */
    public List<T> findTList(String sql) throws Exception {
        return sqlSessionTemplate.selectList(sql);
    }

    /**
     * 帶有參數的列表
     * 
     * @param str
     * @param param
     * @return
     * @throws Exception
     */
    public List<T> findTListByParam(String sql, Object param) throws Exception {
        return sqlSessionTemplate.selectList(sql, param);
    }

    /**
     * 插入一條數據,參數是t
     * 
     * @param sql
     * @param t
     * @return
     */
    public int addT(String sql, T t) {
        return sqlSessionTemplate.insert(sql, t);
    }
    /**
     * 修改一條數據,參數是t
     * @param sql
     * @param t
     * @return
     */
    public int updateT(String sql,T t){
        return sqlSessionTemplate.update(sql, t);
    }
/**
* 刪除t
* @param sql
* @param t
* @return
*/
public int deleteT(String sql,PK pk){
return sqlSessionTemplate.delete(sql, pk);
} }

2.然後我們建立一個Service類,起名為GeckoService,並將BaseDao依賴註入。同時寫了一個main方法備用,如下。

package com.m_gecko.service;

import java.util.List;

import javax.annotation.Resource;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Service;

import com.m_gecko.dao.BaseDao;
import com.m_gecko.entity.TGecko;
import com.m_gecko.util.ParamModel;

@Service("geckoService")
public class GeckoService {
    @Resource(name="baseDao")
    private BaseDao<TGecko,Integer> baseDao;public static void main(String args[]) throws Exception{
   
    }

}

3.接下來我們一步一步來進行增刪改查的操作

1)增。

在service類中,寫一個增加數據的方法,如下。

public int addGecko(TGecko gecko){
        return baseDao.addT("TGeckoMapper.insertSelective", gecko);
    }

該方法的第一個參數,TGeckoMapper.insertSelective指的是我們在TGeckoMapper.xml裏定義的方法,TGeckoMapper對應<mapper namespace="TGeckoMapper">這裏的namespace,insertSelective對應具體的方法,代碼如下。

<insert id="insertSelective" parameterType="Gecko">
        insert into t_gecko
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="geckoId != null">
                gecko_id,
            </if>
            <if test="geckoType != null">
                gecko_type,
            </if>
            <if test="geckoName != null">
                gecko_name,
            </if>
            <if test="picUrl != null">
                pic_url,
            </if>
            <if test="createTime != null">
                create_time,
            </if>
            <if test="updateTime != null">
                update_time,
            </if>
            <if test="isDel != null">
                is_del,
            </if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="geckoId != null">
                #{geckoId,jdbcType=INTEGER},
            </if>
            <if test="geckoType != null">
                #{geckoType,jdbcType=INTEGER},
            </if>
            <if test="geckoName != null">
                #{geckoName,jdbcType=VARCHAR},
            </if>
            <if test="picUrl != null">
                #{picUrl,jdbcType=VARCHAR},
            </if>
            <if test="createTime != null">
                #{createTime,jdbcType=TIMESTAMP},
            </if>
            <if test="updateTime != null">
                #{updateTime,jdbcType=TIMESTAMP},
            </if>
            <if test="isDel != null">
                #{isDel,jdbcType=INTEGER},
            </if>
        </trim>
    </insert>

在該方法中,我們傳入的parameterType為Gecko的參數,對應於addT方法中的第二個參數T,#{geckoId,jdbcType=INTEGER}所代表的的即是傳進來的實參gecko的一個屬性geckoId。

現在我們來調用方法。

在main方法中,寫入如下代碼。

    ApplicationContext context=new ClassPathXmlApplicationContext("ApplicationContext.xml");
        GeckoService geckoService=(GeckoService) context.getBean("geckoService");

        TGecko gecko=new TGecko();
        gecko.setGeckoType(1);
        gecko.setGeckoName("原種守宮");
        int result=geckoService.addGecko(gecko);
System.out.println("插入結果:"+(result>0?"成功":"失敗"));

然後,run as java application程序,這樣我們就剝離spring mvc,把程序當成一個普通的應用程序來跑,需要註意的是ApplicationContext context=new ClassPathXmlApplicationContext("ApplicationContext.xml");這句話的作用是載入spring容器,並且初始化其中的bean。

技術分享

運行以後,控制臺打出消息。

技術分享

我們從數據庫中查看,確實能看到剛才插入的一條數據。

技術分享

2)刪

現在我們刪除gecko_id為4的一條數據,先寫一個deleteGecko方法。

    public int deleteGecko(TGecko gecko){
        return baseDao.deleteT("TGeckoMapper.deleteByPrimaryKey",gecko.getGeckoId());
    }

該方法對應於TGeckoMapper.xml中的deleteByPrimaryKey方法,如下所示。

<delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
        delete from
        t_gecko
        where gecko_id = #{geckoId,jdbcType=INTEGER}
    </delete>

同樣的,我們在main方法中對該方法進行調用。

    ApplicationContext context=new ClassPathXmlApplicationContext("ApplicationContext.xml");
        GeckoService geckoService=(GeckoService) context.getBean("geckoService");
        TGecko gecko=new TGecko();
        gecko.setGeckoId(4);
        int result=geckoService.deleteGecko(gecko);
        System.out.println("刪除結果:"+(result>0?"成功":"失敗"));

運行結果:

技術分享

我們去查看數據庫,可以看到gekcoId=4的記錄已經被成功刪除。

技術分享

3)改
接下我們修改一條數據,將gecko_id=6的原種守宮,改為原色守宮。
public int updateGecko(TGecko gecko){
        return baseDao.updateT("TGeckoMapper.updateByPrimaryKeySelective", gecko);
    }


    ApplicationContext context=new ClassPathXmlApplicationContext("ApplicationContext.xml");
        GeckoService geckoService=(GeckoService) context.getBean("geckoService");
        TGecko gecko=new TGecko();
        gecko.setGeckoId(6);
        gecko.setGeckoName("原色守宮");
        int result=geckoService.updateGecko(gecko);
        System.out.println("修改結果:"+(result>0?"成功":"失敗"));

技術分享

技術分享

4)查

最後我們來做一下查詢,我們先來查詢geckoId=1的這條記錄,並把它打印出來。

    public TGecko getGeckoById(int geckoId){
        return baseDao.getT("TGeckoMapper.selectByPrimaryKey", geckoId);
    }
        ApplicationContext context=new ClassPathXmlApplicationContext("ApplicationContext.xml");
        GeckoService geckoService=(GeckoService) context.getBean("geckoService");
        TGecko gecko=geckoService.getGeckoById(1);
        System.out.println("查詢結果,geckoId:"+gecko.getGeckoId()+",geckoName:"+gecko.getGeckoName()+",geckoType:"+gecko.getGeckoType());

技術分享

再來查詢一個列表,查詢出所有的gecko的list.

    <select id="listGecko" resultMap="BaseResultMap">
        select
        <include refid="Base_Column_List"></include>
        from t_gecko
        where
        is_del =0
        ORDER BY gecko_id
    </select>
    public List<TGecko>getGeckoList() throws Exception{
        return baseDao.findTList("TGeckoMapper.listGecko");
    }
    ApplicationContext context=new ClassPathXmlApplicationContext("ApplicationContext.xml");
        GeckoService geckoService=(GeckoService) context.getBean("geckoService");
        List<TGecko> geckoList=geckoService.getGeckoList();
        for(TGecko gecko:geckoList){
            System.out.println("查詢結果,geckoId:"+gecko.getGeckoId()+",geckoName:"+gecko.getGeckoName()+",geckoType:"+gecko.getGeckoType());
        }

技術分享

以上便是利用spring+mybatis實現數據的增刪改查的初級操作,下一篇文章我們結合spring mvc來做一個小的demo.




SSM項目搭建(二)mybatis和spring的集成