一,Mybatis-Plus的概述
Mybatis-Plus是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 操作智能分析阻断,也可自定义拦截规则,预防误操作
支持的数据库: 任何能使用 mybatis 进行 CRUD, 并且支持标准 SQL 的数据库,具体支持情况如下,如果不在下列表查看分页部分教程 PR 您的支持
- mysql,oracle,db2,h2,hsql,sqlite,postgresql,sqlserver,Phoenix,Gauss ,clickhouse,Sybase,OceanBase,Firebird,cubrid,goldilocks,csiidb
架构:
二,MybatisPlus的常用注解
常见的注解有:
- @TableName
- @TableID
- @TableField
一,@TableName
@TableName是表名注解
主要作用:对表名进行重新指定,默认接口类名为表名,假如不一致就需要通过这个注解指定表名
属性 | 类型 | 必须指定 | 默认值 | 描述 |
value | String | 否 | "" | 表名 |
schema | String | 否 | "" | schema |
keepGlobalPrefix | boolean | 否 | false | 是否保持使用全局的 tablePrefix 的值(如果设置了全局 tablePrefix 且自行设置了 value 的值) |
resultMap | String | 否 | "" | xml 中 resultMap 的 id |
autoResultMap | boolean | 否 | false | 是否自动构建 resultMap 并使用(如果设置 resultMap 则不会进行 resultMap 的自动构建并注入) |
excludeProperty | String[] | 否 | {} | 需要排除的属性名(@since 3.3.1) |
关于autoResultMap的说明:
mp会自动构建一个ResultMap并注入到mybatis里(一般用不上).下面讲两句: 因为mp底层是mybatis,所以一些mybatis的常识你要知道,mp只是帮你注入了常用crud到mybatis里 注入之前可以说是动态的(根据你entity的字段以及注解变化而变化),但是注入之后是静态的(等于你写在xml的东西) 而对于直接指定typeHandler,mybatis只支持你写在2个地方:
- 定义在resultMap里,只作用于select查询的返回结果封装
- 定义在insert和updatesql的#{property}里的property后面(例:#{property,typehandler=xxx.xxx.xxx}),只作用于设置值 而除了这两种直接指定typeHandler,mybatis有一个全局的扫描你自己的typeHandler包的配置,这是根据你的property的类型去找typeHandler并使用.
二,@TableID
TableID作用:标注注解,这个注解通过指定主键名和主键的类型
Table属性:
属性 | 类型 | 必须指定 | 默认值 | 描述 |
value | String | 否 | "" | 主键字段名 |
type | Enum | 否 | IdType.NONE | 主键类型 |
主键的类型:
值 | 描述 |
AUTO | 数据库ID自增 |
NONE | 无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT) |
INPUT | insert前自行set主键值 |
ASSIGN_ID | 分配ID(主键类型为Number(Long和Integer)或String)(since 3.3.0),使用接口IdentifierGenerator的方法nextId(默认实现类为DefaultIdentifierGenerator雪花算法) |
ASSIGN_UUID | 分配UUID,主键类型为String(since 3.3.0),使用接口IdentifierGenerator的方法nextUUID(默认default方法) |
注:默认为NONE,假如进行插入操作,数据库设置着主键递增,那么在映射类上也必须是AUTO
三,@TableField
TableField作用:对普通字段进行标识
属性 | 类型 | 必须指定 | 默认值 | 描述 |
value | String | 否 | "" | 数据库字段名 |
el | String | 否 | "" | 映射为原生 #{ ... } 逻辑,相当于写在 xml 里的 #{ ... } 部分 |
exist | boolean | 否 | true | 是否为数据库表字段 |
condition | String | 否 | "" | 字段 where 实体查询比较条件,有值设置则按设置的值为准,没有则为默认全局的 %s=#{%s},参考(opens new window) |
update | String | 否 | "" | 字段 update set 部分注入, 例如:update="%s+1":表示更新时会set version=version+1(该属性优先级高于 el 属性) |
insertStrategy | Enum | N | DEFAULT | 举例:NOT_NULL: insert into table_a(<if test="columnProperty != null">column</if>) values (<if test="columnProperty != null">#{columnProperty}</if>) |
updateStrategy | Enum | N | DEFAULT | 举例:IGNORED: update table_a set column=#{columnProperty} |
whereStrategy | Enum | N | DEFAULT | 举例:NOT_EMPTY: where <if test="columnProperty != null and columnProperty!=''">column=#{columnProperty}</if> |
fill | Enum | 否 | FieldFill.DEFAULT | 字段自动填充策略 |
select | boolean | 否 | true | 是否进行 select 查询 |
keepGlobalFormat | boolean | 否 | false | 是否保持使用全局的 format 进行处理 |
jdbcType | JdbcType | 否 | JdbcType.UNDEFINED | JDBC类型 (该默认值不代表会按照该值生效) |
typeHandler | Class<? extends TypeHandler> | 否 | UnknownTypeHandler.class | 类型处理器 (该默认值不代表会按照该值生效) |
numericScale | String | 否 | "" | 指定小数点后保留的位数 |
二,BaseMapper接口的增删改查方法
BaseMapper接口是Mybatis-Plus提供的一个单表操作接口,内部封装了对单表操作的增删更改查方法
BaseMapper是Mybatis-Plus增强Mybatis的重要内容,但它也有局限性这个接口的方法只适合于单表操作,假如要多表操作和连接查询等,需要使用Mybatis的操作方式,它本身也兼容Mybatis的所有操作
在继承BaseMapper接口时,必须要声明它的泛型,表示它需要对操作的表和查询时返回的类型
BaseMapper的方法:
- insert(T entity):插入
- deleteById(Serializable id):按id删除
- deleteByMap(@Param("cm") Map<String, Object> columnMap):按照Map条件删除
- delete(@Param("ew") Wrapper<T> queryWrapper):queryWrapper条件删除
- deleteBatchIds(@Param("coll") Collection<? extends Serializable> idList):ID批量删除
- updateById(@Param("et") T entity):按照ID进行更新
- update(@Param("et") T entity, @Param("ew") Wrapper<T> updateWrapper):按照updateWrapper进行条件删除
- selectById(Serializable id):按照ID进行查询
- selectBatchIds(@Param("coll") Collection<? extends Serializable> idList):按照ID进行批量查询
- selectByMap(@Param("cm") Map<String, Object> columnMap):Map进行条件查询,单条查询
- selectOne(@Param("ew") Wrapper<T> queryWrapper):按照queryWrapper进行条件查询,单条查询
- selectCount(@Param("ew") Wrapper<T> queryWrapper):按照条件查询并返回查询到的记录条数
- selectList(@Param("ew") Wrapper<T> queryWrapper):按照queryWrapper进行条件查询,多条查询
- selectPage(E page, @Param("ew") Wrapper<T> queryWrapper):按照queryWrapper条件进行分页查询
一,BaseMapper接口的增删改操作
一,插入操作
插入操作提供BaseMapper提供的insert(T entity)方法
这个方法进行插入操作,插入后它会将插入信息进行回填到实体类
注:在插入时,需要提前设置主键ID的类型
例:
① 映射的实体类
@Data @ToString //设置映射的数据库表名 @TableName("mybatistest") public class mybatisplus_pojo { //插入时使设置ID类型为自增 @TableId(type = IdType.AUTO) int id; String name; int sex; int age; }
② 映射接口
//BaseMapper的泛型表示操作的具体表映射实体类 public interface mybatisplus_mapper extends BaseMapper<mybatisplus_pojo> { @Override int insert(mybatisplus_pojo entity); }
③ 测试
@SpringBootTest class SpringbootMybatisplusDomeApplicationTests { @Autowired mybatisplus_mapper mapper; @Test void insert(){ //设置要插入数据,数据通过实体类的方式插入 mybatisplus_pojo mybatisplusPojo = new mybatisplus_pojo(); mybatisplusPojo.setName("FQ"); mybatisplusPojo.setAge(20); mybatisplusPojo.setSex(0); int insert = mapper.insert(mybatisplusPojo); if(insert!=0){ System.out.println("插入数据成功!"); }else { System.out.println("插入数据失败!"); } }}
二,更新操作
Updata更新主要分两种:
- updateById:按照ID做更新
- update:按照条件做更新
一,按照ID做更新
① 映射接口
public interface mybatisplus_mapper extends BaseMapper<mybatisplus_pojo> { //@Param("et")底层默认命名为et @Override int updateById(@Param("et") mybatisplus_pojo entity); }
② 测试
@Test void updateid(){ mybatisplus_pojo mybatisplusPojo = new mybatisplus_pojo(); //必须要设置ID mybatisplusPojo.setId(1); mybatisplusPojo.setName("UpdataID"); mybatisplusPojo.setSex(1); mybatisplusPojo.setAge(10); int i = mapper.updateById(mybatisplusPojo); if(i!=0){ System.out.println("更新数据成功!"); }else { System.out.println("更新数据失败!"); } }
二,按照条件更新
通过update方法进行更新,它有两个主要参数:
- T entity:更新的实体
- Wrapper<T> updateWrapper:更新的条件
Wrapper接口有两个主要的实现类:
- QueryWrapper:这个较为通用,CRUD条件判断都可以使用
- UpdateWrapper:这个使用Update操作的条件判断,其他操作也能使用
例:
① 映射接口
public interface mybatisplus_mapper extends BaseMapper<mybatisplus_pojo> { @Override int update(@Param("et") mybatisplus_pojo entity, @Param("ew")Wrapper<mybatisplus_pojo> updateWrapper); }
② 测试1(QueryWrapper)
@SpringBootTest class SpringbootMybatisplusDomeApplicationTests { @Autowired mybatisplus_mapper mapper; @Test void updatewrapper(){ mybatisplus_pojo mybatisplusPojo = new mybatisplus_pojo(); mybatisplusPojo.setName("UpdataWrapper"); mybatisplusPojo.setSex(0); mybatisplusPojo.setAge(100); //条件 QueryWrapper<mybatisplus_pojo> queryWrapper = new QueryWrapper(); //判断id字段的值为3,相当于where id=3 queryWrapper.eq("id",3); int update = mapper.update(mybatisplusPojo, queryWrapper); System.out.println(update); } }
③测试2(UpdateWrapper)
@SpringBootTest class SpringbootMybatisplusDomeApplicationTests { @Autowired mybatisplus_mapper mapper; @Test void updatewrapper(){ mybatisplus_pojo mybatisplusPojo = new mybatisplus_pojo(); mybatisplusPojo.setName("UpdataWrapper"); mybatisplusPojo.setSex(0); mybatisplusPojo.setAge(100); UpdateWrapper<mybatisplus_pojo> updateWrapper = new UpdateWrapper<>(); //set方法是UpdateWrapper区别于QueryWrapper的一个特点,它可以指定要更新的值,最后接条件 updateWrapper.set("sex",0).set("name","UpdateWrapper").eq("id",2); //因为updateWrapper设置了要更新的值,所有这个实体类设置为null int update = mapper.update(null,updateWrapper); System.out.println(update); } }
三,删除操作
删除操作分为四种形式:
- deleteById:按照ID进行单个删除
- deleteByMap:把条件封装到Map集合中进行条件删除
- delete:Wrapper条件删除
- deleteBatchIds:按照ID进行批量删除
一,按照ID单个删除
① 映射接口
public interface mybatisplus_mapper extends BaseMapper<mybatisplus_pojo> { @Override int deleteById(Serializable id); }
② 测试
@Test void deleteid(){ int i = mapper.deleteById(1L); System.out.println(i); }
二,使用Map集合进行条件删除
deleteByMap就是把条件封装到Map进行删除
Map集合:
- Key:为表的字段
- Value:为字段的值
如:{"name",""wql},条件为name的值为wql
多个Map条件底层通过AND连接
例:
① 映射接口
public interface mybatisplus_mapper extends BaseMapper<mybatisplus_pojo> { @Override int deleteByMap(Map<String, Object> columnMap); }
② 测试
@Test void deletemap(){ Map<String,Object> map = new HashMap<>(); //设置删除条件,name字段的值为FQ,age字段的值为100,两个条件直接默认是AND连接 map.put("name","FQ"); map.put("age","100"); int i = mapper.deleteByMap(map); System.out.println(i); }
三, Wrapper指定条件删除
使用QueryWrapper进行条件删除
例:
① 映射接口
public interface mybatisplus_mapper extends BaseMapper<mybatisplus_pojo> { @Override int delete(@Param("ew")Wrapper<mybatisplus_pojo> queryWrapper); }
② 测试
@Test void deletewrapper(){ //写法一 QueryWrapper<mybatisplus_pojo> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("name","FQ").eq("age","100"); //写法二:传入条件对象 mybatisplus_pojo m = new mybatisplus_pojo(); m.setName("FQ");//name为FQ m.setAge(100);//age为100 QueryWrapper<mybatisplus_pojo> queryWrapper1 =new QueryWrapper<>(m);//将对象作为条件传入,这种写法可以避免你的字段写错 int i = mapper.delete(queryWrapper); System.out.println(i); }
四,按照ID进行批量删除
deleteBatchIds(Collection<? extends Serializable> idList)传入一个顶级集合Collection接口类型的对象
例:
① 映射接口
public interface mybatisplus_mapper extends BaseMapper<mybatisplus_pojo> { @Override int deleteBatchIds(Collection<? extends Serializable> idList); }
② 测试
@Test void deletedibatch(){ //连续删除ID为2,3,4的数据 List<Integer> integers = Arrays.asList(2, 3, 4); mapper.deleteBatchIds(integers); }
二,BaseMapper接口查询方法
BaseMapper提供了很多查询操作的方法:
- selectById:id查询
- selectBatchIds:id批量查询
- selectByMap:查询单条数据
- selectOne:查询单条数据
- selectCount:查询数据记录数
- selectList:查询列表
- selectPage:分页查询
一,ID查询
通过selectByid方法
例:
① 映射接口
public interface mybatisplus_mapper extends BaseMapper<mybatisplus_pojo> { @Override mybatisplus_pojo selectById(Serializable id); }
② 测试
@SpringBootTest class SpringbootMybatisplusDomeApplicationTests { @Autowired mybatisplus_mapper mapper; @Test void contextLoads() { mybatisplus_pojo selectById = mapper.selectById(1L); System.out.println(selectById); }}
二,根据ID批量查询
通过selectBatchIds进行批量查询
例:
① 映射接口
public interface mybatisplus_mapper extends BaseMapper<mybatisplus_pojo> { @Override List<mybatisplus_pojo> selectBatchIds(@Param("coll")Collection<? extends Serializable> idList); }
② 测试
@Test void selectibatch(){ List<Integer> list =Arrays.asList(3,2); List<mybatisplus_pojo> list1 = mapper.selectBatchIds(list); for(mybatisplus_pojo m :list1){ System.out.println(m); } }
③ 结果
三,使用Wrapper条件查询单条数据
使用selectOne(@Param("ew")Wrapper<mybatisplus_pojo> queryWrapper)进行单条数据的条件查询,传入一个queryWrapper条件对象
例:
① 映射接口
public interface mybatisplus_mapper extends BaseMapper<mybatisplus_pojo> { @Override mybatisplus_pojo selectOne(@Param("ew")Wrapper<mybatisplus_pojo> queryWrapper); }
② 测试
@Test void selectone(){ QueryWrapper<mybatisplus_pojo> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("name","da").eq("age","21"); mybatisplus_pojo mybatisplusPojo = mapper.selectOne(queryWrapper); System.out.println(mybatisplusPojo); }
③ 结果
四,根据条件查询数据的列表
通过selectList(@Param("ew")Wrapper<mybatisplus_pojo> queryWrapper)进行条件批量查询
例:
① 映射接口
public interface mybatisplus_mapper extends BaseMapper<mybatisplus_pojo> { @Override List<mybatisplus_pojo> selectList(@Param("ew")Wrapper<mybatisplus_pojo> queryWrapper); }
② 测试
@Test void selectlist() { QueryWrapper<mybatisplus_pojo> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("name","da"); List<mybatisplus_pojo> mybatisplus_pojos = mapper.selectList(queryWrapper); for(mybatisplus_pojo m :mybatisplus_pojos){ System.out.println(m); }
③ 结果
五,记录条数的查询
通过selectCount(@Param("ew") Wrapper<T> queryWrapper)方法查询记录的条数
例:
① 映射接口
public interface mybatisplus_mapper extends BaseMapper<mybatisplus_pojo> { @Override Integer selectCount(@Param("ew")Wrapper<mybatisplus_pojo> queryWrapper); }
② 测试
@Test void selectcount(){ QueryWrapper<mybatisplus_pojo> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("name","da"); Integer integer = mapper.selectCount(queryWrapper); System.out.println(integer); }
③ 结果
六,分页查询
通过selectPage(E page, @Param("ew")Wrapper<mybatisplus_pojo> queryWrapper)方法进行分页查询
两个重要参数:
- page:分页对象
- Wrapper:查询条件
Page的构造参数:
- long current:当前也
- long size:每一页的数据大小
在分页查询前需要先配置分页插件:
@Configuration public class page_config { @Bean//配置分页 public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2)); return interceptor; } }
例:
① 映射接口
public interface mybatisplus_mapper extends BaseMapper<mybatisplus_pojo> { @Override <E extends IPage<mybatisplus_pojo>> E selectPage(E page, @Param("ew")Wrapper<mybatisplus_pojo> queryWrapper); }
@Test void selectpage() { //设置分页对象Page Page<mybatisplus_pojo> pojoPage = new Page<>(1,1); //设置条件查询 QueryWrapper<mybatisplus_pojo> queryWrapper = new QueryWrapper<>(); queryWrapper.like("name","da"); //分页查询并获取分页查询对象 Page<mybatisplus_pojo> pojoPage1 = mapper.selectPage(pojoPage, queryWrapper); System.out.println("查询的总页数:"+pojoPage1.getPages()); System.out.println("查询的总条数:"+pojoPage1.getTotal()); System.out.println("当前页数:"+pojoPage1.getCurrent()); //通过分页查询对象获取当前页的数据 List<mybatisplus_pojo> records = pojoPage1.getRecords(); for(mybatisplus_pojo m :records){ System.out.println(m); } }
③ 结果
四,MybatisPlus的常用配置
MybatisPlus是对Mybatis的增强,Mybatis能配置的内容Mybatisplus也能配置
一,配置主配置文件和映射配置文件地址
这个配置很重要,但需要用映射xml来实现SQL时就必须进行配置,一般用注解或者BaseMapper的话是不用配置,但想要混合进行开发时就需要配置
- config-location:配置主配置文件地址
- mapper-locations:配置映射配置文件地址(springboot自动配置有默认值:classpath*:/mapper/**/*.xml)
mybatis-plus: config-location: mapper-locations:
二,其他配置
一,typeAliasesPackage
Mybatis别名包扫描路径,通过改属性可以给包中的类注册别名,注册后在Mapper对应的XML文件中可以直接使用类名,而不再需要写全限定类名
mybatis-plus: type-aliases-package:
二,mapUnderscoreToCamelCase
是否开启自动驼峰命名规则映射,即假如从数据库列名为W_Table到java中就可以映射为wTable
- 类型:Boolean
- 默认值:true
mybatis-plus: configuration: map-underscore-to-camel-case:
注:此属性在Mybatis中默认为false,在MybatisPlus中,此属性也将用于最终SQL的selectbody,如果数据库命名符合规则就无需使用@TableField指定数据库字段名
该参数配置不能和主配置文件同时存在,会配置冲突,假如有主配置文件的话,需要在主配置文件中配置驼峰
三,cacheEnabled
全局开启或者关闭配置文件中所有映射器已经配置的任何任何缓存,默认为true
mybatis-plus: configuration: cache-enabled: true
三,DB策略的配置
一,idType
全局默认主键类型,设置后,即可省略实体对象中的@TableId(type=idType.AUTO)配置
mybatis-plus: global-config: db-config: id-type: auto
二,tablePrefix
表前缀,全局配置后可省略@TableName()配置,但这个也不绝对,它只是在默认类名为表名的前提下加了一个前缀
mybatis-plus: global-config: db-config: table-prefix:
六,Wrapper条件构造器
二,对Wrapper中的方法进行区分和使用
一,条件判断
-
eq:等于
-
ne:不等于
-
gt:大于
-
ge:大于等于
-
lt:小于
-
le:小于等于
-
between:在……之间,例:BETWEEN 1 AND 5 在1和之间的值符合条件
-
notbetween:不在……之间,例:NOTBETWEEN 1 AND 5 不在5和1之间的值符合替条件
-
in:是否包含
-
notin:是否不包含
QueryWrapper<mybatisplus_pojo> queryWrapper = new QueryWrapper<>(); //name字段的值等于wql queryWrapper.eq("name","wql"); //name字段的值不等于wql queryWrapper.ne("name","wql"); //age字段的值大于18 queryWrapper.gt("age","18"); //age字段的值大于等于20 queryWrapper.ge("age","20"); //age字段的值小于12 queryWrapper.lt("age","12"); //age字段的值在15和20之间 queryWrapper.between("age",15,20); //age字段的值不在14和20之间 queryWrapper.notBetween("age",14,20); //age字段的值包1,2,3其中一个 queryWrapper.in("age",Arrays.asList(1,2,3)); //age字段的值不包含包1,2,3 queryWrapper.notIn("age",Arrays.asList(1,2,3));
二,模糊查询
-
底层SQL:LIKE '%值%'
-
例:like("name","WQL") ---> name like '%WQL%'
-
Not Like '%值%'
-
例:notlike("name","WQL") ---> name not like '%王%'
-
Like '%值'
-
例:likeleft("name","WQL") ---> name like '%WQL'
-
LIKE '值%'
-
例:likeright("name","WQL") ---> name like 'WQL%'
三,逻辑查询
QueryWrapper<mybatisplus_pojo> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("name","da") .gt("age","18") .between("age",1,3); //底层转化的SQL SELECT COUNT( * ) FROM mybatistest WHERE (name = da AND age > 18 AND age BETWEEN 1 AND 3)
这多个条件之间默认是通过AND连接的,意味这些条件都必须符合,当也可以指定其他的如:or
- and:and对条件连接
- or:or对条件连接
四,排序
- orderBy:升序排序,默认是asc
- orderByAsc:升序排序
- orderByDESC:降序
例:
//按照age字段进行升序排列,第二个参数为是否使用asc进行排序 queryWrapper.orderBy(true,true,"age"); //按照age字段进行升序排列 queryWrapper.orderByAsc("age"); 按照age字段进行降序排列 queryWrapper.orderByDesc("age");
五,选择查询字段
默认select查询时是查询使用的字段,也可以通过wrapper中select方法进行指定需要查询的字段
select(String... columns):可变的参数,通过传入N个字段
例:
QueryWrapper<mybatisplus_pojo> queryWrapper = new QueryWrapper<>(); queryWrapper.select("name","age");//只查询显示name和age字段的数据 //底层SQL SELECT name,age FROM mybatistest WHERE (name = ? AND age = ?)
Comments | NOTHING
Warning: Undefined variable $return_smiles in /www/wwwroot/wql_luoqin_ltd/wp-content/themes/Sakura/functions.php on line 1109