配置一个最小单元的 SSM 整合

一、maven 坐标依赖配置

  1. <properties>
  2. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  3. <maven.compiler.source>1.8</maven.compiler.source>
  4. <maven.compiler.target>1.8</maven.compiler.target>
  5. <spring.version>5.2.5.RELEASE</spring.version>
  6. <slf4j.version>1.6.6</slf4j.version>
  7. <log4j.version>1.2.12</log4j.version>
  8. <mysql.version>5.1.10</mysql.version>
  9. <mybatis.version>3.5.5</mybatis.version>
  10. </properties>
  11. <!-- Spring AOP-->
  12. <dependencies>
  13. <dependency>
  14. <groupId>org.aspectj</groupId>
  15. <artifactId>aspectjweaver</artifactId>
  16. <version>1.7.4</version>
  17. </dependency>
  18. <dependency>
  19. <groupId>org.springframework</groupId>
  20. <artifactId>spring-aop</artifactId>
  21. <version>${spring.version}</version>
  22. </dependency>
  23. <!--AOP end-->
  24. <dependency>
  25. <groupId>org.springframework</groupId>
  26. <artifactId>spring-context</artifactId>
  27. <version>${spring.version}</version>
  28. </dependency>
  29. <dependency>
  30. <groupId>org.springframework</groupId>
  31. <artifactId>spring-webmvc</artifactId>
  32. <version>${spring.version}</version>
  33. </dependency>
  34. <!-- 单元的测试-->
  35. <dependency>
  36. <groupId>org.springframework</groupId>
  37. <artifactId>spring-test</artifactId>
  38. <version>${spring.version}</version>
  39. </dependency>
  40. <!-- tx 事物-->
  41. <dependency>
  42. <groupId>org.springframework</groupId>
  43. <artifactId>spring-tx</artifactId>
  44. <version>${spring.version}</version>
  45. </dependency>
  46. <dependency>
  47. <groupId>org.springframework</groupId>
  48. <artifactId>spring-jdbc</artifactId>
  49. <version>${spring.version}</version>
  50. </dependency>
  51. <!-- servlet -->
  52. <dependency>
  53. <groupId>javax.servlet</groupId>
  54. <artifactId>javax.servlet-api</artifactId>
  55. <version>3.1.0</version>
  56. <scope>provided</scope>
  57. </dependency>
  58. <!-- jsp 依赖-->
  59. <dependency>
  60. <groupId>javax.servlet.jsp</groupId>
  61. <artifactId>jsp-api</artifactId>
  62. <version>2.2</version>
  63. <scope>provided</scope>
  64. </dependency>
  65. <!-- 引入 jstl 1.2 库-->
  66. <dependency>
  67. <groupId>jstl</groupId>
  68. <artifactId>jstl</artifactId>
  69. <version>1.2</version>
  70. </dependency>
  71. <!-- mybatis -->
  72. <dependency>
  73. <groupId>org.mybatis</groupId>
  74. <artifactId>mybatis</artifactId>
  75. <version>${mybatis.version}</version>
  76. </dependency>
  77. <!-- MyBatis 的 Spring 依赖,有了这个,我们就不必单独编写 MyBatis 的配置文件了 -->
  78. <dependency>
  79. <groupId>org.mybatis</groupId>
  80. <artifactId>mybatis-spring</artifactId>
  81. <version>1.3.3</version>
  82. </dependency>
  83. <!-- 数据库连接池-->
  84. <dependency>
  85. <groupId>com.alibaba</groupId>
  86. <artifactId>druid</artifactId>
  87. <version>1.1.23</version>
  88. <scope>compile</scope>
  89. </dependency>
  90. <!-- mysql -->
  91. <dependency>
  92. <groupId>mysql</groupId>
  93. <artifactId>mysql-connector-java</artifactId>
  94. <version>${mysql.version}</version>
  95. </dependency>
  96. <!-- &lt;!&ndash; log日志 &ndash;&gt;-->
  97. <dependency>
  98. <groupId>log4j</groupId>
  99. <artifactId>log4j</artifactId>
  100. <version>${log4j.version}</version>
  101. </dependency>
  102. <dependency>
  103. <groupId>org.slf4j</groupId>
  104. <artifactId>slf4j-api</artifactId>
  105. <version>${slf4j.version}</version>
  106. </dependency>
  107. <dependency>
  108. <groupId>org.slf4j</groupId>
  109. <artifactId>slf4j-log4j12</artifactId>
  110. <version>${slf4j.version}</version>
  111. </dependency>
  112. <!-- log end-->
  113. <!-- JSON 处理 -->
  114. <dependency>
  115. <groupId>com.fasterxml.jackson.core</groupId>
  116. <artifactId>jackson-databind</artifactId>
  117. <version>2.10.5</version>
  118. </dependency>
  119. <dependency>
  120. <groupId>junit</groupId>
  121. <artifactId>junit</artifactId>
  122. <version>4.11</version>
  123. <scope>test</scope>
  124. </dependency>
  125. </dependencies>

二、数据库配置

  1. CREATE TABLE `account` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `name` varchar(20) COLLATE utf8_bin DEFAULT NULL,
  4. `money` double DEFAULT NULL,
  5. PRIMARY KEY (`id`)
  6. ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_bin

image.png

三、配置文件

