SSM的簡易整合,基於RESTful風格


1、整合前言

本文是一個簡單的SSM整合案例,基於RESTful風格,主要是簡單記錄一下學習筆記。

開發的相關環境:

  • JDK:1.8
  • Spring:5.2.7.RELEASE
  • Mybatis:3.5.3
  • MySQL數據庫
  • Druid連接池

數據庫源文件:

-- ----------------------------
-- Table structure for t_emp
-- ----------------------------
DROP TABLE IF EXISTS `t_emp`;
CREATE TABLE `t_emp`  (
  `emp_id` int(11) NOT NULL AUTO_INCREMENT,
  `emp_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `emp_salary` double(10, 2) NULL DEFAULT NULL,
  `emp_address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`emp_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of t_emp
-- ----------------------------
INSERT INTO `t_emp` VALUES (1, '張三', 13000.00, '廣東深圳南山區');
INSERT INTO `t_emp` VALUES (2, '李四', 6000.00, '山東菏澤曹縣');
INSERT INTO `t_emp` VALUES (3, '趙六', 10000.00, '上海浦東區');

導入相關的依賴:

    <!--定義版本信息-->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <junit.version>4.12</junit.version>
        <spring.version>5.2.7.RELEASE</spring.version>
        <mybatis.version>3.5.3</mybatis.version>
        <mybatis.spring.version>2.0.6</mybatis.spring.version>
        <mybatis.generator.version>1.4.0</mybatis.generator.version>
        <log4j.version>1.2.17</log4j.version>
        <mysql.version>8.0.23</mysql.version>
        <druid.version>1.2.4</druid.version>
    </properties>

    <dependencies>
        <!--Spring相關依賴-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</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-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-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-aop</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.6</version>
        </dependency>
        <!--Mybatis相關依賴-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>${mybatis.version}</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>${mybatis.spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>${mybatis.generator.version}</version>
        </dependency>
        <!--數據庫相關依賴-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>${druid.version}</version>
        </dependency>
        <!--日志相關依賴-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>${log4j.version}</version>
        </dependency>
        <!--單元測試依賴-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
        </dependency>
        <!--處理json數據的依賴-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.5</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.9.5</version>
        </dependency>
    </dependencies>

2、相關的配置文件

注:配置文件都放在maven項目的resources目錄下。

連接數據庫的文件(db.properties):

datasource.driver-class-name=com.mysql.cj.jdbc.Driver
datasource.url=jdbc:mysql://localhost:3306/ssm?useSSL=false&serverTimezone=UTC&characterEncoding=utf8&allowMultiQueries=true
datasource.username=root
datasource.password=root

Spring的核心xml配置文件(applicationContext.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: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/context
       https://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/tx
       http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!-- ================一、連接數據庫================ -->
    <!--1、引入外部資源文件-->
    <context:property-placeholder location="classpath:db.properties"/>

    <!--2、配置數據源-->
    <bean class="com.alibaba.druid.pool.DruidDataSource" id="dataSource">
        <property name="driverClassName" value="${datasource.driver-class-name}"/>
        <property name="url" value="${datasource.url}"/>
        <property name="username" value="${datasource.username}"/>
        <property name="password" value="${datasource.password}"/>
    </bean>

    <!-- ===================二、整合Mybatis==================== -->
    <!-- 1.配置SqlSessionFactory -->
    <bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactory">

        <!-- 裝配數據源 -->
        <property name="dataSource" ref="dataSource"/>

        <!-- 配置Mybatis全局配置的兩個方案只能二選一 -->
        <!-- (1)、配置Mybatis全局配置方案一:還是在Mybatis自己的配置文件中配,在Spring中指定配置文件位置 -->
        <!-- Mybatis全局配置文件的位置使用configLocation指定 <property name="configLocation" value=""/> -->
        <!-- (2)、配置Mybatis全局配置方案二(推薦):在Spring配置文件配置 -->
        <!-- 在Spring中執行Mybatis全局配置 -->
        <property name="configuration">
            <bean class="org.apache.ibatis.session.Configuration">
                <property name="mapUnderscoreToCamelCase" value="true"/><!--駝峰原則-->
                <property name="logImpl" value="org.apache.ibatis.logging.stdout.StdOutImpl"/><!--打印SQL-->
            </bean>
        </property>
        <!-- 配置別名,使用包掃描-->
        <property name="typeAliasesPackage" value="com.thr.entity"/>
        <!-- 指定Mapper配置文件的位置XxxMapper.xml -->
        <property name="mapperLocations" value="classpath:com/thr/mapper/*Mapper.xml"/>
    </bean>

    <!-- 2.對Mapper接口所在的包進行掃描 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer" id="mapperScannerConfigurer">
        <!-- 指定Mybatis中存放Mapper接口的包 -->
        <property name="basePackage" value="com.thr.mapper"/>
        <!-- 可選,如果不寫,Spring啟動時候。容器中自動會按照類型去把SqlSessionFactory對象注入進來 -->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    </bean>

    <!-- ===================三、配置聲明式事務==================== -->
    <!-- 1.配置事務管理器的bean -->
    <bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <!-- 2.開啟基於注解的聲明式事務 -->
    <tx:annotation-driven/>
    <!-- 3.配置自動掃描的包 -->
    <context:component-scan base-package="com.thr.service"/>
</beans>

SpringMVC相關的xml配置文件(spring-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:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/mvc
       https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- 配置自動掃描的包 -->
    <context:component-scan base-package="com.thr.controller"/>

    <!-- 配置視圖解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="viewResolver">
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <!-- 配置default-servlet-handler將沒有映射的請求放行 -->
    <mvc:default-servlet-handler/>
    <!-- 開啟SpringMVC的注解驅動功能(標配) -->
    <mvc:annotation-driven/>
</beans>

日志的配置(log4j.properties):

# 全局日志配置 INFO DEBUG ERROR
log4j.rootLogger=INFO, stdout
# MyBatis 日志配置
log4j.logger.cn.kgc.kb09=TRACE
# 控制台輸出
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%ns

3、Mybatis逆向工程生成代碼

逆向工程的配置文件(generatorConfig.xml):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>

    <!--targetRuntime="MyBatis3Simple"表示生成簡易版本,這里創建原始版本,參數為MyBatis3-->
    <context id="DB2Tables" targetRuntime="MyBatis3">
        <commentGenerator>
            <!-- 是否去除自動生成的注釋,true:是;false:否 -->
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>
        <!--數據庫連接的信息:驅動類、連接地址、用戶名、密碼 -->
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/ssm?useUnicode=true&amp;characterEncoding=utf8&amp;
                        useSSL=false&amp;serverTimezone=GMT%2B8"
                        userId="root"
                        password="root">
        </jdbcConnection>
        <!-- 默認false,把JDBC DECIMAL和NUMERIC類型解析為Integer,為true時把JDBC DECIMAL 和
            NUMERIC 類型解析為java.math.BigDecimal -->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

        <!-- javaBean的生成策略,targetProject:POJO類生成的位置,注意要加上項目名稱,在這里搞了好久 -->
        <javaModelGenerator targetPackage="com.thr.entity" targetProject="./ssm/src/main/java">
            <!-- enableSubPackages:是否讓schema作為包的后綴 -->
            <property name="enableSubPackages" value="true"/>
            <!-- 從數據庫返回的值被清理前后的空格 -->
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>
        <!-- SQL映射文件的生成策略,targetProject:mapper映射文件生成的位置 -->
        <sqlMapGenerator targetPackage="com.thr.mapper" targetProject="./ssm/src/main/resources">
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>
        <!-- Mapper接口的生成策略,targetPackage:mapper接口生成的位置 -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.thr.mapper" targetProject="./ssm/src/main/java">
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>

        <!-- 配置表信息 -->
        <!-- schema即為數據庫名 tableName為對應的數據庫表 domainObjectName是要生成的實體類 enableByExample是否生成example類   -->
        <table schema="ssm" tableName="t_emp" domainObjectName="Employee"/>
    </context>
</generatorConfiguration>

逆向工程生成相關代碼的啟動類:

/**
 * 逆向工程核心生成代碼
 */
public class GeneratorSql {
    public static void main(String[] args) throws Exception {
        List<String> warnings = new ArrayList<String>();
        boolean overwrite = true;
        // 指定逆向工程配置文件
        String file = GeneratorSql.class.getResource("/generatorConfig.xml").getFile();
        File configFile = new File(file);
        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = cp.parseConfiguration(configFile);
        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
        myBatisGenerator.generate(null);
    }
}

執行后會生成如下相關的代碼。

image


4、業務層(Service)和控制層(Controller)

編寫Service接口(EmployeeService):

public interface EmployeeService {

    List<Employee> findAll();

    Employee findById(Integer id);

    void add(Employee employee);

    void update(Employee employee);

    void delete(Integer id);
}

編寫Service接口的實現類(EmployeeServiceImpl):

@Service
@Transactional
public class EmployeeServiceImpl implements EmployeeService {

    @Autowired
    private EmployeeMapper employeeMapper;

    @Override
    public List<Employee> findAll() {
        return employeeMapper.selectByExample(new EmployeeExample());
    }

    @Override
    public Employee findById(Integer id) {
        return employeeMapper.selectByPrimaryKey(id);
    }

    @Override
    public void add(Employee employee) {
        employeeMapper.insert(employee);
    }

    @Override
    public void update(Employee employee) {
        employeeMapper.updateByPrimaryKey(employee);
    }

    @Override
    public void delete(Integer id) {
        employeeMapper.deleteByPrimaryKey(id);
    }
}

編寫控制層Controller代碼(EmployeeController):

@RestController
public class EmployeeController {

    @Autowired
    private EmployeeService employeeService;

    /**
     * 查詢所有員工信息
     * @return
     */
    @GetMapping("/emp")
    public List<Employee> findAll(){
        List<Employee> list = employeeService.findAll();
        System.out.println(list);
        return list;
    }

    /**
     * 根據ID查詢
     * @param id
     * @return
     */
    @GetMapping("/emp/{id}")
    public Employee findById(@PathVariable("id") Integer id){
        return employeeService.findById(id);
    }

    /**
     * 添加
     * @param employee
     */
    @PostMapping("/emp")
    public void add(Employee employee){
        employeeService.add(employee);
    }

    /**
     * 修改,這里接收前端發來的JSON格式的數據
     * @param employee
     */
    @PutMapping("/emp")
    public void update(@RequestBody Employee employee){
        employeeService.update(employee);
    }

    /**
     * 刪除數據
     * @param id
     */
    @DeleteMapping("/emp/{id}")
    public void delete(@PathVariable("id") Integer id){
        employeeService.delete(id);
    }
}

5、測試整合結果

[1]、查詢所有數據(GET請求):http://localhost:8080/ssm/emp/

image


[2]、根據ID查詢數據(GET請求):http://localhost:8080/ssm/emp/1

image


[3]、添加員工信息(POST請求):http://localhost:8080/ssm/emp

image

對PostMan的Body中的四個選項進行簡單說明:

  • form-data:等價於http請求中的multipart/form-data,可以上傳文件或者鍵值對,最后都會轉化為一條消息,一般用來做文件的上傳。
  • x-www-form-urlencoded:相當於http請求中的application/x-www-from-urlencoded,只能上傳鍵值對,相當於將表單內的數據轉換為Key-Value。
  • raw:表示的參數可以是任意格式的,可以上傳text、json、xml、html等。
  • binary:相當於Content-Type:application/octet-stream,只可以上傳二進制數據,通常用來上傳文件,但是一次只能上傳一個文件。

添加后的數據庫變化:

image


[4]、修改數據(PUT請求):http://localhost:8080/ssm/emp ,這里發送的json格式的數據,因為PUT請求用key--value不好測試。

image

修改后的數據庫變化:

image


[1]、刪除數據(DELETE請求):http://localhost:8080/ssm/emp/4

image

image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM