前言:
眼前朋友们对“mybatisplus找不到mapper方法”可能比较关怀,你们都需要知道一些“mybatisplus找不到mapper方法”的相关知识。那么小编在网摘上汇集了一些对于“mybatisplus找不到mapper方法””的相关文章,希望同学们能喜欢,朋友们快快来了解一下吧!一、MyBatis-Plus简介
MyBatis-Plus官网参考教程
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
二、特性
无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作
三、快速开始1、创建一张user表
//user表存在,删除user表DROP TABLE IF EXISTS user;//创建user表CREATE TABLE user( id BIGINT(20) NOT NULL COMMENT '主键ID', name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名', age INT(11) NULL DEFAULT NULL COMMENT '年龄', email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱', PRIMARY KEY (id));
//删除user表数据DELETE FROM user;//user表插入数据INSERT INTO user (id, name, age, email) VALUES(1, 'Jone', 18, 'test1@baomidou.com'),(2, 'Jack', 20, 'test2@baomidou.com'),(3, 'Tom', 28, 'test3@baomidou.com'),(4, 'Sandy', 21, 'test4@baomidou.com'),(5, 'Billie', 24, 'test5@baomidou.com');
2、创建Spring Boot工程(1)依赖引入(pom.xml)
注意:引入 MyBatis-Plus 之后请不要再次引入 MyBatis 以及 MyBatis-Spring,以避免因版本差异导致的问题。
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> <!--mybatis-plus--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.0.5</version> </dependency> <!--mysql--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!-- 模板引擎 --> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-engine-core</artifactId> <version>2.0</version> </dependency> <!--lombok用来简化实体类,只需要加一个注解,就不用写get和set方法--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency></dependencies> <!-- 项目打包时会将java目录中的*.xml文件也进行打包 --> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> </build>
(2)书写项目配置(application.properties)
# 服务端口server.port=8001# 服务名spring.application.name=service-user# 环境设置:dev、test、prodspring.profiles.active=dev# mysql数据库连接spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:3306/MyBatis-plus?serverTimezone=GMT%2B8spring.datasource.username=rootspring.datasource.password=root#返回json的全局时间格式spring.jackson.date-format=yyyy-MM-dd HH:mm:ssspring.jackson.time-zone=GMT+8#mybatis日志mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl#配置mapper xml文件的路径mybatis-plus.mapper-locations=classpath:com/dashu/user/mapper/xml/*.xml
(3) 代码生成器
import com.baomidou.mybatisplus.annotation.DbType;import com.baomidou.mybatisplus.annotation.IdType;import com.baomidou.mybatisplus.generator.AutoGenerator;import com.baomidou.mybatisplus.generator.config.DataSourceConfig;import com.baomidou.mybatisplus.generator.config.GlobalConfig;import com.baomidou.mybatisplus.generator.config.PackageConfig;import com.baomidou.mybatisplus.generator.config.StrategyConfig;import com.baomidou.mybatisplus.generator.config.rules.DateType;import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;import org.junit.Test;/** * 代码生成器 */public class GetCode { @Test public void main1() { // 1、创建代码生成器 AutoGenerator mpg = new AutoGenerator(); // 2、全局配置 GlobalConfig gc = new GlobalConfig(); String projectPath = System.getProperty("user.dir"); System.out.println(projectPath); gc.setOutputDir("项目绝对地址" + "/src/main/java");//生成路径 gc.setAuthor("dashu");//作者名 gc.setOpen(false); //生成后是否打开资源管理器 gc.setFileOverride(false); //重新生成时文件是否覆盖 /* * mp生成service层代码,默认接口名称第一个字母有 I * UcenterService * */ gc.setServiceName("%sService"); //去掉Service接口的首字母I gc.setIdType(IdType.ID_WORKER_STR); //主键策略 gc.setDateType(DateType.ONLY_DATE);//定义生成的实体类中日期类型 gc.setSwagger2(true);//开启Swagger2模式 mpg.setGlobalConfig(gc); // 3、数据源配置 DataSourceConfig dsc = new DataSourceConfig(); dsc.setUrl("jdbc:mysql://localhost:3306/MyBatis-plus?serverTimezone=GMT%2B8"); dsc.setDriverName("com.mysql.cj.jdbc.Driver"); dsc.setUsername("root"); dsc.setPassword("root"); dsc.setDbType(DbType.MYSQL); mpg.setDataSource(dsc); // 4、包配置 PackageConfig pc = new PackageConfig(); pc.setModuleName("user"); //模块名 pc.setParent("com.dashu"); pc.setController("controller"); pc.setEntity("entity"); pc.setService("service"); pc.setMapper("mapper"); mpg.setPackageInfo(pc); // 5、策略配置 StrategyConfig strategy = new StrategyConfig(); strategy.setInclude("user");//表名,根据表生成代码 strategy.setNaming(NamingStrategy.underline_to_camel);//数据库表映射到实体的命名策略 strategy.setTablePrefix(pc.getModuleName() + "_"); //生成实体时去掉表前缀 strategy.setColumnNaming(NamingStrategy.underline_to_camel);//数据库表字段映射到实体的命名策略 strategy.setEntityLombokModel(true); // lombok 模型 @Accessors(chain = true) setter链式操作 strategy.setRestControllerStyle(true); //restful api风格控制器 strategy.setControllerMappingHyphenStyle(true); //url中驼峰转连字符 mpg.setStrategy(strategy); // 6、执行 mpg.execute(); }}
四、MyBatis-Plus的简单CURD1、 insert
@Autowired private UserMapper userMapper;@Test public void insertUser(){ User user = new User(); user.setName("张国荣"); user.setAge(18); user.setEmail("zhangguorong@qq.com"); int result = userMapper.insert(user); System.out.println(result); //影响的行数 System.out.println(user); //id自动回填 }
2、 update
@Autowired private UserMapper userMapper;@Test public void testUpdateById(){ User user = new User(); user.setId(1L);//id user.setAge(20); int result = userMapper.updateById(user); System.out.println(result);//影响的行数 }
3、 查询(1)根据id查询记录
@Testpublic void testSelectById(){ User user = userMapper.selectById(1L); System.out.println(user);}
(2)通过多个id批量查询
@Testpublic void testSelectBatchIds(){ List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3)); users.forEach(System.out::println);}
(3)简单的条件查询
@Testpublic void testSelectByMap(){ HashMap<String, Object> map = new HashMap<>(); map.put("name", "张国荣"); map.put("age", 18); List<User> users = userMapper.selectByMap(map); users.forEach(System.out::println);}
注意:map中的key对应的是数据库中的列名。例如数据库user_id,实体类是userId,这时map的key需要填写user_id
4、 删除(1)根据id删除记录
@Testpublic void testDeleteById(){ int result = userMapper.deleteById(8L); System.out.println(result);}
(2)批量删除
@Test public void testDeleteBatchIds() { int result = userMapper.deleteBatchIds(Arrays.asList(8, 9, 10)); System.out.println(result); }
(3)简单的条件查询删除
@Testpublic void testDeleteByMap() { HashMap<String, Object> map = new HashMap<>(); map.put("name", "张国荣"); map.put("age", 18); int result = userMapper.deleteByMap(map); System.out.println(result);}
五、MyBatis-Plus条件构造器1、Wrapper
Wrapper :条件构造抽象类,最顶端父类AbstractWrapper :用于查询条件封装,生成 sql 的 where 条件QueryWrapper :Entity 对象封装操作类,不是用lambda语法UpdateWrapper :Update 条件封装,用于Entity对象更新操作AbstractLambdaWrapper :Lambda 语法使用 Wrapper统一处理解析 lambda 获取 column。LambdaQueryWrapper :看名称也能明白就是用于Lambda语法使用的查询WrapperLambdaUpdateWrapper :Lambda 更新封装Wrapper
2、构造器方法
eq
eq(R column, Object val)eq(boolean condition, R column, Object val)
等于 =例: eq(“name”, “老王”)—>name = ‘老王’
ne
ne(R column, Object val)ne(boolean condition, R column, Object val)
不等于 <>例: ne(“name”, “老王”)—>name <> ‘老王’
gt
gt(R column, Object val)gt(boolean condition, R column, Object val)
大于 >例: gt(“age”, 18)—>age > 18
lt
lt(R column, Object val)lt(boolean condition, R column, Object val)
小于 <例: lt(“age”, 18)—>age < 18
le
le(R column, Object val)le(boolean condition, R column, Object val)
小于等于 <=例: le(“age”, 18)—>age <= 18
between
between(R column, Object val1, Object val2)between(boolean condition, R column, Object val1, Object val2)
BETWEEN 值1 AND 值2例: between(“age”, 18, 30)—>age between 18 and 30
like
like(R column, Object val)like(boolean condition, R column, Object val)
LIKE ‘%值%’例: like(“name”, “王”)—>name like ‘%王%’
isNull
isNull(R column)isNull(boolean condition, R column)
字段 IS NULL例: isNull(“name”)—>name is nul
参考教程
五、MyBatis-Plus插件
user表添加version(版本)、isDelete(逻辑删除)、createTime(创建时间)、updateTime(更新时间)字段
1、自动填充
实体类上添加注解
@Datapublic class User { ...... //版本 @TableField(fill = FieldFill.INSERT) private Integer version; //逻辑删除 @TableField(fill = FieldFill.INSERT) private boolean isDelete; //创建时间 @TableField(fill = FieldFill.INSERT) private Date createTime; //添加时间 //@TableField(fill = FieldFill.UPDATE) @TableField(fill = FieldFill.INSERT_UPDATE) private Date updateTime;}
MyBatis-Plus元处理器
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;import org.apache.ibatis.reflection.MetaObject;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Component;import java.util.Date;/** * 自动填充元处理器 */@Componentpublic class MyMetaObjectHandler implements MetaObjectHandler { private static final Logger LOGGER = LoggerFactory.getLogger(MyMetaObjectHandler.class); @Override public void insertFill(MetaObject metaObject) { this.setFieldValByName("isDeleted", false, metaObject);//逻辑删除 this.setFieldValByName("createTime", new Date(), metaObject); this.setFieldValByName("updateTime", new Date(), metaObject); this.setFieldValByName("version", 1, metaObject);//版本 } @Override public void updateFill(MetaObject metaObject) { this.setFieldValByName("updateTime", new Date(), metaObject); }}
2、乐观锁
主要适用场景:当要更新一条记录的时候,希望这条记录没有被别人更新,也就是说实现线程安全的数据更新乐观锁实现方式:取出记录时,获取当前version更新时,带上这个version执行更新时, set version = newVersion where version = oldVersion如果version不对,就更新失败
实体类上添加注解
@Version@TableField(fill = FieldFill.INSERT)private Integer version;
乐观锁插件
/** * 乐观锁插件 */ @Bean public OptimisticLockerInterceptor optimisticLockerInterceptor() { return new OptimisticLockerInterceptor(); }
3、逻辑删除
物理删除:真实删除,将对应数据从数据库中删除,之后查询不到此条被删除数据逻辑删除:假删除,将对应数据中代表是否被删除字段状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录
实体类上添加注解
@TableLogic@TableField(fill = FieldFill.INSERT)private boolean isDelete;
逻辑删除插件
@Beanpublic ISqlInjector sqlInjector() { return new LogicSqlInjector();}
application.properties 加入配置
mybatis-plus.global-config.db-config.logic-delete-value=1mybatis-plus.global-config.db-config.logic-not-delete-value=0
4、性能分析
性能分析拦截器,用于输出每条 SQL 语句及其执行时间SQL 性能执行分析,开发环境使用,超过指定时间,停止运行。有助于发现问题
插件
/** * SQL 执行性能分析插件 * 开发环境使用,线上不推荐。 maxTime 指的是 sql 最大执行时长 */@Bean@Profile({"dev","test"})// 设置 dev test 环境开启public PerformanceInterceptor performanceInterceptor() { PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor(); performanceInterceptor.setMaxTime(3000);//ms,超过此处设置的ms则sql不执行 performanceInterceptor.setFormat(true); return performanceInterceptor;}
5、分页插件
分页插件
/** * 分页插件 */@Beanpublic PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor();}
test实例
@Testpublic void testSelectPage() { Page<User> page = new Page<>(1,5); userMapper.selectPage(page, null); page.getRecords().forEach(System.out::println); System.out.println(page.getCurrent()); System.out.println(page.getPages()); System.out.println(page.getSize()); System.out.println(page.getTotal()); System.out.println(page.hasNext()); System.out.println(page.hasPrevious());}
6、MyBatis-Plus插件类
import com.baomidou.mybatisplus.core.injector.ISqlInjector;import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;import org.mybatis.spring.annotation.MapperScan;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Profile;@Configurationpublic class MybatisPlusConfig { /** * 乐观锁插件 */ @Bean public OptimisticLockerInterceptor optimisticLockerInterceptor() { return new OptimisticLockerInterceptor(); } /** * 分页插件 */ @Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); } /** * 逻辑删除插件 * @return */ @Bean public ISqlInjector sqlInjector() { return new LogicSqlInjector(); } /** * SQL 执行性能分析插件 * 开发环境使用,线上不推荐。 maxTime 指的是 sql 最大执行时长 */ @Bean @Profile({"dev","test"})// 设置 dev test 环境开启 public PerformanceInterceptor performanceInterceptor() { PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor(); performanceInterceptor.setMaxTime(3000);//ms,超过此处设置的ms则sql不执行 performanceInterceptor.setFormat(true); return performanceInterceptor; }}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: