Springboot整合ssm

Posted 独自升级的猎人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Springboot整合ssm相关的知识,希望对你有一定的参考价值。

系统架构图

image

整合过程

一、创建springboot项目

  1. 打开IDEA,点击 New Project与Create New Project. 开始创建一个新项目

image

  1. 在左侧菜单找到并点击 Spring Initializr,点击next。注意,这里idea默认使用https://start.spring.io提供的在线模板,所以需要保证网络畅通。

当然也可以选择下面的Custom从指定的链接加载模板。

image

  1. 按实际情况依次填写项目信息。其中Type属性可以下拉选择project或者pom,Packaging属性可下拉选择jar或者war(Maven的东西不需要再提了吧)。

填写完毕后点击 Next。

image

  1. 最激动人心的界面来了!!!你可以从左面选择大类,然后在窗口中间勾选需要的依赖。右边可以看到已选择的依赖项。

上边下拉框可以选择Spring Boot的版本,版本默认就行。完成后点击 Next。

这里我选择了“Web”类别下的“Lombok”、“Spring Web”类别下的“Thymeleaf”以及“SQL”类别下的“MyBatis Framework”和“mysql Driver”。

image

  1. 终于,最后一步了。设置项目名称Project name 和 工程保存路径 Project location。完成后,点击 Finish。

image

  1. 等待IDEA构建好项目后,项目结构如下图所示。根据每个人在第4步选择的依赖不同,目录结构大同小异。

image

二、pom.xml

pom.xml里必须要导入这几个依赖“Spring Web”以及“SQL”类别下的“MyBatis Framework”和“Mysql Driver”,在创建项目是已经添加了,其他的依赖可以根据后续业务需求来安排

三、准备表,数据

CREATE DATABASE mybatisdb DEFAULT CHARACTER SET utf8;
USE mybatisdb;
CREATE TABLE `car` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(10) default NULL,
  `color` varchar(10) default NULL,
  `price` double default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

表里随便写点数据

四、application.yml

如果是application.properties,可以改成application.yml,个人觉得的application.yml好用些,但要注意application.yml里“ : ”后必须有空格

server:
  #可以改访问端口
  port: 8081

spring:
  datasource:
    username: root
    password: 123456
    url: jdbc:mysql://localhost:3306/mybatisdb?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
    driver-class-name: com.mysql.cj.jdbc.Driver

mybatis:
  #告诉mybatis,sql所在的xml,在那个文件夹下
  mapper-locations: classpath:mapper/*Mapper.xml
  #sql所在的xml里的实体类可以简写
  #type-aliases-package: com.tedu.pojo

  configuration:
    #日志
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    #开启驼峰命名
    map-underscore-to-camel-case: true

五、Car.java

在域名倒写文件夹下,创建一个pojo文件夹,再在该文件夹下创建Car.java

package com.example.demo.pojo;


/**
 * (Car)实体类
 *
 * @author pzl
 * @since 2021-08-18 18:44:07
 */
public class Car {
    
    private Integer id;

    private String name;

    private String color;

    private Object price;


    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 String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public Object getPrice() {
        return price;
    }

    public void setPrice(Object price) {
        this.price = price;
    }

}

六、CarMapper接口

在域名倒写文件夹下,创建一个mapper文件夹,再在该文件夹下创建CarMapper接口

package com.example.demo.mapper;

import com.example.demo.pojo.Car;
import org.springframework.stereotype.Repository;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * (Car)表数据库访问层
 *
 * @author pzl
 * @since 2021-08-18 18:44:07
 */
@Repository//作用在自动注入Mapper接口时不报红,爆红是idea问题,mapper加了自动注入,但idea认为ioc中没有mapper,所以爆红
public interface CarMapper {

    /**a
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    Car queryById(Integer id);

    /**
     * 查询指定行数据
     *
     * @param offset 查询起始位置
     * @param limit  查询条数
     * @return 对象列表
     */
    List<Car> queryAllByLimit(@Param("offset") int offset, @Param("limit") int limit);


    /**
     * 通过实体作为筛选条件查询
     *
     * @param car 实例对象
     * @return 对象列表
     */
    List<Car> queryAll(Car car);

    /**
     * 新增数据
     *
     * @param car 实例对象
     * @return 影响行数
     */
    int insert(Car car);

    /**
     * 批量新增数据(MyBatis原生foreach方法)
     *
     * @param entities List<Car> 实例对象列表
     * @return 影响行数
     */
    int insertBatch(@Param("entities") List<Car> entities);

