文章目录
一. 背景和理念
国产最受欢迎的开源框架
mybatis的增强框架,不影响mybatis的原始使用
二. 作用
简化mybatis的开发
简单数据库操作可以不用写mapper.xml
三. 阅读本文希望达到的目的
只花一个小时(可能更短)就简化你的项目开发的一大块时间。
四. 使用方法
4-1. pom.xml增加maven引用
现在一般都用springboot,就直接写和springboot结合的写法:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.1</version>
</dependency>
4-2. mapper接口继承BaseMapper接口
用过springdata-jpa的应该比较熟悉这种接口写法,如下所示:
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zyxk.uetplatform.pojo.po.DemoPo;
@Repository
public interface DemoMapper extends BaseMapper<DemoPo> {
}
4-3. Entity加上注解
用@TableName,@TableId,@TableField等字段和数据库产生关联,例如:
import java.util.Date;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@TableName("t_test")//mybatis plus注解:对应的表名。类名和数据库名一致,可以不写
@NoArgsConstructor @AllArgsConstructor//lombok注解:添加无参构造函数、添加全参构造函数
@Getter @Setter//lombok注解:添加get、set方法
public class DemoPo {
@TableId(type=IdType.ASSIGN_UUID)//mybatis plus注解:表主键
private String id;
private Integer age;
private String name;
@TableField("createtime")//字段名称和数据库字段不一致时需要使用TableField注解
private Date createTime;
@TableField(exist=false)//mybatis plus注解:该字段在数据表中没有对应字段
private String className;
}
4-4. service层直接使用内置方法
import com.zyxk.uetplatform.mapper.DemoMapper;
import com.zyxk.uetplatform.pojo.dto.DemoDto;
import com.zyxk.uetplatform.pojo.po.DemoPo;
import com.zyxk.uetplatform.pojo.po.User;
import lombok.extern.log4j.Log4j2;
@Log4j2
@Service
public class DemoService {
@Autowired
private DemoMapper demoMapper;
public List<DemoPo> test() {
//直接使用mybatis plus提供的常用简单方法
return demoMapper.selectList(null);
}
@Transactional
public int save() {
log.info("插入测试数据");
DemoPo ds = new DemoPo(null, 13, "王五", new Date(), null);
return demoMapper.insert(ds);
}
}
五. 常用方法
5-1. 增
这个用法比较单一,需要注意的是主键可以用mybatis自动生成的uuid(上面的Entity中的@TableId(type=IdType.ASSIGN_UUID)在起作用)
- demoMapper.insert(NewEntity)
删除、更新用法也比较简单
5-2. 删
- mapper.deleteById(id)
- mapper.delete(QueryWrapper)
例如:
//1. 封装where条件
DemoPo demo_where = new DemoPo();
demo_where.setName("王五");
//2. 按条件删除
mapper.delete(new QueryWrapper<DemoPo>(demo_where))
5-3. 改
- mapper.updateById(SetEntity)
- mapper.update(SetEntity, QueryWrapper)
例如:
//1. 封装where条件
DemoPo demo_where = new DemoPo();
demo_where.setName("王五");
//2. 封装set语句
DemoPo demo_set = new DemoPo();
demo_set.setAge(22);
//3. 根据where条件更新set语句(不set的字段不更新,而不是set成null)
mapper.update(demo_set, new QueryWrapper<DemoPo>(demo_where))
5-4. 查
加粗的是最常用的三个,都比较简单就不写示例了
- mapper.selectById(id)
- mapper.selectBatchIds(idList)
- mapper.selectList(QueryWrapper)
- mapper.selectCount(QueryWrapper)
- mapper.selectOne(QueryWrapper)
六. 在项目中的注意事项
除了前面提到的常用方法,其他方法不建议使用,例如:
mapper.selectList(new QueryWrapper().eq(column, val))
mapper.delete(new QueryWrapper().eq(column, val))
mapper.update(new QueryWrapper().eq(column, val))
原因:
- 上面这些方法中的出现的column不容易暴露错误(都是字符串,只要程序不执行到这一步,就发现不了错误)
- Mybatis虽然不是完全的orm框架(相比较hibernate),但如果我们不在代码里出现数据库字段,在一定程度上还算是面向对象开发的,所以上面这种直接在代码里写数据库字段的情况尽量不要出现。
- 不利于迁移数据库(很多人说基本没遇到过数据库迁移,那只是很幸运,我就遇到过两次数据库迁移,极为痛苦的经历)。
- 看过Mybatis-plus的应该知道,Mybatis-plus远不止上面示例的这些简单用法(上面介绍的这些用法几乎不用任何教程,看api就大概知道怎么用),为什么我不推荐其他很多高级用法呢,原因很简单:学习成本大(很多时候我们就是为了学一个“简化开发”的东西,结果学习的过程却极为“不简化”,也是讽刺的很)。所以我采用了一个简单的策略:只吃尖端最甜的那一口,而Mybatis-plus作为一个Mybatis增强工具正好也允许我们这么干,而不带来额外的风险。
- 那你可能会问了,那大部分稍微复杂一点查询的怎么办。原生Mybatis怎么写就怎么写咯~