SMM框架 基础简单的SSM搭建过程

版权声明:作者: 阿顾, 转载请写明出处, 谢谢 https://blog.csdn.net/u010452388/article/details/81079891

各位童鞋,本文主要搭建SSM框架(Spring,SpringMVC,MyBatic),希望能帮助到刚刚学习这些框架的小伙伴,以及能够直接上手实现业务,代码中都做了详细的说明。废话不多说,下面直接进入主题(文末会附上源码地址

目录

一 创建Maven项目

二 配置文件

2.1 配置mybatis-config.xml

2.2 配置mapper.xml

2.3 配置jdbc.properties

2.4 配置applicationContext.xml

2.5 配置springmvc-servlet.xml

2.6 配置web.xml

2.7 配置log4j.properties

2.8 引入依赖

三 测试

3.1 创建java文件

3.1.1 UserController类

3.1.2 User实体类

3.1.3 UserService接口 

3.1.4 UserServiceImpl实现类

3.1.5 UserMapper类

3.2 创建MySql数据库表

3.3 创建users.jsp文件

3.4 结果

 四 源码下载地址

 


一 创建Maven项目

博主这里用的是IDEA创建的项目,和Eclipse的结构都差不多,下图是SSM搭建的整体结构图

二 配置文件

这里需要的配置文件主要有1.mybatis-config.xml  2.mapper.xml  3.jdbc.properties  4.applicationContext.xml  5.springmvc-servlet.xml  6.web.xml

2.1 配置mybatis-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--开启驼峰命名自动转换
    一般数据库命名规则一般是user_name,而我们实体类中一般使用userName,开启后就可以自动映射了
    -->
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"></setting>
    </settings>
</configuration>

2.2 配置mapper.xml

这里博主就配置了一个UserMapper,童鞋们,你们可以根据功能的模块需求,自己可以在/resources/mybatis/mapper文件夹下添加添加其他的模块,例如:添加一个订单模块的话,加一个OrderMapper.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.agu.mapper.UserMapper">
<!--id的值:要和接口UserMapper下的方法名一致
resultType:1.要和方法返回值类型一样,或者是返回值类型的集合
           2.原本需要写返回值类型的权限定名路径,但是我们在applicationContext里配置了别名所属的包
           所以只要写类名即可     -->
    <select id="findAllUsers" resultType="User">
		select * from tb_user
	</select>
</mapper>

2.3 配置jdbc.properties

小伙伴们,博主这里用的mysql数据库,这里配置的时候,注意要把第二行改成你们自己的数据库名,以及用户名和密码都要改成你们自己的用户名和密码(注意:后面千万不能加空格,之前博主配置的时候无意中多加了个空格,找了半天错误

jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=123

2.4 配置applicationContext.xml

applicationContext配置文件项目启动的时候就要加载了,所以我们要把数据源,事务,切面和一些配置文件引入进来,主要结构有:

1.引入jdbc.properties配置文件位置

2.数据源dataSource

3.引入mybatis-config.xml文件位置

4.引入mapper.xml文件位置

5.事务管理器

6.切面配置

<?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:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!-- 引入外部的属性资源文件,把我们刚刚配置的jdbc配置文件引入进来 -->
    <context:property-placeholder location="classpath:jdbc.properties"/>
    <!-- 扫包,只需要扫service的即可,Controller的包springMVC会扫描,mapper层的,下面类会帮我们扫描 -->
    <context:component-scan base-package="com.agu.service"></context:component-scan>
    <!-- 使用专门扫描mapper接口的类 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.agu.mapper"></property>
    </bean>

    <!-- 配置数据源 ,这里了用的是阿里巴巴的德鲁伊数据源-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${jdbc.driverClass}"></property>
        <property name="url" value="${jdbc.url}"></property>
        <property name="username" value="${jdbc.username}"></property>
        <property name="password" value="${jdbc.password}"></property>
    </bean>
    <!--sqlSession工厂,我们对数据库增删改查就靠他-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 注入配置的数据源 -->
        <property name="dataSource" ref="dataSource"></property>
        <!-- 注入mybatis-config配置文件 -->
        <property name="configLocation" value="classpath:mybatis/mybatis-config.xml"></property>
        <!-- 注入mapper.xml文件位置,
        这里的/**/*.xml写法,只要是/mybatis/mapper下的都可以注入进来,哪怕里面又加了几个文件夹-->
        <property name="MapperLocations" value="classpath:mybatis/mapper/**/*.xml"></property>
        <!-- 配置别名所属的包名,配置了这个,我们UserMapper.xml文件下的resultType就只需要写类名即可-->
        <property name="typeAliasesPackage" value="com.agu.domain"></property>
    </bean>


    <!-- 配置事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    <!-- 配置事务属性 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <!--配置事务的属性,如果方法名是find开头,只允许查询业务,不允许增删改业务,
            这样可以防错,如果写了删除或者增加功能,则会抛出异常,提醒开发人员-->
            <tx:method name="find*" read-only="true"/>
            <!--其他方法做增删改功能-->
            <tx:method name="*"/>
        </tx:attributes>
    </tx:advice>
    <!-- 配置切面
    配置了事务后,我们肯定要告诉spring,哪些方法需要加上事务 -->
    <aop:config>
        <!--配置切点-->
        <aop:pointcut expression="execution(* com.agu.service.impl.*.*(..))" id="pointcut"/>
        <!--将advice注入程序中pointcut位置的代码-->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/>
    </aop:config>
</beans>

2.5 配置springmvc-servlet.xml

此配置文件主要配置了controller扫描,注解驱动,视图解析器,处理静态资源

<?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">
    <!-- 开启注解扫描,扫描controller包 -->
    <context:component-scan base-package="com.agu.controller"></context:component-scan>

    <!-- mvc注解驱动 -->
    <mvc:annotation-driven></mvc:annotation-driven>

    <!-- 配置springMVC视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--有时我们需要将数据响应到某个页面,例如响应到/jsp/users.jsp,controller只需要返回"users"-->
        <!--url路径的前缀-->
        <property name="prefix" value="/WEB-INF/jsp/"></property>
        <!--url路径的后缀-->
        <property name="suffix" value=".jsp"></property>
    </bean>

    <!-- 处理静态资源拦截问题,如果是静态资源的请求,则默认服务器的servlet处理,
     如果不是,则交给DispatcherServlet处理-->
    <mvc:default-servlet-handler/>
</beans>

2.6 配置web.xml

此配置文件主要是加载之前配置的springmvc-servlet.xml文件和applicationContext.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">

    <!-- 配置字节码过滤器 -->
    <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>

    <!-- 指定spring配置文件名 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/applicationContext.xml</param-value>
    </context-param>
    <!-- 工程启动时,创建IOC容器 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!-- springmvc入口 -->
    <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/springmvc-servlet.xml</param-value>
        </init-param>
        <!--项目启动时,就加载此servlet  -->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <!-- 拦截除了jsp以外的所有请求(不是/*) -->
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

2.7 配置log4j.properties

此配置文件主要针对异常问题进行定位

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=d:/mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### set log levels - for more verbose logging change 'info' to 'debug' ###

log4j.rootLogger=debug, stdout

2.8 引入依赖

在pom.xml文件下添加下这些依赖即可

<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.agu</groupId>
    <artifactId>SSMDemo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>


    <dependencies>
        <!--spring-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.3.13.RELEASE</version>
        </dependency>
        <!--配置webmvc-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.3.13.RELEASE</version>
        </dependency>
        <!--配置spring jdbc,用来加载DataSourceTransactionManager-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>4.3.13.RELEASE</version>
        </dependency>
        <!--配置切面的jar包-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>4.3.13.RELEASE</version>
        </dependency>
        <!--mybatis,用来加载SqlSessionFactoryBean和MapperScannerConfigurer-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.2.8</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.2.2</version>
        </dependency>
        <!--数据库驱动包-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.32</version>
        </dependency>
        <!--日志文件-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.22</version>
        </dependency>

        <!--json处理工具包-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.0</version>
        </dependency>
        <!-- 连接池,用来加载DruidDataSource-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.9</version>
        </dependency>
        <!--javaScript标签库-->
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.0</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <!-- 配置Tomcat插件 -->
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <configuration>
                    <port>8080</port>
                    <path>/</path>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

三 测试

测试之前先要添加java文件,创建mysql数据库,以及创建jsp页面

3.1 创建java文件

3.1.1 UserController类

package com.agu.controller;

import java.util.List;
import com.agu.domain.User;
import com.agu.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("user")
public class UserController {
	
	@Autowired
	private UserService userService;
	
	@RequestMapping("list")
	public String test1(Model model) {
		List<User> users = userService.findAllUsers();
		model.addAttribute("userList", users);
		return "users";
	}
}

3.1.2 User实体类

package com.agu.domain;

import java.io.Serializable;
import java.util.Date;

import org.springframework.format.annotation.DateTimeFormat;

public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    private Long id;

    // 用户名
    private String userName;

    // 密码
    private String password;

    // 姓名
    private String name;

    // 年龄
    private Integer age;

    // 性别,1男性,2女性
    private Integer sex;

    // 出生日期
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date birthday;

    // 创建时间
    private Date created;

    // 更新时间
    private Date updated;

    public Long getId() {
        return id;
    }

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

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Integer getSex() {
        return sex;
    }

    public void setSex(Integer sex) {
        this.sex = sex;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public Date getCreated() {
        return created;
    }

    public void setCreated(Date created) {
        this.created = created;
    }

    public Date getUpdated() {
        return updated;
    }

    public void setUpdated(Date updated) {
        this.updated = updated;
    }

    @Override
    public String toString() {
        return "User [id=" + id + ", userName=" + userName + ", password=" + password + ", name=" + name
                + ", age=" + age + ", sex=" + sex + ", birthday=" + birthday + ", created=" + created
                + ", updated=" + updated + "]";
    }

}

3.1.3 UserService接口 

package com.agu.service;


import com.agu.domain.User;

import java.util.List;

public interface UserService {
	/**
	 * 查询所有用户信息
	 * @return
	 */
	public List<User> findAllUsers();

	
}

3.1.4 UserServiceImpl实现类

package com.agu.service.impl;

import com.agu.domain.User;
import com.agu.mapper.UserMapper;
import com.agu.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserServiceImpl implements UserService {

	@Autowired
	private UserMapper userMapper;

	@Override
	public List<User> findAllUsers() {
		List<User> list = userMapper.findAllUsers();
		return list;
	}

}

3.1.5 UserMapper类

package com.agu.mapper;

import java.util.List;

import com.agu.domain.User;

public interface UserMapper {
	
	public List<User> findAllUsers();

}

3.2 创建MySql数据库表

/*
Navicat MySQL Data Transfer

Source Server         : localhost_3306
Source Server Version : 50527
Source Host           : localhost:3306
Source Database       : mybatis

Target Server Type    : MYSQL
Target Server Version : 50527
File Encoding         : 65001

Date: 2018-07-17 16:28:28
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for tb_user
-- ----------------------------
DROP TABLE IF EXISTS `tb_user`;
CREATE TABLE `tb_user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `user_name` varchar(100) DEFAULT NULL COMMENT '用户名',
  `password` varchar(100) DEFAULT NULL COMMENT '密码',
  `name` varchar(100) DEFAULT NULL COMMENT '姓名',
  `age` int(10) DEFAULT NULL COMMENT '年龄',
  `sex` tinyint(1) DEFAULT NULL COMMENT '性别,1男性,2女性',
  `birthday` date DEFAULT NULL COMMENT '出生日期',
  `created` datetime DEFAULT NULL COMMENT '创建时间',
  `updated` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `username` (`user_name`)
) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of tb_user
-- ----------------------------
INSERT INTO `tb_user` VALUES ('1', 'zhangsan', '123456', '张三', '30', '1', '1984-08-08', '2014-09-19 16:56:04', '2014-09-21 11:24:59');
INSERT INTO `tb_user` VALUES ('2', 'lisi', '123456', '李四', '21', '2', '1991-01-01', '2014-09-19 16:56:04', '2014-09-19 16:56:04');
INSERT INTO `tb_user` VALUES ('3', 'wangwu', '123456', '王五', '22', '2', '1989-01-01', '2014-09-19 16:56:04', '2014-09-19 16:56:04');
INSERT INTO `tb_user` VALUES ('4', 'zhangwei', '123456', '张伟', '20', '1', '1988-09-01', '2014-09-19 16:56:04', '2014-09-19 16:56:04');
INSERT INTO `tb_user` VALUES ('5', 'lina', '123456', '李娜', '28', '1', '1985-01-01', '2014-09-19 16:56:04', '2014-09-19 16:56:04');
INSERT INTO `tb_user` VALUES ('6', 'lilei', '123456', '李磊', '23', '1', '1988-08-08', '2014-09-20 11:41:15', '2014-09-20 11:41:15');
INSERT INTO `tb_user` VALUES ('8', 'xiaofeng', '123456', '萧峰', '30', '1', '2018-06-25', '2018-06-25 18:42:25', '2018-06-25 18:42:25');
INSERT INTO `tb_user` VALUES ('12', 'zhendeshuai', '565656', '吴彦祖', '26', '1', '2018-06-26', '2018-06-26 14:55:59', '2018-06-26 15:12:12');
INSERT INTO `tb_user` VALUES ('14', 'jiumozhi', '123456', '鸠摩智', '30', '1', '2018-06-26', '2018-06-26 23:53:15', '2018-06-26 23:53:15');
INSERT INTO `tb_user` VALUES ('21', 'zhangsan1234', '12345', '杰克', '20', '1', '2000-01-01', '2018-07-07 21:50:26', '2018-07-07 21:50:26');
INSERT INTO `tb_user` VALUES ('22', 'zhangsanqwe1', '123455', '张三', '30', '1', '1999-02-25', '2018-07-07 21:51:20', '2018-07-07 21:51:20');

3.3 创建users.jsp文件

<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    <link rel="stylesheet" type="text/css" href="/css/user.css"/>
</head>
<body>
<table id="customers" border="1px">
    <tr>
        <th>编号</th>
        <th>用户名</th>
        <th>姓名</th>
        <th>年龄</th>
        <th>性别</th>
        <th>出生日期</th>
        <th>创建时间</th>
        <th>更新时间</th>
    </tr>
    <c:forEach items="${userList}" var="user">
        <tr>
            <td>${user.id}</td>
            <td>${user.userName}</td>
            <td>${user.name}</td>
            <td>${user.age}</td>
            <td>
                <c:choose>
                    <c:when test="${user.sex==1}">男</c:when>
                    <c:otherwise>女</c:otherwise>
                </c:choose>
            </td>
            <td>
                <fmt:formatDate value="${user.birthday}" pattern="yyyy-MM-dd"/>
            </td>
            <td>
                <fmt:formatDate value="${user.created}" pattern="yyyy-MM-dd HH:mm:ss"/>
            </td>
            <td>
                <fmt:formatDate value="${user.updated}" pattern="yyyy-MM-dd HH:mm:ss"/>
            </td>
        </tr>
    </c:forEach>
</table>
</body>
</html>

3.4 结果

上面文件配置好了之后,可以直接用tomcat服务器启动,启动后的结果如下:

 四 源码下载地址

百度网盘:https://pan.baidu.com/s/133xngfk83-SDb6tzDJGujw

密码:uref

如果觉得文章不错,还请帮忙点下"赞",各位的支持,能鼓励我更大的写作热情。谢谢!

 

我用的是IDEA开发工具,每个工具的配置

猜你喜欢

转载自blog.csdn.net/u010452388/article/details/81079891