基于java配置的SSM框架详细整合

一、整合Spring MVC + mybatis

1、配置DispatcherServlet

  • 在这里请求会第一次接触到Spring MVC框架,DispatcherServlet通过查询一个或多个处理器映射来确定应该将请求发送到哪个控制器。一旦选择了合适的控制器,DispatcherServlet会将请求发送给选定的控制器。

  • 下面我会使用Java将DispatcherServlet配置在Servlet容器中,而不会使用web.xml文件。唯一需要注意的是,如果按照这种方式配置DispatcherServlet,而不是使用web.xml的话,它只能部署到支持Servlet3.0的服务器(如Tomcat7或更高的版本)中才能正常工作。

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

/**
 * 扩展AbstractAnnotationConfigDispatcherServletInitializer的任意类都会自动地配置
 * DispatcherServlet和Spring应用上下文,Spring的应用上下文会位于应用程序的Servlet上下文之中
 */
public class MpdidbWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer
{
    /**
     *返回带有@Configuration注解的类将会用来配置ContextLoaderListener创建应用的应用上下文中的bean。
     * ContextLoaderListener要加载应用中的其他bean,这些bean通常是驱动应用后端的中间层和数据层的组件。
     */
    @Override
    protected Class<?>[] getRootConfigClasses()
    {
        return new Class<?>[] {RootConfig.class};
    }

    /**
     *返回带有@Configuration注解的类将会用来定义DispatcherServlet应用上下文中的bean。
     * DispatcherServlet加载包含Web组件的bean,如控制器、视图解析器以及处理器映射器。
     */
    @Override
    protected Class<?>[] getServletConfigClasses()
    {
        return new Class<?>[] {WebConfig.class};
    }

    /**
     * 将一个或多个路径映射到DispatcherServlet上,
     * 此处它的映射是“/”,即默认的Servlet,会处理进入应用的所有请求
     */
    @Override
    protected String[] getServletMappings()
    {
        return new String[] { "/" };
    }
}

2、启用Spring MVC

  • 同样基于Java进行配置,所能创建的最简单的Spring MVC配置就是一个带有@EnableWebMvc注解的类。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Configuration
@EnableWebMvc   //启用Spring MVC
@ComponentScan("com.mpdidb.controller")  //启用组件扫描
public class WebConfig extends WebMvcConfigurerAdapter
{
    //配置JSP视图解析器
    @Bean
    public ViewResolver viewResolver()
    {
        InternalResourceViewResolver resolver =
                new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        //可以在JSP页面中通过${}访问beans
        resolver.setExposeContextBeansAsAttributes(true);
        return resolver;
    }
    /**
     * WebConfig类扩展了configurer WebMvcConfigurerAdapter并重写了其configureDefaultServletHandling()方法.
     * 通过调用DefaultServletHandlerConfigurer的enable()方法,要求DispatcherServlet将对静态资源的请求转发到Servlet容器默认的
     * Servlet上,而不是使用DispatcherServlet来处理此类请求。
     * @param
     */
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer)
    {
        configurer.enable();
    }
}

3、创建RootConfig配置类

WebConfig配置类已经就绪,下面创建RootConfig配置类。该配置类中导入了DataConfig配置类,DataConfig配置类整合了spring+mybatis

import org.springframework.context.annotation.*;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

@Configuration
@Import(DataConfig.class)
/**
 * 设置扫描机制的时候,将之前WebConfig设置过的那个包排除了;
 */
@ComponentScan(basePackages = {"com.mpdidb"},
    excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,
            value = EnableWebMvc.class)})
public class RootConfig
{
}

4、创建DataConfig配置类

  • 在创建DataConfig配置类之前要先创建jdbc.properties配置文件。
mysql.driver=com.mysql.cj.jdbc.Driver
mysql.url=jdbc:mysql://localhost:3306/mpdidb?useUnicode=true&characterEncoding=utf-8&useSSL=false&zeroDateTimeBehavior=convertToNull&autoReconnect=true
mysql.username=Your_username
mysql.password=Your_password
  • jdbc.properties配置文件创建完毕之后,就可以创建DataConfig配置类了
import org.apache.commons.dbcp.BasicDataSource;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;

import javax.sql.DataSource;

@Configuration
//使用@MapperScan来扫描注册mybatis数据库接口类,其中basePackages属性表明接口类所在的包
@MapperScan(basePackages = "com.mpdidb.mapper")
@PropertySource("classpath:jdbc.properties")
public class DataConfig
{
    @Autowired
    private Environment environment;

    /**
     * 使用数据库链接池配置数据源
     */
    @Bean
    public BasicDataSource dataSource()
    {
        BasicDataSource ds = new BasicDataSource();
        ds.setDriverClassName(environment.getProperty("mysql.driver"));
        ds.setUrl(environment.getProperty("mysql.url"));
        ds.setUsername(environment.getProperty("mysql.username"));
        ds.setPassword(environment.getProperty("mysql.password"));
        //初始化连接大小
        ds.setInitialSize(5);
        //初始化连接池数量
        ds.setMaxActive(10);
        return ds;
    }

