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

上一篇文章大概搭建了一下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.

				
时间: 2024-11-09 06:03:16

SSM项目搭建(二)mybatis和spring的集成的相关文章

java SSM项目搭建-- The server time zone value &#39;?й???????&#39; is unrecognized or represents more than one time zone

出现  错误 The server time zone value '?й???????' is unrecognized or represents more than one time zone 找到jdbc 数据库连接字符串, 加上?serverTimezone=UTC ?serverTimezone=UTC <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManager

Spring+SpringMVC+MyBatis深入学习及搭建(二)——MyBatis原始Dao开发和mapper代理开发(转发同上)

前面有写到Spring+SpringMVC+MyBatis深入学习及搭建(一)--MyBatis的基础知识.MybatisFirst中存在大量重复的代码.这次简化下代码: 原地址:http://www.cnblogs.com/shanheyongmu/p/7121016.html 使用MyBatis开发Dao,通常有两种方法,即原始Dao开发方法和Mapper接口开发方法. 1.SqlSession使用范围 1.1 SqlsessionFactoryBuilder 通过SqlSessionFac

Spring boot入门(二):Spring boot集成MySql,Mybatis和PageHelper插件

上一篇文章,写了如何搭建一个简单的Spring boot项目,本篇是接着上一篇文章写得:Spring boot入门:快速搭建Spring boot项目(一),主要是spring boot集成mybatis和pagehelper 关于mybatis和pagehelper的介绍,可以自行博客,网上很多类似的博客,这里,我直接上代码和项目搭建教程. 1.配置文件:在配置文件application.yml中配置MySql数据库连接池和Mybatis扫描包以及PageHelper分页插件 1 mybati

Java Spring MVC项目搭建(一)——Spring MVC框架集成

1.Java JDK及Tomcat安装 我这里安装的是JDK 1.8 及 Tomcat 8,安装步骤详见:http://www.cnblogs.com/eczhou/p/6285248.html 2.下载Eclipse并安装 我这里安装的是Java EE neon 64位版本. 3.建立Spring MVC项目 3.1.打开安装好的eclipse ,选择File->new->other.在弹出的框内选择Web->Dynamic Web Project , 选择Next. 3.2.给项目起

eclipse搭建第一个SSM项目 (二)遇到的问题

1.Cannot change version of project facet Dynamic web module to 3.0 参考地址: https://www.cnblogs.com/gmq-sh/p/4737130.html 2. No mapping found for HTTP request with URI [/demo] in DispatcherServlet with name 'SpringMVC' 参考地址: https://blog.csdn.net/qq_399

SSM项目搭建

SSM是最简单的项目架构,但时间久了便忘了,今天在此记录下. 创建 Maven 父工程 通过:Create New Project -> Maven,创建父工程,不需要勾选骨架,可以删除src. 然后再创建子项目同样可删除src,然后在子项目中创建模块,我这里创建了三个子模块 ,如下图: 再来一个web模块,并且在pom.xml中添加如下代码,告诉这是个war包: <packaging>war</packaging> 然后web模块F4进行如下配置添加WEB.xml: 配置完

SSM整合搭建(二)

本页来衔接上一页继续来搭建SSM,再提一下大家如果不详细可以再去看视频哦,B站就有 之后我们来配置SpringMVC的配置文件,主要是配置跳转的逻辑 先扫描所有的业务逻辑组件 我们要用SpringMVC去扫描包 那么就应该先去建立包 我们给SpringMVC设置扫描仅仅是Controller的包  并且禁止默认 <!-- SpringMVC的配置文件,包含网站跳转逻辑的控制,配置 --> <context:component-scan base-package="com.atg

SSM项目搭建步骤

1:安装JAVA环境JDK 1.8 添加环境变量2:安装IDEA3:安装Maven 添加环境变量 修改配置文件4:创建Maven项目5:创建子模块6:添加项目依赖 ----java ee --javax.servlet-api --jsp-api --jstl ----spring --spring-core --spring-beans --spring-context --spring-expression --spring-aop --spring-aspects --spring-jdb

Spring Boot2(二):使用Spring Boot2集成Mybatis缓存机制

前言 学习SpringBoot集成Mybatis的第二章,了解到Mybatis自带的缓存机制,在部署的时候踩过了一些坑.在此记录和分享一下Mybatis的缓存作用. 本文章的源码再文章末尾 什么是查询缓存 MyBatis有一级缓存和二级缓存.记录可以看下这篇博文: 一级缓存 首先看一下什么是一级缓存,一级缓存是指SqlSession.一级缓存的作用域是一个SqlSession.Mybatis默认开启一级缓存. 在同一个SqlSession中,执行相同的查询SQL,第一次会去查询数据库,并写到缓存