<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.3.12.RELEASEversion>
<relativePath/>
parent>
<groupId>com.examplegroupId>
<artifactId>sbAndMybatisartifactId>
<version>0.0.1-SNAPSHOTversion>
<name>sbAndMybatisname>
<description>sbAndMybatisdescription>
<properties>
<java.version>8java.version>
properties>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
dependency>
<dependency>
<groupId>repMaven.org.mybatis.spring.bootgroupId>
<artifactId>mybatis-spring-boot-starterartifactId>
<version>2.1.4version>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>repMaven.org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<version>3.2.5version>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
exclude>
excludes>
configuration>
plugin>
plugins>
build>
project>
spring-boot-starter-parent的版本为2.3.12,因为jdk版本为8,只有17及以上版本的jdk才可以用3.0以上的
mybatis-spring-boot-starter的版本依赖于上述的版本,为3.0的话会出现兼容问题,采用2.1.4
spring-boot-maven-plugin自动生成的会飘红,改为使用本地仓库的插件
spring.application.name=sbAndMybatis
#数据源的信息
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/zmq?serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456
#配置mybatis映射文件的路径
mybatis.mapper-locations=classpath:mapper/*.xml
在该文件中可以配置关于数据库的相关信息,也可以指定端口号和上下文路径
@Data
public class User {
private Integer id;
private String username;
private String password;
}
@Repository
public interface UserDao {
//添加
public int insert(User user);
//删除
public int del(Integer id);
//修改
public int update(User user);
//查询全部
public List<User> selectAll();
//根据id查询
public User selectById(Integer id);
}
在该文件下生成UserMapper.xml文件
DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zmq.dao.UserDao">
<resultMap id="myMap" type="com.zmq.entity.User" autoMapping="true">
<id property="id" column="id"/>
<result property="username" column="u_name"/>
resultMap>
<insert id="add">
insert into user values (null,#{username},#{password})
insert>
<insert id="insert">
insert into user values (null,#{username},#{password})
insert>
<update id="update">
update user set u_name=#{username},password=#{password} where id=#{id}
update>
<delete id="del">
delete from user where id=#{id}
delete>
<select id="getByOthers" resultMap="myMap">
select * from user where u_name=#{username} and password=#{password}
select>
<select id="selectAll" resultMap="myMap">
select * from user
select>
<select id="selectById" resultMap="myMap">
select * from user where id=#{id}
select>
mapper>
@Data
@NoArgsConstructor
@AllArgsConstructor
public class R {
private Integer code;
private String msg;
private Object object;
}
该类用于统一返回信息的类型
public interface UserService {
public R insert(User user);
public R del(Integer id);
public R update(User user);
public R selectAll();
public R selectById(Integer id);
}
在该包下生成UserServiceImpl类,并实现UserService接口
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public R insert(User user) {
int insert = userDao.insert(user);
if(insert>0){
return new R(200,"添加成功!",null);
}else {
return new R(500,"添加失败!",null);
}
}
@Override
public R del(Integer id) {
int del = userDao.del(id);
if(del>0) {
return new R(200,"删除成功!",null);
}else {
return new R(500,"删除失败!",null);
}
}
@Override
public R update(User user) {
int update = userDao.update(user);
if(update>0){
return new R(200,"修改成功!",null);
}else {
return new R(500,"修改失败!",null);
}
}
@Override
public R selectAll() {
List<User> list = userDao.selectAll();
if(list!=null){
return new R(200,"查询成功!",list);
}else {
return new R(500,"查询失败",null);
}
}
@Override
public R selectById(Integer id) {
User user = userDao.selectById(id);
if(user!=null){
return new R(200,"查询成功",user);
}else {
return new R(500,"查询失败!",null);
}
}
}
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
//添加
@PostMapping("/insert")
public R insert(@RequestBody User user){
return userService.insert(user);
}
//删除
@DeleteMapping("/delete")
public R delete(Integer id){
return userService.del(id);
}
//修改
@PutMapping("/update")
public R update(@RequestBody User user){
return userService.update(user);
}
//查询全部
@GetMapping("/selectAll")
public R selectAll(){
return userService.selectAll();
}
//根据id查询
@GetMapping("/selectById")
public R selectById(Integer id){
return userService.selectById(id);
}
}
@SpringBootApplication
//为指定的dao生成代理实现类
@MapperScan(basePackages = "com.zmq.dao")
public class SbAndMybatisApplication {
public static void main(String[] args) {
SpringApplication.run(SbAndMybatisApplication.class, args);
}
}

没有为dao生成代理实现类


mybatis和springboot整合的版本太高
swagger2就是在线生成接口文档的,而且还可以对接口进行测试
Swagger2是一个规范和完整的框架,用于生成、描述、调用和可视化Restful风格的web服务,现在我们使用spring boot整合,作用:
1. 在线生成接口文档
2. 接口的功能测试
Restful风格:在controller层的注解使用:
添加:@PostMapping
删除:@DeleteMapping
修改:@PutMapping
查询:@GetMapping
因为项目为前后端分离,靠接口调用连接,就需要为每个接口生成接口文档,而手写word文档实时性差

<dependency>
<groupId>com.spring4allgroupId>
<artifactId>swagger-spring-boot-starterartifactId>
<version>1.9.1.RELEASEversion>
dependency>
<dependency>
<groupId>com.github.xiaoymingroupId>
<artifactId>swagger-bootstrap-uiartifactId>
<version>1.9.6version>
dependency>
考虑版本不兼容问题
@Configuration
public class Swagger2Config {
//创建swagger实例
@Bean
public Docket docket() {
Docket docket=
new Docket(DocumentationType.SWAGGER_2)
.apiInfo(getInfo())//设置接口文档的信息
.select()
.apis(RequestHandlerSelectors.basePackage("com.zmq.controller")) //指定为那些路径下得到类生成接口文档
.build()
;
return docket;
}
private ApiInfo getInfo(){
Contact DEFAULT_CONTACT = new Contact("ldw", "http://www.ldw.com", "110@qq.com");
ApiInfo DEFAULT = new ApiInfo("用户管理系统API", "该系统中的接口专门操作用户的", "v1.0", "http://www.baidu.com",
DEFAULT_CONTACT, "dong", "http://www.jd.com", new ArrayList<VendorExtension>());
return DEFAULT;
}
}
@Configuration:Spring注解:声明该类为配置类
@Bean注解:用在方法上,必须用在配置类里面,将当前方法的返回值对象存入容器中
Docket对象说明:
- 构造方法:需要一个DocumentationType类对象,这里选择SWAGGER_2


Docket对象说明:
- apiInfo():用于配置swagger 信息,设置接口文档的信息
这个类对象仅有如下属性,且只有一个构造方法。
@SpringBootApplication
@MapperScan(basePackages = "com.zmq.dao")
//开启文档注解
@EnableSwagger2
public class SbAndMybatisWorkApplication {
public static void main(String[] args) {
SpringApplication.run(SbAndMybatisWorkApplication.class, args);
}
}
@EnableSwagger2:开启swagger2的注解驱动
第一种:http://localhost:8080/swagger-ui.html
第二种:http://localhost:8080/doc.html
@Api(tags=“”):使用在接口类上,对接口类的说明
@ApiOperation(value=“”):接口方法上,对接口方法的说明
@ApiImplicitParams(
@ApiImplicitParam(name=“参数名”,value=“参数说明”,required=“是否必写”,dataType=“数据类型”)
):接口方法所有参数的概述
@RestController
@RequestMapping("/user")
@Api(tags = "用户管理")
public class UserController {
@Autowired
private UserService userService;
@PostMapping("/insert")
@ApiOperation(value = "添加用户")
@ApiImplicitParams(
@ApiImplicitParam(name = "user" ,value="用户对象",required = true,dataType = "User")
)
public R insert(@RequestBody User user){
return userService.isnert(user);
}
@GetMapping("/selectAll")
public R selectAll(){
return userService.selectAll();
}
}
@ApiModel(value=“”):使用在实体类上,对实体类的说明
@ApiModelProperty(value=“”):使用在实体类属性上,对属性的说明
@Data
@ApiModel(value = "用户实体类")
public class User {
private Integer id;
@ApiModelProperty(value = "用户姓名")
private String username;
@ApiModelProperty(value = "用户密码")
private String password;
}
在指定的时间执行相应的业务代码。场景:oss修改照片时,存在一个冗余照片。定时删除冗余照片
比如:下单,30分钟未支付就取消订单
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-quartzartifactId>
dependency>
@Configuration
public class QuartzConfig {
//定时业务代码
//定义定时规则
@Scheduled(cron = "0/5 * * * * ?")
public void show(){
System.out.println("*******************");
//发生短信 或者删除oss冗余文件 或者取消订单
}
}
cron:表达式
@SpringBootApplication
@MapperScan(basePackages = "com.zmq.dao")
//开启文档注解
@EnableSwagger2
//开启定时器注解
@EnableScheduling
public class SbAndMybatisWorkApplication {
public static void main(String[] args) {
SpringApplication.run(SbAndMybatisWorkApplication.class, args);
}
}
@EnableScheduling:开启定时器注解驱动
在线生成cron表达式:https://cron.ciding.cc/
MyBatis-Plus是一个MyBatis的增强工具,在MyBatis的基础上只做增强,不做改变,为简化开发、提高效率而生
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-boot-starterartifactId>
<version>3.5.7version>
dependency>
若因为MyBatis-Plus和MyBatis的依赖版本问题而报错,可以将MyBatis的依赖删除,因为MyBatis-Plus中包含MyBatis的依赖,且保证了版本的一致性
spring.application.name=sbAndMP
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/zmq1?serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456
#??mybatis???????
mybatis.mapper-locations=classpath:mapper/*.xml
#配置日志--sql日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
@TableName(value ="user")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {
/**
* 主键ID
*/
@TableId
private Long id;
/**
* 姓名
*/
private String name;
/**
* 年龄
*/
private Integer age;
/**
* 邮箱
*/
private String email;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}
@Repository
public interface UserMapper extends BaseMapper<User> {
}
//生成代理实现类
@MapperScan("com.zmq.mapper")
public class SbAndMpApplication {
public static void main(String[] args) { SpringApplication.run(SbAndMpApplication.class, args);
}
}
测试:
@SpringBootTest
class Qy174SpringbootMpApplicationTests {
@Autowired
private UserMapper userMapper;
/**
* 如果出现实体类和表名不一致。@TableName
* 如果出现实体类属性名和字段名不一致。@TableField
*/
@Test
void testSelectById() {
User user = userMapper.selectById(1);
System.out.println(user);
}
}
@Test
void testInsert(){
//添加一条记录
// User user=new User(null,"qqq",19,"123@qq.com");
// //添加--把生成的主键也会赋值给对象中主键属性
// System.out.println("填进去:"+user);
// int row = userMapper.insert(user);
// System.out.println(row);
// System.out.println("填进去后:"+user);
//批量添加
// List list=new ArrayList<>();
// list.add(new User(null,"aa",18,"123@qq.com"));
// list.add(new User(null,"aaa",19,"223@qq.com"));
// list.add(new User(null,"vb",19,"323@qq.com"));
// list.add(new User(null,"bb",17,"323@qq.com"));
// List insert = userMapper.insert(list);
//如果有id则修改 没有则添加
User user=new User(2,"sss",19,"123@qq.com");
userMapper.insertOrUpdate(user);
}