springBoot零基础入门到精通集成MyBatis-plus代码生成

1.SpringBoot简介

  1. 独立运行的 Spring 项目Spring Boot 可以以 jar 包的形式独立运行,Spring Boot 项目只需通过命令“ java–jar xx.jar” 即可运行。
  2. 内嵌 Servlet 容器Spring Boot 使用嵌入式的 Servlet 容器(例如 Tomcat、Jetty 或者 Undertow 等),应用无需打成 WAR 包 。
  3. 提供 starter 简化 Maven 配置Spring Boot 提供了一系列的“starter”项目对象模型(POMS)来简化 Maven 配置。
  4. 提供了大量的自动配置Spring Boot 提供了大量的默认自动配置,来简化项目的开发,开发人员也通过配置文件修改默认配置。
  5. 自带应用监控Spring Boot 可以对正在运行的项目提供监控。6. 无代码生成和 xml 配置Spring Boot 不需要任何 xml 配置即可实现 Spring 的所有配置。

2.构建SpringBoot

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

SpringBoot采用内置容器(默认容器Tomcat)的方式进行部署,所以不用在idea中再配置Tomcat了,直接运行启动类的main方法即可

在这里插入图片描述
在这里插入图片描述

启动效果
在这里插入图片描述

认准这行,代表启动成功!默认运行在了8080端口

编写案例

1. Controller返回json

@RequestMapping(value = "/test",method = RequestMethod.GET)@ResponseBody
public Map<String,Object> test(){Map<String,Object> map = new HashMap<>();map.put("msg","测试成功!");return map;}

4.SpringBoot配置文件-YAML

5. Spring Boot配置绑定

所谓“配置绑定”就是把配置文件中的值与 JavaBean 中对应的属性进行绑定。通常,我们会把一些配置信息(例如,数据库配置)放在配置文件中,然后通过 Java 代码去读取该配置文件,并且把配置文件中指定的配置封装到 JavaBean(实体类) 中。

1. 使用 @ConfigurationProperties 注解

yml文件

# 测试配置
person:name: 蔡徐坤age: 180birth: 1994/11/12list:- a- b- cmap:name: 宇将军age: 90son:name: 阿耶夫age: 18

java类

@Data
@Component
@ConfigurationProperties(prefix = "person")
public class Person implements Serializable {private String name;private int age;private Date birth;private List<String> list;private Map<String,Object> map;private Person son;}

2.使用@Value注解获取配置

@Data
@Component
public class Person implements Serializable {@Value("${person.map.name}")private String name;private int age;private Date birth;private List<String> list;private Map<String,Object> map;private Person son;}

3.加载除application配置文件之外的配置文件内容

使用@PropertySource

创建一个aabbcc.properties配置文件,编写内容

cxk.name: giao哥

加载方法

@Data
@Component
@PropertySource(value= "classpath:aabbcc.properties")
public class Person implements Serializable {@Value("${cxk.name}")private String name;private int age;private Date birth;private List<String> list;private Map<String,Object> map;private Person son;}

6.SpringBoot加载Spring配置文件

1.@ImportResource 注解

创建一个xml配置文件在resources目录下


<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"><bean id="person" class="com.example.springbootdemo2023.core.dto.Person" />beans>

在启动类头部添加注解@ImportResource

@ImportResource(locations = "classpath:spring.xml")//导入spring配置文件
@SpringBootApplication
public class SpringBootDemo2023Application {public static void main(String[] args) {SpringApplication.run(SpringBootDemo2023Application.class, args);}}

使用测试

