mybatis-plus
mybatis-plus:是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
(其他架构搭配如ssm待补充)
目前项目里面使用的是springBoot,所以第一步只需要添加对应的启动器即可,如下图:(version为版本标签,可以像下图那样作引用,然后统一写在<properties>标签里面,也直接写在version版本里面)
第二步配置yml/properties,这里以yml文件为示例:
mapper-locations:为扫描xml文件的位置
map-underscore-to-camel-case:mybatis默认是属性名和数据库字段名一一对应的,即数据库表列:user_name,实体类属性:user_name,但是java需要遵守驼峰命名法,所以实体类属性必须是useName,使用这个配置就可以开启驼峰功能,数据库和实体类一一对应
log-impl:内置的日志工厂提供日志功能,指定使用哪个日志实现类
logic-delete-value,logic-not-delete-value:逻辑删除,配合实体类上的@TableLogic注解共同起作用,实际就是对数据库进行软删除,但是也无法再查出该条数据
type-enums-package:适用枚举属性,配合以下的枚举类进行使用:
当进行增删改查的时候,属性就会自动适配枚举,使得代码更加简洁
第三步,编写实体类entity:
@TableName("table_name"):对应数据表的名字
@TableId(type = IdType.AUTO):自动id
@TableField(""):对应数据表字段
第四步,编写实体类对应的Mapper接口:
@Repository 它用于将数据访问层 (DAO 层 ) 的类标识为 Spring Bean。具体只需将该注解标注在 DAO类上即可。
@Mapper 目的为了不些mapper映射文件,也可以用@MapperScan("包位置"),也可以使用该注解,在启动类上面,就不用每一个mapper文件都写@Mapper
基本到这里就可以使用mybaits-plus的原生方法了,如果原生方法不够用,还可以编写自己的特有方法,就像mybatis一样,配置多一个mapper.xml文件即可,如下
mybaits-plus Mapper层原生方法:
insert——插入,插入一条记录,对应一个实体类,返回对应的id
delete——删除:
delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper)——根据entity条件,删除匹配的记录,如下图:
deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList)——根据匹配的id数组批量删除,如下图:
里面是集合框架list的集合对象
deleteById(Serializable id)——根据id删除记录,如下图:
deleteByMap(@Param(Constants.COLUMN_MAP) Map<String,Object> columnMap)——根据columnMap条件删除记录
其实就是对应字段name为张三,性别为男这两个条件作筛选删除
总结:比较常用的是第一三种方法,第一种方法可以使用Wrapper对象作链式编程,比deleteByMap要快
update——更新
update(@Param(Constants.ENTITY) T entity,@Param(Conants.WRAPPER) Wrapper<T> updateWrapper)——根据实体条件更新
这里就是根据adId作为条件去更新,但是要注意,第一个实体类的属性只要不为null都会set进去,所以如果该实体类有默认值就要注意这点
updateById(@Param(Constants.ENTITY) T entity)——根据id更新记录
这里同样要注意,storeAd实体类需要有id主键,且不为null的都会作为set去更新
select——查询
selectById(Serializable id)——根据id查询实体类
selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper)——根据实体类条件查询,如下图
根据实体类的条件查询一条记录,如果搜索出多条会报错
selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList)——根据id批量查询
只要是list集合的对象即可
selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper)——根据实体类条件查询所有结果
selectByMap(@Param(Constants.COLUMN_MAP) Map<String,Object> columnMap);
其实就是对应字段name为张三,性别为男这两个条件作筛选查找出对应的实体类
selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper)——根据条件查询实体类,并且实体类以Map的形式返回
Map的key为实体类的属性名,value则为实体类的属性数据,值得注意的是,这样查询出来的数据,如果属性为null的话,是不会设置进Map的,只有在yml/properties文件里面设置了call-setters-on-nulls:true,才会将null也返回出来,以下是对照图,左图没有开启,右图为开启后,通常都会开启,避免报错,特别是在前后端作交互的时候
selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper)——根据条件查询,查询全部记录,只返回第一个字段的值
只返回了user实体类的id,也就是第一个字段
selectPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper)——根据实体类条件,查询全部记录,可以实现翻页
1.new Page<>(1L,10L)——可以指定页数和每页数据条数,第一个参数是第几页,第二参数是一页多少条数据
2.new LambdaQueryWrapper<>——根据实体类条件来查询
3.page.getRecords()——可以得到实体类的集合
4.page.getTotal()——可以获得总共有多少条数据
selectMapsPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper)
与上述的方法基本一样,只是返回的是Map形式的实体类,也与selectMaps一样,如果没有开启call-setters-on-nulls:true,遇到空的属性,是不会返回数据为null的字段
selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper)——根据条件查询记录条数
条件构造器
用于生成 sql 的 where 条件, entity 属性也用于生成 sql 的 where 条件,使用条件构造器能极大提升开发效率,不用到xml文件中再写sql
常用的有以下几个条件构造器:
LambdaQueryWrapper——使用lambda语法查询的条件构造器
LambdaUpdateWrapper——使用lambda语法做更新的条件构造器
QueryWrapper——Entity 对象封装操作类,不是用lambda语法
UpdateWrapper——Update 条件封装,用于Entity对象更新操作
以下是条件构造器的条件
例子: