SpringBoot(一)

Springboot(一)

什么是SpringBoot

SpringBoot是Spring项目中的一个子工程,与Spring-famework同属于Spring的产品

用一些固定的方式来构建生产级别的Spring应用。SpringBoot推崇约定大于配置的方式以便于能够尽可能快速的启动并运行程序

我们把Spring Boot称为搭建程序的脚手架,最主要作用就是帮我们快速的构建庞大的项目,并且尽可能的减少一切xml配置,做到开箱即用。

为什么要用SpringBoot

我们Java一直被人诟病臃肿、麻烦。往往我们需要开发一个Java项目时,总是需要大量的工作来进行配置和构建。主要原因是:

  • 复杂的配置
  • 混乱的依赖管理

SpringBoot的特点

我们可以使用SpringBoot创建Java应用,并使用java -jar启动,就能得到一个生产级别的web工程

  • 为所有Spring的开发者提供一个非常快速的、广泛接受的入门体验
  • 开箱即用(启动器starter-其实就是SpringBoot提供的一个jar包,并通过自己设置.properties参数来达到配置的目的)
  • 提供一些大型项目中常见的非功能性特性
  • 无需xml配置,绝对没有代码生成

快速入门

快速创建SpringBoot项目

idea快速创建SpringBoot项目

选择web

SpringBoot项目结构
  • 启动类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class SpringbootFastcreateApplication {public static void main(String[] args) {SpringApplication.run(SpringbootFastcreateApplication.class, args);}}

启动类分析

  1. @SpringBootApplication:证明这工程是一个springboot的应用
  2. main方法:SpringApplication.run
    构造一个springApplication,执行SpringApplication的run方法

手动创建SpringBoot项目

  1. 创建一个Maven工程 作为父工程


    image.png
  2. 引入spring父工程依赖
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-parent</artifactId><version>2.2.2.RELEASE</version>
</parent>
  1. 添加一个起步依赖(引入start-web、java的版本1.8)
    为了让SpringBoot帮我们完成各种自动配置,我们必须引入SpringBoot提供的自动配置依赖。也就是启动器。因为我们是web项目,所以我们在这里引入web启动器
<!--2、JAVA的版本-->
<properties><java.version>1.8</java.version>
</properties><!--3、起步依赖-->
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
</dependencies>
  • 注意这里我们不需要指定版本的信息,因为SpringBoot的父工程已经对版本进行管理了
  1. 创建一个启动类
package com.probuing.self;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;/*** @author wangxin* @date 2020/1/11 17:24* @description: TODO* GOOD LUCK!*/
@SpringBootApplication
public class ApplicationRun {public static void main(String[] args) {SpringApplication.run(ApplicationRun.class, args);}
}

4.1 创建一个Controller

package com.probuing.self.controller;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;/*** @author wangxin* @date 2020/1/11 17:26* @description: TODO* GOOD LUCK!*/
@RestController
public class HelloController {@RequestMapping(value = "/hello", method = RequestMethod.GET)public String helloController() {return "hello,SpringBoot";}
}

@RestController 包含@Controller 还有@ResponseBody
返回的就是json数据

  1. 启动测试


    启动
  • 启动测试后我们可以看到监听的端口(红框内)
  1. 访问Controller
    http://localhost:8080/hello

Springboot配置文件

4.1 配置文件介绍

properties:键值对配置
yml:可以跨应用
yaml:和yml一样
yml和yaml比properties强大的是可以在配置文件中定义一个数组或集合

server:port:8082
  • 前缀需要两个或多个空格,不能使用制表符
  • 不同等级用:隔开
  • 冒号之后如果有值,那么冒号和值之间至少有一个空格,不能紧贴着

配置文件优先级

  • properties->yml->yaml
  • 优先级:properties大于yml yum大于yaml

使用配置文件

  • yml文件内容 applicaiton.yml
server:port:8090# 常量
name: 和平精英# 对象
game:name: wowage: 10# 数组
games: - wow- cod- ps4
使用@Value读取配置文件
  • HelloController.java
package com.probuing.sb_config.controller;import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;
import java.util.Map;/*** @author wangxin* @date 2020/1/11 17:48* @description: TODO* GOOD LUCK!*/
@RestController
public class ConfigController {@Value("$(name)")private String name;//定义对象属性@Value("$(game.name)")private String gameName;//数组属性@Value("$(games[2])")private String getArrEl;@RequestMapping(value = "/config")public Map configMap() {HashMap<String, String> map = new HashMap<String, String>();map.put("name", name);map.put("game_name", gameName);map.put("getArrEl", getArrEl);return map;}
}
  • 启动类