@Controller
@RequestMapping("/login")
public class LoginController {@Autowiredprivate Person person;@RequestMapping(value = "/test",method = RequestMethod.GET)@ResponseBodypublic Map<String,Object> test(){Map<String,Object> map = new HashMap<>();map.put("msg","测试成功!");System.out.println(person);return map;}

打印

Person(name=null, age=0, birth=null, list=null, map=null, son=null)

2.使用Spring注解化导入配置的方法

配置类

@Configuration
public class MyConfig {//等同于 @Beanpublic Person getPerson(){Person person = new Person();person.setName("gaojingbo");return person;}}

7.SpringBoot多环境配置

从环境配置+主环境配置=boot项目完整配置

1. 创建不同环境下的配置文件

创建的规则:

开发环境:application-dev.yml

测试环境:application-test.yml

生产环境:application-prod.yml

application-dev.yml

# 开发环境配置
server:port: 8090

application-test.yml

# 测试环境配置
server:port: 8100

application-prod.yml

# 生产环境配置
server:port: 9010

主配置文件-application.yml

主环境配置文件编写一些不会变化的配置项目即可

# 主配置文件# 激活环境配置
spring:profiles:active: test

2.定义激活环境配置的方法

1. 运行jar包时通过指令参数设置

在这里插入图片描述

2. idea开发时可以使用工具设置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r1d49SYm-1678073315611)(笔记图片/image-20230228155426602.png)]

3.打包运行时使用jvm参数设置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GC5c8rQP-1678073315613)(笔记图片/image-20230228155359901.png)]

8.SpringBoot默认配置文件的加载优先级

根目录下配置文件 > classpath目录中config文件夹下的配置文件 > classpath目录中的配置文件

所有写法优先级:(序号越小优先级越高)

  1. ​ file:./config/
  2. file:./config/*/
  3. file:./
  4. classpath:/config/
  5. classpath:/

注:file: 指当前项目根目录;classpath: 指当前项目的类路径,即 resources 目录。

1. 当注解化配置和引入外部配置杂糅在一起时,完整加载优先级

  1. 命令行参数
  2. 来自 java:comp/env 的 JNDI 属性
  3. Java 系统属性(System.getProperties())
  4. 操作系统环境变量
  5. RandomValuePropertySource 配置的 random.* 属性值
  6. 配置文件(YAML 文件、Properties 文件)
  7. @Configuration 注解类上的 @PropertySource 指定的配置文件
  8. 通过 SpringApplication.setDefaultProperties 指定的默认属性

9.SpringBoot使用日志

1. 配置日志:在springboot配置文件中添加以下内容

# 日志配置
logging:level:com.example.springbootdemo2023: debug # 描述根包下所有的类都要进行日志记录file:path: F:\idea_logs\SpringBootDemo2023 # 离线生成的日志文件位置pattern:# 控制台日志的模板效果console: "%red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %yellow(%-5level) %logger{50} - %m%n" # 保存到文件中的日志效果file: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %m%n"

10.SpringBoot拦截器

1.定义拦截器

和SpringMVC写法完全一致

/*** 模块名称:登录会话验证拦截器* 模块类型:* 编码人:高靖博* 创建时间:2023/3/1* 联系电话:18587388612*/
public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("登录拦截器被调用!");return true;}
}

2.注册拦截器

创建一个实现了 WebMvcConfigurer 接口的配置类(使用了 @Configuration 注解的类),重写 addInterceptors() 方法,并在该方法中调用 registry.addInterceptor() 方法将自定义的拦截器注册到容器中。

InterceptorRegistration 配置拦截器规则:

addPathPatterns:设置进入拦截器的规则

excludePathPatterns:设置不进入拦截器的规则

注意: 路径不存在如果是404的话是绝对会进入拦截器的

// 1. 实现WebMvcConfigurer 接口
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {//2.重写addInterceptors方法@Overridepublic void addInterceptors(InterceptorRegistry registry) {//3. 注册自定义编写的拦截器// 调用addInterceptor,参数传递拦截器实例InterceptorRegistration ic = registry.addInterceptor(new LoginInterceptor());//设置拦截器的拦截规则ic.addPathPatterns("/**");//放行拦截器(登录页面、登录请求、静态资源(js、css、img、video、font(字体文件))、阿里druid连接池监控中心、swaggerui)ic.excludePathPatterns("/login/test2","/sys/user/doLogin","/js/**","/css/**","/imgs/**","/druid/**","/swagger-ui.html","/v2/**","/webjars/**","/swagger-resources/**","/sys/user/captcha","/sys/platform/**","/sys/files/**");}
}

11.SpringBoot整合Druid连接池

1.引入依赖

<dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-jdbcartifactId>dependency><dependency><groupId>mysqlgroupId><artifactId>mysql-connector-javaartifactId><version>8.0.21version>dependency>
<dependency><groupId>com.alibabagroupId><artifactId>druid-spring-boot-starterartifactId><version>1.1.10version>dependency>

