系统架构图
整合过程
一、创建springboot项目
- 打开IDEA,点击 New Project与Create New Project. 开始创建一个新项目
- 在左侧菜单找到并点击 Spring Initializr,点击next。注意,这里idea默认使用https://start.spring.io提供的在线模板,所以需要保证网络畅通。
当然也可以选择下面的Custom从指定的链接加载模板。
- 按实际情况依次填写项目信息。其中Type属性可以下拉选择project或者pom,Packaging属性可下拉选择jar或者war(Maven的东西不需要再提了吧)。
填写完毕后点击 Next。
- 最激动人心的界面来了!!!你可以从左面选择大类,然后在窗口中间勾选需要的依赖。右边可以看到已选择的依赖项。
上边下拉框可以选择Spring Boot的版本,版本默认就行。完成后点击 Next。
这里我选择了“Web”类别下的“Lombok”、“Spring Web”类别下的“Thymeleaf”以及“SQL”类别下的“MyBatis Framework”和“Mysql Driver”。
- 终于,最后一步了。设置项目名称Project name 和 工程保存路径 Project location。完成后,点击 Finish。
- 等待IDEA构建好项目后,项目结构如下图所示。根据每个人在第4步选择的依赖不同,目录结构大同小异。
二、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请求
十三、整合目录结构
此项目创建过程是完全符合mvc架构约束的,极大的降低了类与类之间的耦合度
必创的五个文件夹controller又叫控制层、mapper数据持久层、pojo数据实体层、service数据服务层/业务层、impl数据服务层/业务层的实现层mapper/mapping在mybatis框架下也是必须创建的,是存放与执行sql语句的文件
十四、整合项目执行过程
十五、补充
- 域名倒写文件下的mapper文件名也可叫Dao,Repository等都可以,根据个人或公司需求来
- 域名倒写文件下的pojo文件名也可叫entity等都可以,根据个人或公司需求来
- resources文件下的mapper文件名也可叫mapping等都可以,根据个人或公司需求来
- 数据本博客的两个图中内容一个与项目结构有关,一个阐述了整个项目的执行过程
- 注入方式三种,1注解,2get、set,3构造方法
- 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