    /**
     * 批量新增或按主键更新数据(MyBatis原生foreach方法)
     *
     * @param entities List<Car> 实例对象列表
     * @return 影响行数
     */
    int insertOrUpdateBatch(@Param("entities") List<Car> entities);

    /**
     * 修改数据
     *
     * @param car 实例对象
     * @return 影响行数
     */
    int update(Car car);

    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 影响行数
     */
    int deleteById(Integer id);

}


七、CarMapper.xml

在resources文件夹下,创建一个mapper文件夹,再在该文件下创建CarMapper.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.example.demo.mapper.CarMapper">

    <resultMap type="com.example.demo.pojo.Car" id="CarMap">
        <result property="id" column="id" jdbcType="INTEGER"/>
        <result property="name" column="name" jdbcType="VARCHAR"/>
        <result property="color" column="color" jdbcType="VARCHAR"/>
        <result property="price" column="price" jdbcType="VARCHAR"/>
    </resultMap>

    <!--查询单个-->
    <select id="queryById" resultMap="CarMap">
        select
          id, name, color, price
        from mybatisdb.car
        where id = #{id}
    </select>

    <!--查询指定行数据-->
    <select id="queryAllByLimit" resultMap="CarMap">
        select
          id, name, color, price
        from mybatisdb.car
        limit #{offset}, #{limit}
    </select>

    <!--通过实体作为筛选条件查询-->
    <select id="queryAll" resultMap="CarMap">
        select
        id, name, color, price
        from mybatisdb.car
        <where>
            <if test="id != null">
                and id = #{id}
            </if>
            <if test="name != null and name != \'\'">
                and name = #{name}
            </if>
            <if test="color != null and color != \'\'">
                and color = #{color}
            </if>
            <if test="price != null">
                and price = #{price}
            </if>
        </where>
    </select>

    <!--新增所有列-->
    <insert id="insert" keyProperty="id" useGeneratedKeys="true">
        insert into mybatisdb.car(name, color, price)
        values (#{name}, #{color}, #{price})
    </insert>

    <insert id="insertBatch" keyProperty="id" useGeneratedKeys="true">
        insert into mybatisdb.car(name, color, price)
        values
        <foreach collection="entities" item="entity" separator=",">
            (#{entity.name}, #{entity.color}, #{entity.price})
        </foreach>
    </insert>

    <insert id="insertOrUpdateBatch" keyProperty="id" useGeneratedKeys="true">
        insert into mybatisdb.car(name, color, price)
        values
        <foreach collection="entities" item="entity" separator=",">
            (#{entity.name}, #{entity.color}, #{entity.price})
        </foreach>
        on duplicate key update
        name = values(name) , color = values(color) , price = values(price)
    </insert>

    <!--通过主键修改数据-->
    <update id="update">
        update mybatisdb.car
        <set>
            <if test="name != null and name != \'\'">
                name = #{name},
            </if>
            <if test="color != null and color != \'\'">
                color = #{color},
            </if>
            <if test="price != null">
                price = #{price},
            </if>
        </set>
        where id = #{id}
    </update>

    <!--通过主键删除-->
    <delete id="deleteById">
        delete from mybatisdb.car where id = #{id}
    </delete>

</mapper>


八、CarService接口

在域名倒写文件夹下,创建一个service文件夹,再在该文件夹下创建CarService接口

package com.example.demo.service;

import com.example.demo.pojo.Car;

import java.util.List;

/**
 * (Car)表服务接口
 *
 * @author pzl
 * @since 2021-08-18 18:44:07
 */
public interface CarService {

    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    Car queryById(Integer id);

    /**
     * 查询多条数据
     *
     * @param offset 查询起始位置
     * @param limit  查询条数
     * @return 对象列表
     */
    List<Car> queryAllByLimit(int offset, int limit);

    /**
     * 新增数据
     *
     * @param car 实例对象
     * @return 实例对象
     */
    Car insert(Car car);

    /**
     * 修改数据
     *
     * @param car 实例对象
     * @return 实例对象
     */
    Car update(Car car);

    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 是否成功
     */
    boolean deleteById(Integer id);

}

九、CarServiceImpl.java

在Service文件夹下床架Impl文件,再猜该文家加下创建CarServiceImpl.java

package com.example.demo.service.impl;

import com.example.demo.pojo.Car;
import com.example.demo.mapper.CarMapper;
import com.example.demo.service.CarService;
import org.springframework.stereotype.Service;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;

/**
 * (Car)表服务实现类
 *
 * @author pzl
 * @since 2021-08-18 18:44:08
 */
@Service("carService")
public class CarServiceImpl implements CarService {
    @Autowired
    private CarMapper carMapper;

    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    @Override
    public Car queryById(Integer id) {
        return this.carMapper.queryById(id);
    }

    /**
     * 查询多条数据
     *
     * @param offset 查询起始位置
     * @param limit  查询条数
     * @return 对象列表
     */
    @Override
    public List<Car> queryAllByLimit(int offset, int limit) {
        return this.carMapper.queryAllByLimit(offset, limit);
    }

    /**
     * 新增数据
     *
     * @param car 实例对象
     * @return 实例对象
     */
    @Override
    public Car insert(Car car) {
        this.carMapper.insert(car);
        return car;
    }

    /**
     * 修改数据
     *
     * @param car 实例对象
     * @return 实例对象
     */
    @Override
    public Car update(Car car) {
        this.carMapper.update(car);
        return this.queryById(car.getId());
    }

    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 是否成功
     */
    @Override
    public boolean deleteById(Integer id) {
        return this.carMapper.deleteById(id) > 0;
    }
}

十、CarController.java

最后在域名倒写文件夹下,创建一个controller文件夹,再在该文件夹下创建CarController.java

package com.example.demo.controller;

import com.example.demo.pojo.Car;
import com.example.demo.service.CarService;
import org.springframework.web.bind.annotation.*;

import org.springframework.beans.factory.annotation.Autowired;

/**
 * (Car)表控制层
 *
 * @author pzl
 * @since 2021-08-18 18:44:08
 */
@RestController
@RequestMapping("car")
@CrossOrigin//解决了跨域问题
public class CarController {
    /**
     * 服务对象
     */
    @Autowired
    private CarService carService;

    /**
     * 通过主键查询单条数据
     *
     * @param id 主键
     * @return 单条数据
     */
    @GetMapping("selectOne/{id}")
    public Car selectOne(@PathVariable Integer id) {
        return this.carService.queryById(id);
    }

}

十一、启动类

package com.example.demo;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("com.example.demo.mapper")//这个必须加,可以让所有mapper的接口放入到IOC容器中
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

十二、测试

访问http://localhost:8081/car/selectOne/1请求

image

十三、整合目录结构

image

此项目创建过程是完全符合mvc架构约束的,极大的降低了类与类之间的耦合度

必创的五个文件夹controller又叫控制层、mapper数据持久层、pojo数据实体层、service数据服务层/业务层、impl数据服务层/业务层的实现层mapper/mapping在mybatis框架下也是必须创建的,是存放与执行sql语句的文件

十四、整合项目执行过程

image

十五、补充

  1. 域名倒写文件下的mapper文件名也可叫Dao,Repository等都可以,根据个人或公司需求来
  2. 域名倒写文件下的pojo文件名也可叫entity等都可以,根据个人或公司需求来
  3. resources文件下的mapper文件名也可叫mapping等都可以,根据个人或公司需求来
  4. 数据本博客的两个图中内容一个与项目结构有关,一个阐述了整个项目的执行过程
  5. 注入方式三种,1注解,2get、set,3构造方法
  6. springboot的整合的ssm可以说是当下最流行的java后端框架,其中用来大量的注解与反射来简化我们的开发,注解它都是由动态代理、工厂模式加反射实现的,有兴趣的可以去深入了解者两个设计模式

@Mapper与@Repository的区别
@Repository需要在Spring中配置扫描地址,然后生成Dao层的Bean才能被注入到Service层中;可以让在service的mapper不爆红

@Mapper不需要配置扫描地址,通过xml里面的namespace里面的接口地址,生成了Bean后注入到Service层中;是专用mapper接口的注解,注入到serviceimpl中

RESTFul方式(推荐)

public void insert(@PathVariable int x,@PathVariable String y,@PathVariable int z) {
		System.out.println("数据插入成功,id="+x+",name="+y+",age="+z);
}

Free Mybatis plugin*

重点讲一下:如果用了这个插件,那么在application.yml里配置了:type-aliases-package: com.tedu.pojo,让后再在*Mapper.xml里写 resultType="User",不写全路径会爆红 ,但依然运行的起。

解决方案:1卸载这个插件,2如果想用这个插件的跳转,那么 resultType=" com.tedu.pojo.User"必需写全路径,3可以不写全路径,但要降低警告几倍https://blog.csdn.net/u012488504/article/details/111144582

以上是关于Springboot整合ssm的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot完成SSM整合之SpringBoot整合junit

SpringBoot——整合SSM(主要整合MyBatis)

基于SpringBoot的完成SSM整合项目开发案例

springBoot整合ssm

SpringBoot整合ssm

Springboot整合ssm