原生SSM整合(Spring+SpringMVC+MyBatis)案例

发布时间:2024年01月18日

SSM框架是Spring、Spring MVC和MyBatis三个开源框架的整合,常用于构建数据源较简单的web项目。该框架是Java EE企业级开发的主流技术,也是每一个java开发者必备的技能。下面通过查询书籍列表的案例演示SSM整合的过程.

新建项目

创建文件目录

完整文件结构

引入依赖?

  <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>
        <!--spring和springMVC环境依赖-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.2.18.RELEASE</version>
        </dependency>
        <!--servlet依赖-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <!--spring事务管理依赖-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.2.18.RELEASE</version>
        </dependency>
        <!--mybatis依赖-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.6</version>
        </dependency>
        <!--spring整合mybatis依赖-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.6</version>
        </dependency>
        <!--spring整合数据源依赖-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.6</version>
        </dependency>
        <!--mysql数据库连接-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.38</version>
        </dependency>
        <!--spring整合Junit依赖-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.2.18.RELEASE</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <!--lombok插件-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.10</version>
        </dependency>
        <!--日志支持-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.0</version>
        </dependency>

创建数据库表

jdbc属性文件

在resources目录下的props包中创建jdbc.properties文件

jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf-8&useSSL=false
jdbc.username=root
jdbc.password=mysqlpass

创建配置类

jdbcConfig

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

import javax.sql.DataSource;
@Configuration
//加载资源路径
@PropertySource("classpath:props/jdbc.properties")
public class JdbcConfig {
    @Value("${jdbc.driverClass}")
    private String driverClass;
    @Value("${jdbc.username}")
    private String username;
    @Value("${jdbc.password}")
    private String password;
    @Value("${jdbc.url}")
    private String url;
    
    /**配置Druid数据源*/
    /**@Bean将返回的dataSource标识为被Spring管理的bean对象*/
    @Bean
    public DataSource dataSource(){
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driverClass);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        dataSource.setUrl(url);
        return dataSource;
    }
}

MyBatisConfig

import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;

import javax.sql.DataSource;
import java.io.IOException;

@Configuration
@Import(JdbcConfig.class)
public class MyBatisConfig {
    @Bean
    public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource) throws IOException {
        SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
        sessionFactoryBean.setDataSource(dataSource);
        //加载全局配置文件
       Resource configResource = new ClassPathResource("mybatis/mybatis-config.xml");
       sessionFactoryBean.setConfigLocation(configResource);
       //映射文件加载
        ResourcePatternResolver resourceResolver= new PathMatchingResourcePatternResolver();
        sessionFactoryBean.setMapperLocations(resourceResolver.getResources("classpath*:mybatis/mapper/*Mapper.xml"));
        return sessionFactoryBean;
    }
    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer(){
        MapperScannerConfigurer scannerConfigurer = new MapperScannerConfigurer();
        //扫描mapper接口所在的包
        scannerConfigurer.setBasePackage("com.yaorange.ssm.mapper");
        return scannerConfigurer;
    }
}

SpringConfig



import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.sql.DataSource;

@Configuration
//扫描业务类实现类所在的包
@ComponentScan("com.yaorange.ssm.service.impl")
//加载MyBatisConfig和JdbcConfig配置类的字节码文件
@Import({MyBatisConfig.class, JdbcConfig.class})
//开启事务管理器
@EnableTransactionManagement
public class SpringConfig {
    @Bean
    /**配置事务管理器*/
    public PlatformTransactionManager transactionManager(DataSource dataSource){
        DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
        transactionManager.setDataSource(dataSource);
        return transactionManager;
    }
}

SpringMvcConfig

@Configuration
//扫描controller所在的包
@ComponentScan("com.yaorange.ssm.controller")
@EnableWebMvc
public class SpringMvcConfig {
}

ServletConfig配置类(用于加载Spring和SpringMVC配置类)


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