/*** @author wangxin* @date 2020/1/11 17:58* @description: TODO* GOOD LUCK!*/
@SpringBootApplication
public class ApplicationRun {public static void main(String[] args) {SpringApplication.run(ApplicationRun.class, args);}
}

Application启动类要放在最外侧,要在所有的子包外面
Spring-boot 会自动加载启动类所在包下及其子包下的所有组件

  • 输出

game_name "wow"
name "和平精英"
getArrEl "ps4"

Environment获取配置文件信息
  • 注入Environment
    @Autowiredprivate Environment env;
  • 通过Environment.getProperty获取配置文件信息
 @RequestMapping(value = "/config", method = RequestMethod.GET)public Map configMap() {HashMap<String, String> map = new HashMap<String, String>();map.put("name", name);map.put("game_name", gameName);map.put("getArrEl", getArrEl);return map;}

@ConfigurationProperties注解

  • Springboot官方使用的配置server:port
  1. 创建配置类
    Game.java
package com.probuing.sb_config.configbean;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;/*** @author wangxin* @date 2020/1/11 18:45* @description: TODO* GOOD LUCK!* Game配置类*/
@Configuration
@ConfigurationProperties(prefix = "game")
@Data
public class GameConfig {private String name;private String age;}
  • 使用配置类
 //配置类注入@Autowiredprivate GameConfig gameConfig;@RequestMapping(value = "/configConfig")public String configureConfig() {String config = gameConfig.getName() + gameConfig.getAge();return config;}

注解解释

SpringBoot 自动配置的原理

我们了解了SpringBoot能够使得无比繁杂的工程变的简单,并且让很多繁杂的配置都消失了,我们来探究一下Spring是如何做到的
我们先从SpringBoot的启动类开始:
Spring的启动类中包括@SpringBootApplication 注解,和SpringApplication.run方法
我们跟进@SpringBootApplication注解中


image.png

我们看到这里重点的注解有三个:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan

我们继续看@SpringBootConfiguration源码

image.png

