如何使用IDEA搭建SSM框架

825 阅读5分钟

这是我参与8月更文挑战的第26天,活动详情查看:8月更文挑战

| 作者:江夏

| CSDN:blog.csdn.net/qq_41153943

| 掘金:juejin.cn/user/651387…

| 知乎:www.zhihu.com/people/1024…

| GitHub:github.com/JiangXia-10…

本文大概13285字,读完共需36分钟

一、前言

我除了在运营掘金以外,还有一个博客和微信公众号,他们的地址在上方,有需要的同学可以看看,博客是我早期开始写的,主要记录一些在开发过程中遇到的问题以及怎么解决的,旨在帮助可能遇到同样问题的同学快速解决问题。昨天在写博客的时候,恰巧看到自己的博客文章浏览量较多的竟然是一个关于SSM(Spring、SpringMVC、Mybatis)的入门级文章,可能跟现在越来越多的人学习编程有关。所以在这里我记录一下使用IDEA整合SSM框架,以及期间可能会遇到的问题。之前也写过一篇IDEA和Eclipse整合SpringBoot的文章,需要的可以跳转:SpringBoot入门:使用IDEA和Eclipse构建第一个SpringBoot项目

先来说明这里我的环境和文件的版本号:

jdk使用的是jdk1.8:

图片

maven使用的是maven3.5.2版本:

图片

IDEA则使用的是2018.1版本的。

二、正文

在准备好上面的环境之后,开始正式的项目开发。

详细步骤如下:

一、创建项目

一、新建一个Maven webapp项目:在idea的菜单栏的file-->New-->Project-->Maven-->选择maven-archetype-webapp-->next;

图片

图片

图片

最后一个页面点击Finish,忘记截图了,第一次搭建可能会比较慢,如果配置了镜像仓库的话会快很多,关于配置淘宝镜像这个我在博客中记录过了,有需要的可以去看看。

创建完就是这样的了:

图片

有些人可能会跟我这里一样,src下没有java和resource文件夹,这里需要点击File-->project structure。

图片

图片

新建好java和resource文件夹后,右键分别选择sources和resource:

图片图片

图片

或者点击上面的mark as一样的意思:

图片

最后点击apply,然后点击ok。

二、配置文件

接下来配置pom.xml文件,将需要的包都导进来。我的pom文件如下:

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.xinyi</groupId>
  <artifactId>SSMDemp</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>SSMDemp Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <!-- 设置项目编码编码 -->
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <!-- spring版本号 -->
    <spring.version>4.3.5.RELEASE</spring.version>
    <!-- mybatis版本号 -->
    <mybatis.version>3.4.1</mybatis.version>
  </properties>

  <dependencies>

    <!-- java ee -->
    <dependency>
      <groupId>javax</groupId>
      <artifactId>javaee-api</artifactId>
      <version>7.0</version>
    </dependency>

    <!-- 单元测试 -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
    </dependency>

    <!-- 实现slf4j接口并整合 -->
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.2.2</version>
    </dependency>

    <!-- JSON -->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.8.7</version>
    </dependency>


    <!-- 数据库 -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.41</version>
      <scope>runtime</scope>
    </dependency>

    <!-- 数据库连接池 -->
    <dependency>
      <groupId>com.mchange</groupId>
      <artifactId>c3p0</artifactId>
      <version>0.9.5.2</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.3.1</version>
    </dependency>

    <!-- Spring -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</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-tx</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-webmvc</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>${spring.version}</version>
    </dependency>

  </dependencies>

  <build>
    <finalName>ChatRobot</finalName>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <!-- 设置JDK版本 -->
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
    </plugins>
  </build>

</project>

再写一个jdbc的配置文件,jdbc.properties:

数据库驱动--mysql:jdbc.driver=com.mysql.jdbc.Driver

数据库地址:jdbc.url=jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf8

数据库用户名:jdbc.username=root

数据库密码:jdbc.password=123456

设置最大连接数和最小:c3p0.maxPoolSize=30 c3p0.minPoolSize=10

设置关闭连接后不自动commit:c3p0.autoCommitOnClose=false

设置获取连接超时时间:c3p0.checkoutTimeout=10000

设置当获取连接失败重试次数:c3p0.acquireRetryAttempts=5

接下来配置mybatis的配置文件,spring-mybatis.xml:

扫描service包下所有使用注解的类型:

<context:component-scan base-package="service"/>

配置数据库相关参数properties的属性:${url}

<context:property-placeholder location="classpath:jdbc.properties"/>

数据库连接池配置:

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${jdbc.driver}"/>
        <property name="jdbcUrl" value="${jdbc.url}"/>
        <property name="user" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <property name="maxPoolSize" value="${c3p0.maxPoolSize}"/>
        <property name="minPoolSize" value="${c3p0.minPoolSize}"/>
        <property name="autoCommitOnClose" value="${c3p0.autoCommitOnClose}"/>
        <property name="checkoutTimeout" value="${c3p0.checkoutTimeout}"/>
        <property name="acquireRetryAttempts" value="${c3p0.acquireRetryAttempts}"/>
</bean>

配置SqlSessionFactory对象

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 注入数据库连接池 -->
        <property name="dataSource" ref="dataSource"/>
        <!-- 扫描bean包 使用别名 -->
        <property name="typeAliasesPackage" value="bean"/>
        <!-- 扫描sql配置文件:mapper需要的xml文件 -->
        <property name="mapperLocations" value="classpath:mapper/*.xml"/>
</bean>