public class ServletConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    /**加载Spring配置,创建Spring容器*/
    protected Class<?>[] getRootConfigClasses() {
        return new Class[] {SpringConfig.class};
    }

    @Override
    /**加载SpringMVC配置,创建SpringMVC容器*/
    protected Class<?>[] getServletConfigClasses() {
        return new Class[] {SpringMvcConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        //所有请求都交给SpringMVC处理
        return new String[] {"/"};
    }
}

功能模块开发

数据层开发

Book实体类
@Data
public class Books implements Serializable {
    /**
     * 书籍编号
     */
    private Integer bId;

    /**
     * 书籍名称
     */
    private String bName;

    /**
     * 作者
     */
    private String authers;

    /**
     * 价格
     */
    private BigDecimal price;

    /**
     * 出版年份
     */
    private Object pubdate;

    /**
     * 备注
     */
    private String note;

    /**
     * 数量
     */
    private Integer num;

   
}
mapper层BookMapper接口
public interface BooksMapper {  
    /**查询所有书籍*/
    List<Books> selectAll();
}

BookMapper.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.yaorange.ssm.mapper.BooksMapper">

    <resultMap id="BaseResultMap" type="com.yaorange.ssm.entity.Books">
            <id property="bId" column="b_id" jdbcType="INTEGER"/>
            <result property="bName" column="b_name" jdbcType="VARCHAR"/>
            <result property="authers" column="authers" jdbcType="VARCHAR"/>
            <result property="price" column="Price" jdbcType="DECIMAL"/>
            <result property="pubdate" column="pubdate" jdbcType="OTHER"/>
            <result property="note" column="note" jdbcType="VARCHAR"/>
            <result property="num" column="num" jdbcType="INTEGER"/>
    </resultMap>

    <sql id="Base_Column_List">
        b_id,b_name,authers,
        Price,pubdate,note,
        num
    </sql>


    <select id="selectAll" resultMap="BaseResultMap">
        SELECT
           <include refid="Base_Column_List"/>
        FROM
            books
    </select>

</mapper>

业务层开发

BookService接口
public interface BookService {
    List<Books> selectAll();
}
BookServiceImpl实现类
@Service
//开启事务管理
@Transactional(rollbackFor = Exception.class)
public class BookServiceImpl implements BookService {
    @Autowired
    private BooksMapper booksMapper;

    @Override
    public List<Books> selectAll() {
        return booksMapper.selectAll();
    }
}

控制层开发

@Controller
@ResponseBody
//根路径
@RequestMapping("/book")
public class BookController {
    @Autowired
    private BookService bookService;
    @RequestMapping("/list")
    public Result selectAll(){
        List<Books> books = bookService.selectAll();
        return Result.ok(books);
    }
}

common包中的响应结果类和响应码常量

修改Tomcat中的访问路径

将多余的删除后点击apply


/**定义响应结果类*/
@Data
public class Result {
    //响应码
    private int code;
    //响应信息
    private String msg;
    //响应数据
    private Object data;

    public Result(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public Result(int code, String msg, Object data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    public Result(String msg, Object data) {
        this.msg = msg;
        this.data = data;
    }

    public Result(Object data) {
        this.data = data;
    }

    public static Result success (){
        return new Result(HttpCode.SUCCESS_CODE,HttpMsg.SYS_OK_MSG);
    }
    public static Result ok(Object data){
        return new Result(data);
    }
    public static Result ok(String msg,Object data){
        return new Result(msg, data);
    }
}
public interface HttpCode {
    //成功响应码
    int SUCCESS_CODE=200;
    //失败响应码
    int ERROR_CODE=500;
}
public class HttpMsg {
    public static final String SYS_ERROR_MSG="操作失败";
    public static final String SYS_OK_MSG="操作成功";
}

postman接口测试结果

文章来源:https://blog.csdn.net/weixin_63975657/article/details/135657656
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。