在这个源码中 我们看到了@Configuration注解,这个注解的作用就是声明当前类是一个配置类,然后Spring会自动扫描到添加了@Configuration的类,会读取其中的配置信息。@SpringBootConfiguration是来声明当前类是 SpringBoot应用的配置类,项目中只能有一个。 @EnableAutoConfiguration这个注解的作用是告诉SpringBoot基于所添加的依赖,去了解如何配置Spring。就是这个注解帮我们完成了默认的配置,所以,我们使用SpringBoot构建一个项目,只需要引入所需框架的依赖,默认配置就可以交给SpringBoot处理了 比如我们添加了spring-boot-start-web`,而这个启动器中帮我们添加了tomcat、SpringMVC的依赖,此时Spring自动配置就知道需要开发一个web应用,然后就完成了SpringMVC的配置了
SpringBoot内部对大量的第三方库或Spring内部库进行了默认配置,这些配置是否生效,取决于我们是否引入了对应库所需的依赖,如果有所需的对应的依赖那么默认配置就会生效。
所以,我们使用SpringBoot构建一个项目,只需要引入所需框架的依赖,配置就可以交给SpringBoot处理了,如果不希望使用默认配置,则可以通过自定义配置进行配置

@ComponentScan 这个是配置组件扫描的指令,提供了类似与<context:component-scan>标签的作用

image.png

这里看到通过basePackageClasses属性来指定要扫描的包,而我们的@SpringBootApplication注解声明的类就是main函数所在的启动类,因此扫描的包是该类所在包及其子包,因此, 一般启动类会放在一个比较前的包目录中

SpringBoot默认配置原理

在SpringApplication类构建的时候,我们可以看到这样一段初始化代码


image.png

进入setInitializers中


image.png

这里可以看到 通过SpringFactoriesLoader.loadFactoryNames(type, classLoader)加载一些FactoryName,然后利用createSpringFactoiesInstance将这些加载到的类名进行实例化
然后继续跟进loadFactoryNames方法:
image.png

可以看到利用类加载器加载某个文件:

    public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";

我们可以发现SpringBoot会在初始化的时候,加载所有classpath:META-INF/spring.factories文件,包括jar包当中。我们看到在Spring的一个依赖包:spring-boot-autoconfigure中,就可以看到这样的文件spring.factories
以后我们引入的任何第三方容器,只要实现自动配置,都会有类似的文件

自动配置总结

SprongBoot为我们提供了默认配置,而默认配置生效的步骤:

  1. @EnableAutoConfiguration注解会去寻找META-INF/spring.factories文件,读取其中以EnableAutoConfiguration为key的所有类的名称,这些类就是提前写好的自动配置类
  2. 这些配置类都声明了@Configuration注解,并且通过@Bean注解提前配置了我们所需要的一切实例。完成自动配置
  3. 会有@Conditionalon注解,来决定配置是否会生效,如果我们自己配置了相关Bean,那么就会覆盖默认的自动配置的Bean
  4. 我们还可以通过配置application.properties文件,来覆盖自动配置中的属性
  • 启动器:
    我们如果不想配置,只需要引入依赖即可,而依赖的版本我们也无需关心,只要引入了SpringBoot提供的starter,就会自动管理依赖及版本了
  • 全局配置:
    SpringBoot的默认配置,都会读取默认属性,这些属性可以通过自定义application.properties文件来进行覆盖。这样虽然使用的还是默认配置,但是配置中的值以及改成了我们自定义的
    当我们需要自定义属性时,就需要覆盖application.properties指定key来覆盖

SpringBoot实战

整合Mybatis

引入依赖

  • pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>SpringBoot</artifactId><groupId>com.probuing</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>springboot_mybatis</artifactId><dependencies><!--起步依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--jdbc应用于事务管理--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!--mysql数据库驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency><!--mybatis--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.0.1</version></dependency><!--lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.10</version><scope>provided</scope></dependency></dependencies></project>
  • 启动类 SpringBootMybatisRunner.java
/*** @author wangxin* @date 2020/1/11 20:27* @description: TODO* GOOD LUCK!*/
@SpringBootApplication
public class SpringBootMybatisRunner {public static void main(String[] args) {SpringApplication.run(SpringBootMybatisRunner.class, args);}
}
  • 数据库表
SET FOREIGN_KEY_CHECKS=0;-- ----------------------------
-- Table structure for tb_user
-- ----------------------------
DROP TABLE IF EXISTS `tb_user`;
CREATE TABLE `tb_user` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`user_name` varchar(100) DEFAULT NULL COMMENT '用户名',`password` varchar(100) DEFAULT NULL COMMENT '密码',`name` varchar(100) DEFAULT NULL COMMENT '姓名',`age` int(10) DEFAULT NULL COMMENT '年龄',`sex` tinyint(1) DEFAULT NULL COMMENT '性别,1男性,2女性',`birthday` date DEFAULT NULL COMMENT '出生日期',`note` varchar(255) DEFAULT NULL COMMENT '备注',`created` datetime DEFAULT NULL COMMENT '创建时间',`updated` datetime DEFAULT NULL COMMENT '更新时间',PRIMARY KEY (`id`),UNIQUE KEY `username` (`user_name`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;-- ----------------------------
-- Records of tb_user
-- ----------------------------
INSERT INTO `tb_user` VALUES ('1', 'zhangsan1', '1234567', '张三', '25', '1', '1964-08-08', '张三同学在学Java', '2014-09-19 16:56:04', '2014-09-21 11:24:59');
INSERT INTO `tb_user` VALUES ('2', 'lisi11', '123456777', '李四', '21', '1', '1995-01-01', '李四同学在传智学Java', '2014-09-19 16:56:04', '2014-09-19 16:56:04');
INSERT INTO `tb_user` VALUES ('3', 'wangwu', '123456', '王五', '22', '1', '1994-01-01', '王五同学在学php', '2014-09-19 16:56:04', '2014-09-19 16:56:04');
INSERT INTO `tb_user` VALUES ('4', 'zhangwei', '123456', '张伟', '20', '1', '1996-09-01', '张伟同学在传智播客学Java', '2014-09-19 16:56:04', '2014-09-19 16:56:04');
INSERT INTO `tb_user` VALUES ('5', 'lina', '123456', '李娜', '28', '0', '1988-01-01', '李娜同学在传智播客学Java', '2014-09-19 16:56:04', '2014-09-19 16:56:04');
INSERT INTO `tb_user` VALUES ('6', 'lilei', '123456', '李磊', '23', '1', '1993-08-08', '李磊同学在传智播客学Java', '2014-09-20 11:41:15', '2014-09-20 11:41:15');
INSERT INTO `tb_user` VALUES ('7', 'hanmeimei', '123456', '韩梅梅', '24', '0', '1992-08-08', '韩梅梅同学在传智播客学php', '2014-09-20 11:41:15', '2014-09-20 11:41:15');
INSERT INTO `tb_user` VALUES ('8', 'liuyan', '123456', '柳岩', '21', '0', '1995-08-08', '柳岩同学在传智播客学表演', '2014-09-20 11:41:15', '2014-09-20 11:41:15');
INSERT INTO `tb_user` VALUES ('9', 'liuyifei', '123456', '刘亦菲', '18', '0', '1998-08-08', '刘亦菲同学在传智播客学唱歌', '2014-09-20 11:41:15', '2014-09-20 11:41:15');
INSERT INTO `tb_user` VALUES ('10', 'fanbingbing', '123456', '范冰冰', '25', '0', '1991-08-08', '范冰冰同学在传智播客学表演', '2014-09-20 11:41:15', '2014-09-20 11:41:15');
INSERT INTO `tb_user` VALUES ('11', 'zhengshuang', '123456', '郑爽', '23', '0', '1993-08-08', '郑爽同学在传智播客学习如何装纯', '2014-09-20 11:41:15', '2014-09-20 11:41:15');
INSERT INTO `tb_user` VALUES ('12', 'tangyan', '123456', '唐嫣', '26', '0', '1990-08-08', '郑爽同学在传智播客学习如何耍酷', '2014-09-20 11:41:15', '2014-09-20 11:41:15');
  • 实体类 User.java
@Data
public class User {private Long id;private String userName;private String password;private String name;private Integer age;private Integer sex;private Date birthday;private String note;private Date created;private Date updated;
}
  • dao层
public interface IUserDao {//根据id进行查询User findById(Long id);
}
  • 映射文件 mapper.xml


    image.png

    这里mapper的路径为自定义路径

<?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.probuing.sb.dao.IUserDao"><resultMap id="baseResultMap" type="User"><id column="id" property="id"></id><result column="user_name" property="userName"></result><result column="password" property="password"></result><result column="name" property="name"></result><result column="age" property="age"></result><result column="sex" property="sex"></result><result column="birthday" property="birthday"></result><result column="note" property="note"></result><result column="created" property="created"></result><result column="updated" property="updated"></result></resultMap><select id="findById" parameterType="long" resultMap="baseResultMap">SELECT * FROM tb_user WHERE id = #{id}</select>
</mapper>
  • 配置文件application.yml

# 服务器地址
server:port: 8099
#数据库连接:
spring:datasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql:///springbootusername: rootpassword: xml123xml#mybatis扫描:
mybatis:mapper-locations: classpath:mappers/*.xmltype-aliases-package: com.probuing.sb.domain
  • service层
    IUserService.java
public interface UserService {User findById(Long id);
}

实现类
IUserServiceImpl.java

@Service
public class UserServiceImpl implements UserService{@Autowiredprivate UserDao userDao;@Overridepublic User findById(Long id) {return userDao.findById(id);}
}
  • Controller
@RestController
public class UserController {@Autowiredprivate IUserService userService;@RequestMapping(value = "/toUpdate/{id}")public User toUpdate(@PathVariable Long id) {//@PathVariable 表示取路径上的变量return userService.findById(id);}
}
  • 启动类 启动时需要扫描dao
@SpringBootApplication
@MapperScan("cn.itcast.dao")   //扫描dao
public class MybatisApplication {public static void main(String[] args) {SpringApplication.run(MybatisApplication.class, args);}
}

注意

  • 映射文件的路径和接口IUserDao的路径不一致,在配置文件application.yml中,配置了mybatis的扫描
  • 在启动类中添加MapperScan扫描dao

整合通用Mapper

我们在开发中发现,dao层的技术,都是通用的,所以我们可以引入通用Mapper来实现减少映射文件mapper的编写

  • maven坐标 添加依赖
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency><!-- 通用mapper --><dependency><groupId>tk.mybatis</groupId><artifactId>mapper-spring-boot-starter</artifactId><version>2.1.5</version></dependency><!--lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.10</version><scope>provided</scope></dependency></dependencies>
  • 配置文件
    application.yml
server:port: 8091spring:datasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql:///springbootusername: rootpassword: xml123xml
  • 实体类
    User.java
package com.probuing.sb_mapper.domain;import lombok.Data;import javax.persistence.Id;
import javax.persistence.Table;
import java.util.Date;@Data
@Table(name = "tb_user")
public class User {@Idprivate Long id;private String userName;private String password;private String name;private Integer age;private Integer sex;private Date birthday;private String note;private Date created;private Date updated;
}

注意
实体类中:

  • 要有表对应 使用@Table(name=表明)指定实体类对应的表名
  • 实体类中要有主键对应,使用@Id定义在属性上表明定义的属性映射主键
  • dao层
    创建一个空的Dao接口 继承Mapper
    注意:这里导入的包是 tk.mybatis.mapper.common.Mapper
    IUserDao.java
public interface IUSerDao extends Mapper<User> {
}
  • service层
    IUserService.java
public interface IUserService {User findById(Long id);
}

实现类
UserServiceImpl.java

@Service
public class UserServiceImpl implements IUserService {//注入IUserDao@Autowiredprivate IUSerDao iuSerDao;public User findById(Long id) {return iuSerDao.selectByPrimaryKey(id);}
}

注意
这里Service的实现类中的dao已经继承了各种dao方法 包括select update insert delete 和条件的example

  • Controller层
    UserController.java
@RestController
public class UserController {@Autowiredprivate IUserService userService;//    @RequestMapping(value = "/findUser/{id}")@GetMapping(value = "/findUser/{id}")public User findUser(@PathVariable("id") Long id) {return userService.findById(id);}
}

注意
这里的Controller的RequestMapping中,写法:
@RequestMapping(value="/findUser/{id}",method=RequestMethod.GET)等价于
@GetMapping("/findUser/{id}")

  • 启动类(需要扫描dao)
    ApplicationMapperRunner.java
    注意
    这里的MapperScan引入的包一定是tk包下的
@SpringBootApplication
@MapperScan("com.probuing.dao")
public class ApplicationRunner {public static void main(String[] args) {SpringApplication.run(ApplicationRunner.class, args);}
}
  • 测试
    通过Mapper自定义接口实现查询
    IUserDao.java
public interface IUSerDao extends Mapper<User> {@Select("SELECT * FROM tb_user where user_name = #{userName}")User selectByUserName(String userName);
}
  • 通过Example条件查询
 @Testpublic void findUserNameExample() {Example example = new Example(User.class);Example.Criteria criteria = example.createCriteria();criteria.andEqualTo("userName", "lina");List<User> list = userDao.selectByExample(example);for (User user : list) {System.out.println(user.toString());}}

SpringBoot整合mybatisPlus

Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生

引入依赖

  • pom坐标
<?xml version="1.0" encoding="UTF-8"?>
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>cn.itcast</groupId><artifactId>springboot_plus</artifactId><version>1.0-SNAPSHOT</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.3.RELEASE</version></parent><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--管理事务,@Transtional--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency><!-- mybatis plus --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.1.2</version></dependency><!--lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.10</version><scope>provided</scope></dependency></dependencies>
</project>
  • 配置文件
    application.yml
server:port: 8092#数据库连接:
spring:datasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql:///springbootusername: rootpassword: xml123xml
  • 实体类
    User.java
package com.probuing.mp.domain;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;import java.util.Date;/*** @author wangxin* @date 2020/1/12 00:19* @description: TODO* GOOD LUCK!*/
@Data
@TableName(value = "tb_user")
public class User {@TableId(type = IdType.AUTO)//表示自增 UUID表示UUIDprivate Long id;private String userName;private String password;private String name;private Integer age;private Integer sex;private Date birthday;private String note;private Date created;private Date updated;
}

注意
实体类中必须定义表名(TableName),定义主键(TableId)

  • dao层
    IUserDao.java
public interface IUserDao extends BaseMapper<User> {
}

注意
mybatisPlus提供的是BaseMapper

  • service层
    IUserService.java
@Service
public class UserServiceImpl implements IUserService {@Autowiredprivate IUserDao userDao;public User findById(Long id) {return userDao.selectById(id);}
}

注意
MybatisPlus 提供的是selectById

  • Controller
    UserController.java
@RestController
public class UserController {@Autowiredprivate IUserService userService;@GetMapping(value = "/findById/{id}")public User findById(@PathVariable("id") Long id) {return userService.findById(id);}
}
  • 启动类扫描
    ApplicaitonMPRunner.java
@SpringBootApplication
@MapperScan("com.probuing.mp.dao")
public class ApplicationMPRunner {public static void main(String[] args) {SpringApplication.run(ApplicationMPRunner.class, args);}
}
最后编辑于:2024-11-17 10:24:50


喜欢的朋友记得点赞、收藏、关注哦!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/483176.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PDF与PDF/A的区别及如何使用Python实现它们之间的相互转换

目录 概述 PDF/A 是什么&#xff1f;与 PDF 有何不同&#xff1f; 用于实现 PDF 与 PDF/A 相互转换的 Python 库 Python 实现 PDF 转 PDF/A 将 PDF 转换为 PDF/A-1a 将 PDF 转换为 PDF/A-1b 将 PDF 转换为 PDF/A-2a 将 PDF 转换为 PDF/A-2b 将 PDF 转换为 PDF/A-3a 将…

【设计模式系列】备忘录模式(十九)

目录 一、什么是备忘录模式 二、备忘录模式的角色 三、备忘录模式的典型应用场景 四、备忘录模式在Calendar中的应用 一、什么是备忘录模式 备忘录模式&#xff08;Memento Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许在不暴露对象内部状态的情况下保存和恢…

window 下用Ollama 开发一个简单文档问答系统

文档问答系统 本系统利用先进的语言模型和检索技术&#xff0c;为用户提供基于上传文件内容的问答服务。支持多种文件格式&#xff0c;包括 Word、PDF、CSV、SQL 和 TXT 文件。 功能介绍 文件上传 用户可以同时上传多个文件。支持的文件类型包括&#xff1a;.doc, .docx, .…

全国296个地级市平均房价数据(2000-2022年)

全国296个地级市平均房价数据(2000-2022年)&#xff0c;包括面板数据和截面数据 点击下载 1、数据来源&#xff1a;安居客、房天下、房价行情网等住房交易网页整理 2、时间跨度&#xff1a;2000-2022年 3、区域范围&#xff1a;全国296个地级市 4、缺失说明&#xff1a;西…

贴片式内存卡 ​SD NAND​

SD NAND FLASH 贴片式SD卡 贴片式t卡 存储芯片 1. 什么是贴片式内存卡 贴片式内存卡是指一种将内存芯片直接贴装在电路板上的内存卡类型。与传统的插针式内存卡&#xff08;如SD卡、MicroSD卡&#xff09;不同&#xff0c;贴片式内存卡通常不具有外部引脚或接口&#xff0c;而…

C—操作符易错点

strlen与sizeof strlen求的是大小&#xff0c;包含“\0” strlen求的是&#xff0c;长度不包括“\0” 注意&#xff1a;空格也算一个字符 操作符“/”(除法&#xff09; 对于除法操作符来说&#xff0c;两边都是整数&#xff0c;那么就是整数除法 如果想计算出小数&#x…

基于PyTorch框架的线性回归实现指南

目录 ​编辑 1. 线性回归基础 2. PyTorch环境搭建 3. 数据准备 4. 定义线性回归模型 5. 损失函数和优化器 6. 训练模型 7. 评估模型 8. 结论 线性回归是统计学和机器学习中最基本的预测模型之一&#xff0c;它试图找到输入特征和输出结果之间的线性关系。在深度学习框…

R语言机器学习论文(六):总结

文章目录 介绍参考文献介绍 本文采用R语言对来自进行数据描述、数据预处理、特征筛选和模型构建。 最后我们获得了一个能有效区分乳腺组织的随机森林预测模型,它的性能非常好,这意味着它可能拥有非常好的临床价值。 在本文中,我们利用R语言对来自美国加州大学欧文分校的B…

基于Java Springboot校园导航微信小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse微信开发…

面试题-RocketMQ的基本架构、支持的消息模式、如何保证消息的可靠传输

相关问题 1、RocketMQ的基本架构是怎样的&#xff1f;请简述各组件的作用。 2、RocketMQ支持哪几种消息模式&#xff08;如点对点、发布/订阅&#xff09;&#xff1f;请简要说明它们的区别。 3、如何使用Java客户端实现一个简单的消息生产者和消费者&#xff1f; 4、RocketMQ…

WPF+LibVLC开发播放器-LibVLC在C#中的使用

使用WPFLibVLC快速 开发一个播放器 安装包Nuget 安装下面两个包,必须安装两个 一个是相关框架对应的包&#xff0c;Winform就安装LibVLCSharp.Winform;WPF就安装LibVLCSharp.WPF&#xff0c;以此类推&#xff0c;他们都默认依赖LibVLCSharp&#xff0c;不需要例外安装 一个是…

CSS变量用法及实践

目录 一、基本用法 1.1、定义变量 1.2、使用变量 1.3 、修改变量的值 二、命名规范 2.1、使用有意义的名称 2.2、使用命名空间 三、变量值类型 3.1、如果变量值是一个字符串&#xff0c;可以与其他字符串拼接&#xff0c;例如&#xff1a; 3.2、 如果变量值是数值&a…

WEB开发: 丢掉包袱,拥抱ASP.NET CORE!

今天的 Web 开发可以说进入了一个全新的时代&#xff0c;前后端分离、云原生、微服务等等一系列现代技术架构应运而生。在这个背景下&#xff0c;作为开发者&#xff0c;你一定希望找到一个高效、灵活、易于扩展且具有良好性能的框架。那么&#xff0c;ASP.NET Core 显然是一个…

【汇编语言】标志寄存器(一) —— 标志寄存器中的标志位:ZF、PF、SF、CF、OF 一网打尽

前言 &#x1f4cc; 汇编语言是很多相关课程&#xff08;如数据结构、操作系统、微机原理&#xff09;的重要基础。但仅仅从课程的角度出发就太片面了&#xff0c;其实学习汇编语言可以深入理解计算机底层工作原理&#xff0c;提升代码效率&#xff0c;尤其在嵌入式系统和性能优…

纯Go语言开发人脸检测、瞳孔/眼睛定位与面部特征检测插件-助力GoFly快速开发框架

前言​ 开发纯go插件的原因是因为目前 Go 生态系统中几乎所有现有的人脸检测解决方案都是纯粹绑定到一些 C/C 库&#xff0c;如 ​​OpenCV​​ 或 ​​​dlib​​​&#xff0c;但通过 ​​​cgo​​​ 调用 C 程序会引入巨大的延迟&#xff0c;并在性能方面产生显著的权衡。…

2、Three.js初步认识场景Scene、相机Camera、渲染器Renderer三要素

三要素之间关系&#xff1a; 有了虚拟场景Scene&#xff0c;相机录像Camera&#xff0c;在相机小屏幕上看到的Renderer Scene当前空间 Mesh人在场景 Camera相机录像 Renderer显示器上 首先先描述下Scene&#xff1a; 这个场景为三要素之一&#xff0c;一切需要展示的东西都需…

电子电气架构 --- 车载网关GW连接外部IP Tester

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源,以现象替代逻辑,以情绪代替思考,把消极接受现实的懦弱,伪装成乐观面对不幸的…

防火墙iptables

一、概述 1.1相关概念 入侵监测系统 在互联网访问的过程中&#xff0c;不阻断任何网络访问&#xff0c;也不会定位网络的威胁&#xff0c;提供告警和事后的监督&#xff0c;类似于监控。 入侵防御系统 透明工作模式&#xff0c;在判定为攻击行为或者是病毒威胁时&#xff0c…

Android Camera2采集并编码为H.264

前言 本篇博文主要讲述的是基于Android原生MediaCodec通过Camera2 API进行图像数据采集并编码为H.264的实现过程&#xff0c;如果对此感兴趣的不妨驻足观看&#xff0c;也欢迎大家大家对本文中描述不当或者不正确的地方进行指正。如果对于Camera2预览还不熟悉的可以观看博主上…

【ROS2】Ubuntu22.04安装ROS humble

一. ROS简介 1.1 什么是ROS ROS 是一个适用于机器人的开源的元操作系统。它提供了操作系统应有的服务&#xff0c;包括硬件抽象&#xff0c;底层设备控制&#xff0c;常用函数的实现&#xff0c;进程间消息传递&#xff0c;以及包管理。ROS的核心思想就是将机器人的软件功能做…