当然也可以选择下面的Custom从指定的链接加载模板。
填写完毕后点击 Next。
上边下拉框可以选择Spring Boot的版本,版本默认就行。完成后点击 Next。
这里我选择了“Web”类别下的“Lombok”、“Spring Web”类别下的“Thymeleaf”以及“SQL”类别下的“MyBatis Framework”和“Mysql Driver”。
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.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
在域名倒写文件夹下,创建一个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;
}
}
在域名倒写文件夹下,创建一个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);
}
在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>
在域名倒写文件夹下,创建一个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);
}
在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;
}
}
最后在域名倒写文件夹下,创建一个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与@Repository的区别
@Repository需要在Spring中配置扫描地址,然后生成Dao层的Bean才能被注入到Service层中;可以让在service的mapper不爆红
@Mapper不需要配置扫描地址,通过xml里面的namespace里面的接口地址,生成了Bean后注入到Service层中;是专用mapper接口的注解,注入到serviceimpl中
public void insert(@PathVariable int x,@PathVariable String y,@PathVariable int z) {
System.out.println("数据插入成功,id="+x+",name="+y+",age="+z);
}
重点讲一下:如果用了这个插件,那么在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
原文:https://www.cnblogs.com/lxuql/p/15158589.html