2. 配置springboot配置文件

# spring数据源配置
spring:datasource:# druid连接池type: com.alibaba.druid.pool.DruidDataSource# mysql驱动driver-class-name: com.mysql.cj.jdbc.Driver# 数据库连接地址url: jdbc:mysql://localhost:3306/javatest?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai# 用户名、密码username: rootpassword: cxk666# druid连接池配置# 初始化连接池最大值,连接中活跃数量最大值initial-size: 10max-active: 8# 获取连接等待的最长时间(毫秒)max-wait: 60000# 申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。test-while-idle: true# 既作为检测的间隔时间又作为testWhileIdel执行的依据time-between-eviction-runs-millis: 60000# 销毁线程时检测当前连接的最后活动时间和当前时间差大于该值时,关闭当前连接(配置连接在池中的最小生存时间)min-evictable-idle-time-millis: 30000# 用来检测数据库连接是否有效的sql 必须是一个查询语句(oracle中为 select 1 from dual)validation-query: select 1 from dual# 申请连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为truetest-on-borrow: false# 归还连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为truetest-on-return: false# 是否缓存preparedStatement, 也就是PSCache,PSCache对支持游标的数据库性能提升巨大,比如说oracle,在mysql下建议关闭。pool-prepared-statements: false# 置监控统计拦截的filters,去掉后监控界面sql无法统计,stat: 监控统计、Slf4j:日志记录、waLL: 防御sqL注入filters: stat,wall,slf4j# 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100max-pool-prepared-statement-per-connection-size: -1# 合并多个DruidDataSource的监控数据use-global-data-source-stat: true# 通过connectProperties属性来打开mergeSql功能;慢SQL记录connect-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000web-stat-filter:# 是否启用StatFilter默认值trueenabled: true# 添加过滤规则url-pattern: /*# 忽略过滤的格式exclusions: /druid/*,*.js,*.gif,*.jpg,*.png,*.css,*.icostat-view-servlet:# 是否启用StatViewServlet默认值trueenabled: true# 访问路径为/druid时,跳转到StatViewServleturl-pattern: /druid/*# 是否能够重置数据reset-enable: false# 需要账号密码才能访问控制台,默认为rootlogin-username: adminlogin-password: 123456# IP白名单allow: 127.0.0.1# IP黑名单(共同存在时,deny优先于allow)deny:

12.SpringBoot整合MyBatis

1.引入依赖

<dependency><groupId>org.mybatis.spring.bootgroupId><artifactId>mybatis-spring-boot-starterartifactId><version>1.3.2version>dependency>

2.修改SpringBoot配置文件

mybatis:#xml文件路径映射(xml文件要和接口文件同名)mapper-locations: com/huawei/bootdemo2/mybatis/dao/*.xml#dto别名映射type-aliases-package: com.huawei.bootdemo2.mybatis.domainconfiguration:map-underscore-to-camel-case: true #驼峰映射规则   log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #mybatis默认日志

3. 在启动类上添加一个扫描mapper接口的注解

@MapperScan("com.example.springbootdemo2023.mybatis.dao")// mapper接口所在的包
@SpringBootApplication
public class SpringBootDemo2023Application {public static void main(String[] args) {SpringApplication.run(SpringBootDemo2023Application.class, args);}}

4.正常编写mybatis的接口和xml文件

使用代码生成器做,忽略

5.配置maven静态资源打包

因为xml文件是存在java源代码目录,默认情况下maven只会打包java文件

pom.xml中配置

<build>...<resources><resource><directory>src/main/resourcesdirectory><includes><include>**/*.propertiesinclude><include>**/*.xmlinclude><include>**/*.ymlinclude><include>**/*.yamlinclude><include>**/banner.txtinclude>includes><filtering>falsefiltering>resource><resource><directory>src/main/javadirectory><includes><include>**/*.propertiesinclude><include>**/*.xmlinclude>includes><filtering>falsefiltering>resource>resources>

5. 测试

此案例为在controller中引入mapper接口,在开发中要进行分层哟

@Controller
@RequestMapping("/login")
public class LoginController {@Autowiredprivate TGoodsMapper goodsMapper;@RequestMapping(value = "/test",method = RequestMethod.GET)@ResponseBodypublic TGoods test(){TGoods tGoods = goodsMapper.selectByPrimaryKey("101");return tGoods;}}