    /**
     * 声明mybatis的session工厂
     * @return
     * @throws Exception
     */
    @Bean
    public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource) throws Exception
    {
        ResourcePatternResolver patternResolver = new PathMatchingResourcePatternResolver();
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        sqlSessionFactoryBean.setTypeAliasesPackage("com.mpdidb.domain");
        sqlSessionFactoryBean.setMapperLocations(patternResolver.getResources("classpath:mapping/*Mapper.xml"));
        return sqlSessionFactoryBean;
    }
}

二、测试

1、测试前需要的文件

  • MySQL tb_user表
2017-08-03 11-31-25屏幕截图.png
  • tb_user表对应的实体类TbUser.java
public class TbUser {
    private String userId;

    private String userRole;

    private String userName;

    private String password;

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId == null ? null : userId.trim();
    }

    public String getUserRole() {
        return userRole;
    }

    public void setUserRole(String userRole) {
        this.userRole = userRole == null ? null : userRole.trim();
    }

    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();
    }

    @Override
    public String toString() {
        return "TbUser{" +
                "userId='" + userId + '\'' +
                ", userRole='" + userRole + '\'' +
                ", userName='" + userName + '\'' +
                ", password='" + password + '\'' +
                '}';
    }

  • TbUserMapper.xml
<?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.mpdidb.mapper.TbUserMapper">
  <resultMap id="BaseResultMap" type="com.mpdidb.domain.TbUser">
    <id column="user_id" jdbcType="VARCHAR" property="userId" />
    <result column="user_role" jdbcType="VARCHAR" property="userRole" />
    <result column="user_name" jdbcType="VARCHAR" property="userName" />
    <result column="password" jdbcType="VARCHAR" property="password" />
  </resultMap>


  <select id="selectByPrimaryKey" parameterType="java.lang.String" resultMap="BaseResultMap">
    select *
    from tb_user
    where user_id = #{userId,jdbcType=VARCHAR}
  </select>

  <delete id="deleteByPrimaryKey" parameterType="java.lang.String">
    delete from tb_user
    where user_id = #{userId,jdbcType=VARCHAR}
  </delete>

  <insert id="insert" parameterType="com.mpdidb.domain.TbUser">
    insert into tb_user (user_id, user_role, user_name, 
      password)
    values (#{userId,jdbcType=VARCHAR}, #{userRole,jdbcType=VARCHAR}, #{userName,jdbcType=VARCHAR}, 
      #{password,jdbcType=VARCHAR})
  </insert>

  <update id="updateByPrimaryKey" parameterType="com.mpdidb.domain.TbUser">
    update tb_user
      set user_role = #{userRole,jdbcType=VARCHAR},
      user_name = #{userName,jdbcType=VARCHAR},
      password = #{password,jdbcType=VARCHAR}
      where user_id = #{userId,jdbcType=VARCHAR}
  </update>
</mapper>
  • TbUserMapper.java接口
import com.mpdidb.domain.TbUser;

import java.util.List;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;

@Repository
public interface TbUserMapper {


    int deleteByPrimaryKey(String userId);

    int insert(TbUser record);

    TbUser selectByPrimaryKey(String userId);

    int updateByPrimaryKey(TbUser record);
}
  • TbUserService.java接口
import com.mpdidb.domain.TbUser;

public interface TbUserService
{
    TbUser selectByPrimaryKey(String userId);
}
  • TbUserService.java接口的具体实现类TbUserServiceImpl.java
import com.mpdidb.domain.TbUser;
import com.mpdidb.mapper.TbUserMapper;
import com.mpdidb.service.TbUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class TbUserServiceImpl implements TbUserService
{
    @Autowired
    private TbUserMapper tbUserMapper;

    @Override
    public TbUser selectByPrimaryKey(String userId)
    {
        return tbUserMapper.selectByPrimaryKey(userId);
    }
}

2、编写测试类

import com.mpdidb.config.RootConfig;
import com.mpdidb.domain.TbUser;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class) //让测试运行于spring测试环境,在使用所有注释前必须使用
@ContextConfiguration(classes = {RootConfig.class})
public class TbUserServiceTest
{
    @Autowired
    private TbUserService tbUserService;


    @Test
    public void selectByPrimaryKeyTest()
    {
        String userId = "wusuodai";
        TbUser tbUser = tbUserService.selectByPrimaryKey(userId);
        System.out.println(tbUser.getUserName());
    }

}

3、测试结果,通过

2017-08-03 11-43-33屏幕截图.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,598评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,739评论 6 342
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,577评论 18 399
  • 风势助银龙,周天布阵重。日光耀眼,步履匆匆。老将死尤不瞑目,建航母,责任重。军号咽北风,红旗引剑锋。巨舰下水,万里...
    谁的水的水的水阅读 199评论 0 1
  • [17513]《地球上的星星》《欧阳老师的课》/阿米尔·汗 欧阳老师/电影 课堂 ✘桌子太小了,盛不下你们驰骋的想...
    旺仔牛奶HaHaHa阅读 233评论 0 0