Mybatis是一个ORM轻量级框架,我们用的时候感觉很蛋疼,很多基础语句都需要手写,开发效率低。我了解了一下Mybatis自带的generator感觉不是很好用,正好这时候我发现了mybatis-flex,还挺顺手的。
pom.xml需要引入mybatis-flex的starter,其中,springboot3,建议手动引用mybatis-spring,避免版本不兼容问题。
根据官方文档说明,我们可以选择hikariCP 和 Druid连接池,我没有测试其他连接池,如果使用的是 druid 数据库连接池,则需要添加数据源类型的配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
。
<dependency>
<groupId>com.mybatis-flex</groupId>
<artifactId>mybatis-flex-spring-boot-starter</artifactId>
<version>1.5.5</version>
<exclusions>
<exclusion>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>3.0.0</version>
</dependency>
在使用时,需要在实体类上加入@Table注解,value属性是表名,schema属性是库名。
在引用后,刷新maven,执行对应模块的maven clean package会生成 xxxTableDef文件(默认生成位置在 模块/target/generated-sources/annotations/实体类包/table/DailyTrainCarriageTableDef.java),这个文件我们之后再看。
例如:有实体类 乘车人
import com.mybatisflex.annotation.Table;
import io.swagger.v3.oas.annotations.media.Schema;
import java.util.Date;
@Schema(description = "乘车人")
@Table("passenger")
public class Passenger {
@Schema(description = "id")
private Long id;
@Schema(description = "会员id")
private Long memberId;
@Schema(description = "乘车人姓名 ")
private String name;
@Schema(description = "乘车人身份证")
private String idCard;
@Schema(description = "乘车人类型")
private String type;
@Schema(description = "创建时间")
private Date createTime;
@Schema(description = "更新时间")
private Date updateTime;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getMemberId() {
return memberId;
}
public void setMemberId(Long memberId) {
this.memberId = memberId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getIdCard() {
return idCard;
}
public void setIdCard(String idCard) {
this.idCard = idCard;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Date getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(getClass().getSimpleName());
sb.append(" [");
sb.append("Hash = ").append(hashCode());
sb.append(", id=").append(id);
sb.append(", memberId=").append(memberId);
sb.append(", name=").append(name);
sb.append(", idCard=").append(idCard);
sb.append(", type=").append(type);
sb.append(", createTime=").append(createTime);
sb.append(", updateTime=").append(updateTime);
sb.append("]");
return sb.toString();
}
}
增:
连同主键插入,业务中已经生成主键了,建议这样。
passengerMapper.insertWitPk(passenger);
忽略主键插入,由数据库端或配置了SQL拦截器可以这样
passengerMapper.insert(passenger);
改:
要保存的数据带有主键,根据主键where定位更新
passengerMapper.update(passenger);
查:
查询数据的时候,我们可以使用mybatis-flex 生成的QueryWrapper 进行构建查询条件。
结构如下:
QueryWrapper.create()
.select() //这里面构造字段,例如passenger实体类,PASSENGER.ALL_COLUMNS这是刚刚生成的PassengerTableDef类的静态字段。
.where() //这里面构造where查询条件,例如PASSENGER.MEMBER_ID.eq(memberId)
[.and() .or[]]
.order by()
--------------------------------------
你可以像使用sql一样使用查询构造器,遇事不决点一点就好。
最后,使用passengerMapper.selectListByQuery(queryWrapper)即可
同时也提供了passengerMapper.selectOneByQuery()
passengerMapper.selectCountByQuery()等API,都是望文知义的
删
根据主键删除
int len = passengerMapper.deleteById(id);//返回值是影响行数
int len = passengerMapper.deleteByIds(ids);//返回值是影响行数
-------------------------------------------------------------------------------------------------------------------------------
需要注意的是,你可以在删、改、查的时候,都可以使用QueryWrapper来构造where条件
同时,如果你想在控制台查看实时输出语句,你需要加入配置类,使用mybatis自带的输出实现即可。
import com.mybatisflex.core.mybatis.FlexConfiguration;
import com.mybatisflex.spring.boot.ConfigurationCustomizer;
import org.apache.ibatis.logging.stdout.StdOutImpl;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyConfigurationCustomizer implements ConfigurationCustomizer {
@Override
public void customize(FlexConfiguration configuration) {
configuration.setLogImpl(StdOutImpl.class);
}
}