配置扫描Dao接口包,动态实现Dao接口,注入到spring容器中

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <!-- 注入sqlSessionFactory -->
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    <!-- 给出需要扫描Dao接口包 -->
    <property name="basePackage" value="dao"/>
</bean>

配置事务管理器

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 注入数据库连接池 -->
        <property name="dataSource" ref="dataSource"/>
</bean>

配置基于注解的声明式事务

<tx:annotation-driven transaction-manager="transactionManager"/>

接着配置spring-mvc.xml文件,具体内容以及说明如下: 配置扫描web相关的bean

<context:component-scan base-package="controller"/>

开启SpringMVC注解模式:

<mvc:annotation-driven/>

静态资源默认servlet配置:

<mvc:default-servlet-handler/>

配置jsp 显示ViewResolver

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
        <property name="prefix" value="/WEB-INF/views/"/>
        <property name="suffix" value=".jsp"/>
</bean>

然后接着配置webapp\WEB-INF\web.xml路径下的web.xml文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
  <display-name>SSMDemo</display-name>

  <!-- 编码过滤器 -->
  <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>

  <!-- 配置DispatcherServlet -->
  <servlet>
    <servlet-name>SpringMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 配置springMVC需要加载的配置文件-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring-*.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 形式 -->
    <url-pattern>/</url-pattern>
  </servlet-mapping>

  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
  </welcome-file-list>

</web-app>

上面这些就是项目需要用到的配置文件,有些地方每个人是不一样的,所以如果直接替换的时候需要修改。

三、逻辑代码

这里我在数据库创建了一个user表,并插入数据。

建表语句:

CREATE TABLE `user` (
 `id` int(11NOT NULL AUTO_INCREMENT COMMENT 'ID',
 `email` varchar(255NOT NULL COMMENT '邮箱',
 `password` varchar(255NOT NULL COMMENT '密码',
 `username` varchar(255NOT NULL COMMENT '姓名',
 PRIMARY KEY (`id`),
 UNIQUE KEY `email` (`email`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

向表空中插入数据:

INSERT INTO `userVALUES ('1''1@qq.com''123456''张三');
INSERT INTO `userVALUES ('2''2@qq.com''234567''李四');
INSERT INTO `userVALUES ('3''3@qq.com''345678''王五');

查询结果如下:

图片

前面的都是一些准备的工作,后面开始正式些后台的代码。首先新建一个实体类,命名为,User,代码如下:

package bean;

public class User {

    private long id;
    private String email;
    private String password;
    private String username;


    public long getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

}

然后新建一个dao包并在dao包下新建一个接口,命名为UserDao,声明一个查询的方法,代码如下:

package dao;
import bean.User;

public interface UserDao {
    //根据d查询用户
    User selectUser(long id);
}

接着新建一个service包,然后在service包下新建一个userservice接口和UserServiceImpl类实现userservice接口,代码分别如下:

package service;

import bean.User;

public interface UserService {
    public User selectUser(long userId);
}
package service;

import bean.User;
import dao.UserDao;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
@Service("userService")
public class UserServiceImpl implements UserService{
    @Resource
    private UserDao userDao;

    public User selectUser(long Id) {

        return this.userDao.selectUser(Id);
    }
}

然后在resource文件夹下新建一个mapper文件夹,然后新建一个UserDao.xml映射文件,用来写具体的sql语句,为UserDao接口方法提供sql语句配置,文件内容如下:

<?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="dao.UserDao">
    <select id="selectUser" resultType="User" parameterType="long">
       SELECT * FROM user WHERE id = #{id}
   </select>
</mapper>

接着新建一个controller文件夹,新建一个usercontroller类,代码如下:

package controller;

import javax.servlet.http.HttpServletRequest;

import bean.User;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import service.UserService;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Controller
@RequestMapping("/user")
class UserController {

    @Resource
    private UserService userService;

    @RequestMapping("/hello.do")
    public void selectUser(HttpServletRequest request, HttpServletResponse response) throws IOException {
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        long userId = Long.parseLong(request.getParameter("id"));
        User user = this.userService.selectUser(userId);
        ObjectMapper mapper = new ObjectMapper();
        response.getWriter().write(mapper.writeValueAsString(user));
        response.getWriter().close();
    }

}

然后开始写前端页面,用来结果的展示。在webapp下新建一个index.html文件,代码如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>SSMDemo</title>
</head>
<script>
    //selectUser按钮的js功能代码
    function selectUser() {
        var xmlhttp = new XMLHttpRequest();
        xmlhttp.onreadystatechange = function () {
            if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
                document.getElementById("test").innerHTML = xmlhttp.responseText;
            }
        }
        xmlhttp.open("POST", "user/hello.do", true);
        xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        xmlhttp.send("id=2");
    }
</script>
<body>
<p id="test">Hello World</p>
<button type="button" onclick="selectUser()">查询用户</button>
</body>
</html>

接下来就进行测试,点击Edit Configurations配置运行环境,然后选择Tomcat Server-->Local,选择本地的tomcat服务器。

图片

图片

图片

图片

然后启动项目:

图片

项目启动后会自动打开页面

图片

点击查询用户按钮,则hello world被替换成数据库中id为2的用户数据:

图片

三、结尾

上面就是如何使用idea开发一个简单的SSM项目的完整步骤了,如果有不对的地方欢迎在下方留言交流指正。喜欢本文的话就在下面点个再看呗。

点击查看往期内容回顾

SpringBoot入门:SpringBoot整合Freemarker和Thymeleaf模板

SpringBoot入门:使用IDEA和Eclipse构建第一个SpringBoot项目

SpringBoot整合JPA进行数据访问

SpringBoot整合Druid配置数据源监控