6.SpringBoot集成Mybatis分页工具

PageHepler

1. 引入依赖

<dependency><groupId>com.github.pagehelpergroupId><artifactId>pagehelper-spring-boot-starterartifactId><version>1.3.0version>
<exclusions><exclusion><artifactId>mybatis-spring-boot-starterartifactId><groupId>org.mybatis.spring.bootgroupId>exclusion>exclusions>dependency>

2.创建分页结果集对象

/*** 模块名称:接收分页的结果DTO* 模块类型:* 编码人:高靖博* 创建时间:2023/3/1* 联系电话:18587388612*/
@Data
public class MyPager<T> implements Serializable {private int page;//结果的页码private int pageSize;//每页显示行数private List<T> rows;//分页当前页的结果集private long total;//不分页所有数据总和(用于页码生成)}

3.创建接收分页查询参数实体

/*** 模块名称:用于接收分页查询参数* 模块类型:* 编码人:高靖博* 创建时间:2023/3/1* 联系电话:18587388612*/
@Data
public class MyPageBand implements Serializable {private int page;private int size;}

4. 如果出现循环依赖问题

如果你使用的jdk是8~10版本,只能将springBoot版本降低至2.5.5

5.测试

@Autowiredprivate TGoodsMapper goodsMapper;@RequestMapping(value = "/test",method = RequestMethod.GET)@ResponseBodypublic MyPager test(MyPageBand page){//创建条件对象TGoodsExample example = new TGoodsExample();//创建mybatis条件对象TGoodsExample.Criteria criteria = example.createCriteria();//        criteria.andNameLike("%六个核弹%");
//        criteria.andPriceBetween(new BigDecimal(20),new BigDecimal(30));//1.创建分页对象MyPager<TGoods> myPager = new MyPager<TGoods>();//2.调用分页工具设置分页参数(页码,每页显示多少行数据)Page<TGoods> goodsPage = PageHelper.startPage(page.getPage(), page.getSize());//3.执行mapper的查询接口操作goodsMapper.selectByExample(example);// !!!!!!!List<TGoods> result = goodsPage.getResult();long total = goodsPage.getTotal();//数据查询的所有行数值myPager.setTotal(total);myPager.setRows(result);myPager.setPage(page.getPage());myPager.setPageSize(page.getSize());return myPager;}

13.SpringBoot整合MyBatis-plus

一切为简单而生

1. 替换依赖

<dependency><groupId>com.baomidougroupId><artifactId>mybatis-plus-boot-starterartifactId><version>3.5.1version>dependency>

2.修改SpringBoot配置文件

#mybatis-plus配置
mybatis-plus:#dto别名映射type-aliases-package: com.example.springbootdemo2023.mybatis.domain#xml文件路径映射(xml文件要和接口文件同名)mapper-locations: com/example/springbootdemo2023/mybatis/dao/**/*.xmlconfiguration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #开启日志map-underscore-to-camel-case: false# 全局变量配置# 逻辑删除-如:每个表中都有一个通用的字段isDelete描述当前数据是否被删除,1:已删除 0:未删除global-config:db-config:# 当逻辑删除应该设置什么值:1logic-delete-value: 1logic-not-delete-value: 0logic-delete-field: isDelete

3.定义myBatis-plus数据库表实体

@Data
@TableName("t_goods")
public class TGoods implements Serializable {// id一定要标注,也就表明:每个表都必须有主键@TableId(value = "goodsID",type = IdType.NONE)private String goodsID;private String name;private BigDecimal price;private String typeName;
}

4. 使用MyBatis-plus定义mapper接口的方法(发生改变)

  1. 创建mybatismapper接口集成mybatis-plus的BaseMapper接口
  2. 接口处定义泛型:泛型是当前mapper接口操作对应的数据库实体类型

baseMapper已经提前准备好所有通用的接口方法(增、删、改、查、分页查)

特殊需要自己手动实现的内容在定义到接口和xml文件中

@Mapper
public interface TGoodsMapper extends BaseMapper<TGoods> {}

5. 定义一个空的和mapper接口同名的xml文件


DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.springbootdemo2023.mybatis.dao.goods.TGoodsMapper">mapper>

只要完成以上3、4两个步骤,mybatis-plus就已经完成了代码生成自动注入

6.测试

@Autowiredprivate TGoodsMapper goodsMapper;@RequestMapping(value = "/test",method = RequestMethod.GET)@ResponseBodypublic MyResult test(MyPageBand page){MyResult result = new MyResult();TGoods tGoods = goodsMapper.selectById("101");result.setData(tGoods);return result;}

14. MyBatis-Plus

  1. mybatis-plus:关于DO实体类的定义方法(Java中要有一个类和数据库中的表一一对应)
  2. mybatis-plus:mapper映射文件和接口的写法
  3. MyBatis-plus:实现零sql代码增删改查(使用baseMapper中的方法)
  4. Mybatis-plus代码生成器的配置

1. MyBatis-plus-DO实体的定义规则

1.@TableName(表名)-必写

实现类和表一一映射

@Data
@TableName("t_goods")
public class TGoods implements Serializable {...   
}

2. @TableId-描述主键字段-必写

value参数:规定映射的表中主键字段名称

type参数:用于定义主键的类型(主键策略 使用IdType来定义)

​ IdType.AUTO:使用数据库自己的自增键模式实现id生成,一定记住数据库要设置自增才管用

​ IdType.NONE: 不实现自动生成主键,没有约束

IdType.INPUT: 不实现自动生成主键,约束该属性必须有值,且要让开发者自己定义

​ IdType.ASSIGN_ID:通过mybatis机制生成自增的整型值

IdType.ASSIGN_UUID: 通过mybatis机制生成-UUID值

@Data
@TableName("t_goods")
public class TGoods implements Serializable {// id一定要标注,也就表明:每个表都必须有主键@TableId(value = "goodsID",type = IdType.ASSIGN_UUID)private String goodsID;private String name;private BigDecimal price;private String typeName;
}

3.@TableField- 普通字段的定义描述-非必填

value参数:规定映射的表中与之映射的字段名

exist参数:(boolean)

​ false:当前实体对应表中可能没有这个字段,防止mybatis会生成该字段的增、删、‘改代码

​ true:当前实体对应表中有这个字段,且true是默认值

fill参数:填充功能( 删除的节点也会触发UPDATE修改策略 )

​ FieldFill.INSERT: 当插入时触发填充策略

​ FieldFill.UPDATE:当修改时触发填充策略

​ FieldFill.INSERT_UPDATE: 当修改或新增时触发填充策略

@Data
@TableName("t_goods")
public class TGoods implements Serializable {// id一定要标注,也就表明:每个表都必须有主键@TableId(value = "goodsID",type = IdType.ASSIGN_UUID)private String goodsID;private String name;private BigDecimal price;private String typeName;//当操作新增时,该字段自动填写当前时间@TableField(value = "insertTime",fill = FieldFill.INSERT)// 在什么时候要做某个事情private Date insertTime;@TableField(value = "updateTime",fill = FieldFill.INSERT_UPDATE)private Date updateTime;}
当填充策略定义好,该如何填充需要手动定义实现
/*** 模块名称:mybatis-plus字段自动填充策略实现* 模块类型:* 编码人:高靖博* 创建时间:2023/3/2* 联系电话:18587388612*/
@Component
public class MyBatisPlusFillHandler implements MetaObjectHandler {//当触发新增填充策略时会调用的方法@Overridepublic void insertFill(MetaObject metaObject) {//要给表中的insertTime字段设置一个当前系统时间setFieldValByName("inserTime",new Date(),metaObject);}//当触发修改填充策略时会调用的方法@Overridepublic void updateFill(MetaObject metaObject) {//要给表中的insertTime字段设置一个当前系统时间setFieldValByName("updateTime",new Date(),metaObject);}
}

测试代码

@Autowiredprivate TGoodsMapper goodsMapper;@RequestMapping(value = "/test",method = RequestMethod.GET)@ResponseBodypublic MyResult test(MyPageBand page){MyResult result = new MyResult();TGoods tGoods = new TGoods();tGoods.setName("iPhone1000");tGoods.setPrice(new BigDecimal("50"));tGoods.setTypeName("手机");int insert = goodsMapper.insert(tGoods);result.setData(insert);return result;}@RequestMapping(value = "/test2",method = RequestMethod.GET)@ResponseBodypublic MyResult test2(MyPageBand page){MyResult result = new MyResult();TGoods tGoods = new TGoods();tGoods.setGoodsID("101");tGoods.setName("switch");tGoods.setPrice(new BigDecimal("2"));int insert = goodsMapper.updateById(tGoods);result.setData(insert);return result;}@RequestMapping(value = "/test3",method = RequestMethod.GET)@ResponseBodypublic MyResult test3(MyPageBand page){MyResult result = new MyResult();int insert = goodsMapper.deleteById("101");result.setData(insert);return result;}

2.mybatis-plus:mapper映射文件和接口的写法

接口文件(XXXMapper.java)

实现 BaseMapper接口

BaseMapper提供了基于泛型定义的增、删、改、查、分页方法

BaseMapper源码public interface BaseMapper<T> extends Mapper<T> {int insert(T entity);int deleteById(Serializable id);int deleteById(T entity);int deleteByMap(@Param("cm") Map<String, Object> columnMap);int delete(@Param("ew") Wrapper<T> queryWrapper);int deleteBatchIds(@Param("coll") Collection<?> idList);int updateById(@Param("et") T entity);int update(@Param("et") T entity, @Param("ew") Wrapper<T> updateWrapper);T selectById(Serializable id);List<T> selectBatchIds(@Param("coll") Collection<? extends Serializable> idList);List<T> selectByMap(@Param("cm") Map<String, Object> columnMap);default T selectOne(@Param("ew") Wrapper<T> queryWrapper) {List<T> ts = this.selectList(queryWrapper);if (CollectionUtils.isNotEmpty(ts)) {if (ts.size() != 1) {throw ExceptionUtils.mpe("One record is expected, but the query result is multiple records", new Object[0]);} else {return ts.get(0);}} else {return null;}}default boolean exists(Wrapper<T> queryWrapper) {Long count = this.selectCount(queryWrapper);return null != count && count > 0L;}Long selectCount(@Param("ew") Wrapper<T> queryWrapper);List<T> selectList(@Param("ew") Wrapper<T> queryWrapper);List<Map<String, Object>> selectMaps(@Param("ew") Wrapper<T> queryWrapper);List<Object> selectObjs(@Param("ew") Wrapper<T> queryWrapper);<P extends IPage<T>> P selectPage(P page, @Param("ew") Wrapper<T> queryWrapper);<P extends IPage<Map<String, Object>>> P selectMapsPage(P page, @Param("ew") Wrapper<T> queryWrapper);
}

sql映射文件xml(XXXXMapper.xml)

和mybatis没有区分,只要mapper标签中 namespace属性定义的是同名的mapper接口全限定名即可


DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.springbootdemo2023.mybatis.dao.goods.TGoodsMapper">...
mapper>

3.MyBatis-plus:实现零sql代码增删改查(使用baseMapper中的方法)

1. 新增-insert

 TGoods tGoods = new TGoods();tGoods.setName("iPhone1000");tGoods.setPrice(new BigDecimal("50"));tGoods.setTypeName("手机");int insert = goodsMapper.insert(tGoods);

2.修改

update方法:

​ 参数1:需要更新的实体对象

​ 参数2:更新条件

TGoods tGoods = new TGoods();tGoods.setName("掌中宝");//更新条件QueryWrapper<TGoods> updateWrapper = new QueryWrapper<>();// 修改goodsID为101的数据// where goodsID = '101'updateWrapper.eq("goodsID","101");int insert = goodsMapper.update((tGoods),updateWrapper);

updateById

参数1:需要更新的实体对象,必须传递要更新数据的主键字段值

TGoods tGoods = new TGoods();tGoods.setGoodsID("101");tGoods.setName("掌中宝12312312312");// where 主键字段名=101int insert = goodsMapper.updateById(tGoods);// 主键字段必须有值

3.删除操作

deleteById(Serializable keyid) : 直接传入主键值

参数1: 必须传递要删除数据的主键字段值

int insert = goodsMapper.deleteById("101");

deleteById(实体参数):该实体对象中主键属性必须有值

TGoods tGoods = new TGoods();tGoods.setGoodsID("101");int insert = goodsMapper.deleteById(tGoods);

delete:

参数1:传递条件对象

//删除价格在10元以及10元以上,30元以下的数据QueryWrapper<TGoods> deleteWarapper = new QueryWrapper<>();/*** ge:双参数写法==》   >=* ge:三参数写法:第一个参数描述是否使用等于*    如: ge(true,"price",10);   ===》   price>=10*         ge(false,"price",10);   ===》   price>10*/deleteWarapper.ge(true,"price",10);deleteWarapper.le(false,"price",30);int insert = goodsMapper.delete(deleteWarapper);

deleteBatchIds: 批量根据主键值删除

参数1:传递保存着要删除的主键值的集合

List<String> ids = new ArrayList<>();ids.add("101");ids.add("3552f64ba1f71fb41b2a612d636ce186");int insert = goodsMapper.deleteBatchIds(ids);

4.查询

1.selectList-根据条件查询结果集
//查询未被删除的数据QueryWrapper<TGoods> tGoodsQueryWrapper = new QueryWrapper<>();List<TGoods> tGoods = goodsMapper.selectList(tGoodsQueryWrapper);result.setData(tGoods);
2.selectMap-根据条件查询结果集-结果集是List类型
//查询未被删除的数据QueryWrapper<TGoods> tGoodsQueryWrapper = new QueryWrapper<>();List<Map<String, Object>> maps = goodsMapper.selectMaps(tGoodsQueryWrapper);
3.selectCount-条件查询统计结果集的行数
//查询未被删除的数据QueryWrapper<TGoods> tGoodsQueryWrapper = new QueryWrapper<>();Long aLong = goodsMapper.selectCount(tGoodsQueryWrapper);
4.selectOne-条件查询结果只接收一行数据
//查询未被删除的数据QueryWrapper<TGoods> tGoodsQueryWrapper = new QueryWrapper<>();// 查询结果只有一行数据时可以使用该方法,//如果有多行数据就会抛出:One record is expected, but the query result is multiple recordsTGoods tGoods = goodsMapper.selectOne(tGoodsQueryWrapper);
5.selectById-根据主键字段查询
TGoods tGoods = goodsMapper.selectById("101");
6. mybatis-plus分页查询

想要实现分页,首先要进行分页组件的配置

在启动类中添加如下代码

//分页配置@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));// 分页的方法-以mysql分页方式实现return interceptor;}
1.selectPage-条件分页方法-使用baseMapper接口中的分页方法
 page.setPage(1);//第一页page.setSize(2);//每页显示2行MyPager<TGoods> pager = new MyPager<>();//查询商品名字中有"P"的商品QueryWrapper<TGoods> queryWrapper = new QueryWrapper<>();queryWrapper.like("name","P");Page<TGoods> tGoodsPage = goodsMapper.selectPage(PageDTO.of(page.getPage(), page.getSize()), queryWrapper);List<TGoods> records = tGoodsPage.getRecords();//分页的结果long total = tGoodsPage.getTotal();//不分页所有数据的行数pager.setPageSize(page.getSize());pager.setRows(records);pager.setTotal(total);pager.setPage(page.getPage());
2.特殊自定义的接口方法如何分页

mapper接口定义

/*** 自定义分页写法* @param of mp 的分页参数* @param goods 自己条件实体* @return IPage*/IPage<TGoods> selectGoodsPages(Page of, @Param("goods") TGoods goods);

xml定义

<!-- 虽然传入了分页参数,但是不需要用参数写limit语句,mp会自动拼接生成 --><!-- 自定义查询sql语句,就不会拼接逻辑删除字段条件了,需要手动添加 --><select id="selectGoodsPages" resultType="com.example.springbootdemo2023.mybatis.domain.goods.TGoods">select * from t_goods<where><if test="goods.name!=null and goods.name!=''">and name like '%${goods.name}%'</if></where></select>

测试实现

page.setPage(1);//第一页page.setSize(2);//每页显示2行MyPager<TGoods> pager = new MyPager<>();TGoods tGoods = new TGoods();tGoods.setName("P");// 查询name中包含P的商品条件IPage<TGoods> tGoodsIPage = goodsMapper.selectGoodsPages(PageDTO.of(page.getPage(), page.getSize()), tGoods);List<TGoods> records = tGoodsIPage.getRecords();//分页的结果long total = tGoodsIPage.getTotal();//不分页所有数据的行数pager.setPageSize(page.getSize());pager.setRows(records);pager.setTotal(total);pager.setPage(page.getPage());

15.MyBatis-plus代码生成器

生成:

controller类、service接口、service实现类、数据库映射实体类、mapper接口和mapper.xmlsql映射文件

1. 引入freemarker框架依赖

<dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-freemarkerartifactId>
dependency>

2.引入mybatis-plus代码生成工具包

<dependency><groupId>com.baomidougroupId><artifactId>mybatis-plus-generatorartifactId><version>3.5.2version>dependency>

3.编写一个代码生成器

private final static String URL = "jdbc:mysql://localhost:3306/familydb?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai";private final static String USER_NAME = "root";private final static String PWD = "cxk666";private final static String AUTHOR = "GaoJingBo";private final static String OUT_PUT_DIR = "D://mybatis";private final static String PARENT_PACKAGE_NAME = "com.gdones.fmbase.business";private final static String PARENT_MODEL_NAME = "ckt";private final static String TABLE_NAME = "t_ckt_designes";private final static String PREFIX = "t_";public static void main(String[] args) {FastAutoGenerator.create(URL, USER_NAME, PWD).globalConfig(builder -> {builder.author(AUTHOR) // 设置作者.enableSwagger() // 开启 swagger 模式.fileOverride() // 覆盖已生成文件.dateType(DateType.ONLY_DATE)// 日期类型.commentDate("yyyy-MM-dd") //公共默认日期格式.outputDir(OUT_PUT_DIR); // 指定输出目录}).packageConfig(builder -> {builder.parent(PARENT_PACKAGE_NAME) //设置父路径根包.moduleName(PARENT_MODEL_NAME) //设置模块名称.entity("dto") //dto实体.service("service") //业务接口.serviceImpl("service.impl") //业务实现.mapper("mapper") //mybatis-plus-mapper接口.xml("mapper.xml") mybatis-plus-mapper接口映射xml.controller("controller") //控制器.other("other");}).strategyConfig(builder -> {builder.controllerBuilder().enableHyphenStyle().enableRestStyle();builder.mapperBuilder().enableMapperAnnotation();builder.entityBuilder().enableLombok().logicDeleteColumnName("isDelete")// 逻辑删除表字段名.logicDeletePropertyName("isDelete")// 逻辑删除实体属性名// 添加填充规则.addTableFills(new Column("insertTime", FieldFill.INSERT)).addTableFills(new Column("updateTime", FieldFill.INSERT_UPDATE)).idType(IdType.NONE);builder.addInclude(TABLE_NAME) // 设置需要生成的表名.enableSkipView()//跳过视图.addTablePrefix(PREFIX); // 设置过滤表前缀}).templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板.execute();

4. 完整的使用方法

1. 将生成的代码拷贝到根包下

2. 修改mybatis-plus-mapper以及xml映射规则路径

#mybatis-plus配置
mybatis-plus:#dto别名映射 !!!!!!!!!type-aliases-package: com.example.springbootdemo2023.bus.**.dto#xml文件路径映射(xml文件要和接口文件同名) !!!!!!!mapper-locations: classpath*:com/example/springbootdemo2023/bus/dao/**/mapper/*.xml
3. 修改启动类上MapperSacn的路径
@MapperScan("com.example.springbootdemo2023.bus.**.mapper") !!!!!
@SpringBootApplication
public class SpringBootDemo2023Application {。。。
4. 检查一下你的包结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-omoZ5nyw-1678073315615)(笔记图片/image-20230302172547865.png)]

5.编写代码-Controller为入口编写
@RestController
@RequestMapping("/goods/goods")
public class GoodsController {@Resource(name = "goodsServiceImpl")private IGoodsService goodsService;@GetMapping("/getGoodsByID")public MyResult getGoodDataByGoodID(String id){MyResult result = new MyResult();// 调用代码生成器生成的方法,业务层零代码直接可以实现增删改查Goods byId = goodsService.getById(id);result.setData(byId);return result;}}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部