3.1 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"
       xmlns:aop="http://www.springframework.org/schema/aop"
       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 http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">

    <!--        开启注解扫描, 希望处理 service 和 dao,controller 不需要 spring 去处理-->
    <context:component-scan base-package="cn.gorit">
        <!-- 配置哪些注解不扫描-->
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

   <!--    配置连接池-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <!-- 必须配置 Spring-JDBC 不然就运行不了 -->
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/ssm?characterEncoding=utf8" />
        <property name="username" value="root"/>
        <property name="password" value="root"/>
    </bean>

    <!--    配置 SqlSessionFactor 工厂-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--dataSource属性指定要用到的连接池-->
        <property name="dataSource" ref="dataSource"/>
        <!-- 扫描sql配置文件:mapper需要的xml文件 -->
        <property name="mapperLocations" value="classpath:./mapper/*.xml"/>

    </bean>

    <!-- 配置扫描Dao接口包,动态实现Dao接口,注入到spring容器中 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 给出需要扫描Dao接口包 -->
        <property name="basePackage" value="cn.gorit.mapper"/>
        <!-- 注入sqlSessionFactory -->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    </bean>

</beans>

3.2 springmvc.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">

    <!--开启注解扫描,只扫描 Controller 注解-->
    <context:component-scan base-package="cn.gorit">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <!--    开启SpringMvc 的注解支持-->
    <mvc:annotation-driven/>

    <!-- 静态资源默认servlet配置 -->
    <mvc:default-servlet-handler/>
</beans>

3.3 log4j.properties

log4j.rootLogger=INFO,stdout,debug,error

#\u8F93\u51FA\u5230\u63A7\u5236\u53F0
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{yyyy-MM-dd HH:mm:ss,SSS} %p [%t] %C.%M(%L) | %m%n

#\u8F93\u51FADEBUG\u7EA7\u522B\u4EE5\u4E0A\u7684\u65E5\u5FD7\u5230\u6587\u4EF6
log4j.appender.debug=org.apache.log4j.DailyRollingFileAppender
log4j.appender.debug.layout=org.apache.log4j.PatternLayout
log4j.appender.debug.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %p [%t] %C.%M(%L) | %m%n
log4j.appender.debug.File=./logs/debug.txt
log4j.appender.debug.DatePattern=','yyyy-MM-dd
log4j.appender.debug.Threshold=DEBUG
log4j.appender.debug.Append=true
log4j.appender.debug.Encoding=UTF-8

#\u8F93\u51FADEBUG\u7EA7\u522B\u4EE5\u4E0A\u7684\u65E5\u5FD7\u5230\u6587\u4EF6
log4j.appender.error=org.apache.log4j.DailyRollingFileAppender
log4j.appender.error.layout=org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %p [%t] %C.%M(%L) | %m%n
log4j.appender.error.File=./logs/error.txt
log4j.appender.error.DatePattern=','yyyy-MM-dd
log4j.appender.error.Threshold=ERROR
log4j.appender.error.Append=true
log4j.appender.error.Encoding=UTF-8


 ###\u663E\u793ASQL\u8BED\u53E5\u90E8\u5206
log4j.logger.com.chiasoft.dao.StudentDao=console

3.4 mybatis-config.xml

数据库连接交给 Spring 管理了,所以这里什么都不用配置

<?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>
<!--    <settings>-->
<!--        <setting name="logImpl" value="STDOUT_LOGGING"/>-->
<!--        <setting name="useGeneratedKeys" value="true"/>-->
<!--    </settings>-->
</configuration>

3.5 编写 AccountMapper.xml 配置文件

在 Resources 目录下创建一个 mapper 的文件夹,然后在里面放入 AccountMapper.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="cn.gorit.mapper.AccountMapper">

    <sql id="s1">
        select * from account
    </sql>

    <select id="findAll" resultType="cn.gorit.entity.Account">
        <include refid="s1"/>
    </select>
</mapper>

四、Bean 编写

4.1 controller类编写

package cn.gorit.controller;

import cn.gorit.mapper.AccountMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@RestController
public class HelloController {

    @Autowired
    AccountMapper mapper;

    @RequestMapping("/index")
    public Map<String,Object> index() {
        Map<String,Object> map = new HashMap<>();
        map.put("code",200);
        map.put("msg","请求成功");
        map.put("data",new Date());
        return map;
    }

    @RequestMapping("/account")
    public Map<String,Object> findAllAccount() {
        Map<String,Object> map = new HashMap<>();
        map.put("code",200);
        map.put("msg","请求成功");
        map.put("data",mapper.findAll());
        return map;
    }
}

4.2 实体类编写

package cn.gorit.entity;

import java.io.Serializable;

public class Account implements Serializable {

    private Integer id;
    private String name;
    private double money;

    public Account(Integer id, String name, double money) {
        this.id = id;
        this.name = name;
        this.money = money;
    }

    public Integer getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }

    @Override
    public String toString() {
        return "Account{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", money=" + money +
                '}';
    }
}

4.3 AccountMapper 接口

package cn.gorit.mapper;

import cn.gorit.entity.Account;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;

import java.util.List;

@Mapper
@Repository
public interface AccountMapper {

    // 查询所有账户信息
    List<Account> findAll();

    @Select("select * from account where id = #{id}")
    Account selectAccountById(int id);
}

五、运行效果

image.png

image.png
image.png