mybaties-plus的使用

一、mybaties-plus和mybaties有什么区别?

首先来说mybaties是一个简单轻量半自动的orm框架,需要我们自定义mapper.xml映射文件,自己去写sql语句。这样做的好处是解除了程序代码与sql的耦合,也更利于我们来做sql优化,学习成本也更小。但是,有利就有弊,使用过hibernate和jpa的小伙伴会发现,相比于mybaties,这二位基本上很少涉及到sql语句的编写,并且作为一种全自动的orm框架,完全可以通过对象关系模型实现对数据库的操作,数据库移植性也更好。那么如果我们希望mybaties也能像hibernate那样为我们提供一些方法,让我们不用写sql语句呢,这里就出现了mybaties-plus。

本质上来说mybaties-plus(简称MP)实际上是对mybaties的一种增强,毕竟是plus嘛,是由国人团队苞米豆在Mybatis的基础上开发的框架,既保留了mybaties的原生功能,又为我们提供了通过对象关系模型实现对数据库的操作能力。类似的框架还有Mybatis Generator、Mybatis Plus Generator等。

二、mybaties-plus如何使用?
使用很简单,添加依赖,修改配置,创建接口和实体类,接下来主要涉及到的就是一些api的使用。

1、添加依赖(这里的版本号可以不写,用默认的也行)

<dependency>   
<groupId>com.baomidou</groupId>   
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>2.3</version>
</dependency>

2、yml文件配置(这里是copy官方的,可以自行百度)

mybatis-plus:  
	configuration:      
		##Mybatis Plus 打印SQL日志配置      
		log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  
		# MyBatis Mapper所对应的XML文件位置  
		#mapper-locations: classpath:/mapper/*/*Mapper.xml  	 
	global-config:    
		# 关闭MP3.0自带的banner    
		banner: false    
		db-config:      
			# 主键类型 0:数据库ID自增 1.未定义 2.用户输入 3 id_worker 4.uuid 5.id_worker字符串表示      
			id-type: 4      
			#字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"      
			field-strategy: 1      
			# 默认数据库表下划线命名      
			table-underline: true

3、创建配置类

@Configurationpublic 
class MybatisPlusConfig {    
/**     
* mybatis-plus SQL执行效率插件【生产环境可以关闭】     
* */    
@Bean    
public PerformanceInterceptor performanceInterceptor() {  
      return new PerformanceInterceptor();   
       }    
/**     * 分页插件     */    
@Bean    
public PaginationInterceptor paginationInterceptor() {        return new PaginationInterceptor();    
}}


4、创建实体类和表(其实可以只创建实体类,然后通过jpa自动的生成表,这里为了简单,就都复制粘贴过来,我也是copy的)

表结构:CREATE TABLE `user_info` ( 
 `id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT 'ID', 
 `name` varchar(32) DEFAULT NULL COMMENT '姓名',  
 `age` int(11) DEFAULT NULL COMMENT '年龄',  
 `skill` varchar(32) DEFAULT NULL COMMENT '技能',  
 `evaluate` varchar(64) DEFAULT NULL COMMENT '评价',  
 `fraction` bigint(11) DEFAULT NULL COMMENT '分数',  
 PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8mb4 COMMENT='学生信息表';
 
表数据:
INSERT INTO `user_info` VALUES (1, '小明', 20, '画画', '该学生在画画方面有一定天赋', 89);INSERT INTO `user_info` VALUES (2, '小兰', 19, '游戏', '近期该学生由于游戏的原因导致分数降低了', 64);INSERT INTO `user_info` VALUES (3, '张张', 18, '英语', '近期该学生参加英语比赛获得二等奖', 90);
INSERT INTO `user_info` VALUES (4, '大黄', 20, '体育', '该学生近期由于参加篮球比赛,导致脚伤', 76);
INSERT INTO `user_info` VALUES (5, '大白', 17, '绘画', '该学生参加美术大赛获得三等奖', 77);
INSERT INTO `user_info` VALUES (7, '小龙', 18, 'JAVA', '该学生是一个在改BUG的码农', 59);
INSERT INTO `user_info` VALUES (9, 'Sans', 18, '睡觉', 'Sans是一个爱睡觉,并且身材较矮骨骼巨大的骷髅小胖子', 60);
INSERT INTO `user_info` VALUES (10, 'papyrus', 18, 'JAVA', 'Papyrus是一个讲话大声、个性张扬的骷髅,给人自信、有魅力的骷髅小瘦子', 58);
INSERT INTO `user_info` VALUES (11, '删除数据1', 3, '画肖像', NULL, 61);
INSERT INTO `user_info` VALUES (12, '删除数据2', 3, NULL, NULL, 61);
INSERT INTO `user_info` VALUES (13, '删除数据3', 3, NULL, NULL, 61);
INSERT INTO `user_info` VALUES (14, '删除数据4', 5, '删除', NULL, 10);
INSERT INTO `user_info` VALUES (15, '删除数据5', 6, '删除', NULL, 10);

这里需要用到几个Lombok的注解,idea安装一下Lombok插件


编写Entity类
/**
 * @Description 学生信息实体类 
 * 这里可以让这个类继承Model对象,这样可以通过对象自身进行简单的curd,不用通过mapper,当       
 * 然也可以不继承 */
@Data@TableName("user_info")
//@TableName中的值对应着表名
public class UserInfoEntity extends Model{    
/**     * 主键     * 
@TableId中可以决定主键的类型,不写会采取默认值,默认值可以在yml中配置     * AUTO: 数据库ID自增     * INPUT: 用户输入ID     * ID_WORKER: 全局唯一ID,Long类型的主键     * ID_WORKER_STR: 字符串全局唯一ID     * UUID: 全局唯一ID,UUID类型的主键     * NONE: 该类型为未设置主键类型     */    
@TableId(type = IdType.AUTO)    
private Long id;    
/**     * 姓名     */    
private String name;    
/**     * 年龄     */    
private Integer age;    
/**     * 技能     */    
private String skill;    
/**     * 评价     */    
private String evaluate;    
/**     * 分数     */    
private Long fraction;}

5、最关键的使用来啦

对于mapper层,只需要让我们的mapper接口继承BaseMapper 接口,就可以进行简单的crud啦。(这里就列出了方法,因为我很懒,具体的可以自己去加工一下)
public interface UserInfoMapper extends BaseMapper {}
新增:UserInfoMapper .insert(这里放新增的对象UserInfoEntity)
修改:UserInfoMapper .updateAllColumnById(这里放修改的对象UserInfoEntity)
删除: 根据id删除 UserInfoMapper .deleteById(id)
根据条件删除 UserInfoMapper .deleteByMap(columnMap) map集合
根据id批量删除 UserInfoMapper.deleteBatchIds(idList) id的list集合
查询:根据id查询 UserInfoMapper.selectById(id)
通过id批量查询 UserInfoMapper.selectBatchIds(idList)
根据条件查询一条记录 UserInfoMapper.selectOne(UserInfoEntity)
根据条件查询多条记录 UserInfoMapper.selectByMap(columnMap)

分页查询 UserInfoMapper.selectPage(new Page<>(1,2),null)
分页查询要传入两个参数,第一个是Page对象传入分页信息(当前页和页大小),第二个是 mybaties-plus为我们提供的条件构造器对象EntityWrapper。我们自己编写的mapper接口只需要继承了Base Mapper接口,就可以进行简单的crud操作,但是如果要对查询的结果进行过滤和筛选呢,这个时候我们就需要用到EntityWrapper对象了。
接下来我们就通过几个例子,看这个EntityWrapper对象如何使用(这里是copy别的博主的,参考链接现在奉上)
https://www.jianshu.com/p/ceb1df475021
需求:
我们需要分页查询 tb_employee 表中,年龄在 18~50 之间性别为男且姓名为 xx 的所有用户,这时候我们该如何实现上述需求呢?
使用MyBatis : 需要在 SQL 映射文件中编写带条件查询的 SQL,并用PageHelper 插件完成分页. 实现以上一个简单的需求,往往需要我们做很多重复单调的工作。
使用MP: 依旧不用编写 SQL 语句,MP 提供了功能强大的条件构造器 ------ EntityWrapper。
接下来就直接看几个案例体会EntityWrapper的使用。

1、分页查询年龄在18 - 50且gender为0、姓名为tom的用户:
List employees = emplopyeeDao.selectPage(new Page(1,3),
new EntityWrapper()
.between(“age”,18,50)
.eq(“gender”,0)
.eq(“last_name”,“tom”)
);

注:由此案例可知,分页查询和之前一样,new 一个page对象传入分页信息即可。至于分页条件,new 一个EntityWrapper对象,调用该对象的相关方法即可。between方法三个参数,分别是column、value1、value2,该方法表示column的值要在value1和value2之间;eq是equals的简写,该方法两个参数,column和value,表示column的值和value要相等。注意column是数据表对应的字段,而非实体类属性字段。

2、查询gender为0且名字中带有老师、或者邮箱中带有a的用户:
List employees = emplopyeeDao.selectList(
new EntityWrapper()
.eq(“gender”,0)
.like(“last_name”,“老师”)
//.or()//和or new 区别不大
.orNew()
.like(“email”,“a”)
);

注:未说分页查询,所以用selectList即可,用EntityWrapper的like方法进行模糊查询,like方法就是指column的值包含value值,此处like方法就是查询last_name中包含“老师”字样的记录;“或者”用or或者orNew方法表示,这两个方法区别不大,用哪个都可以,可以通过控制台的sql语句自行感受其区别。

3、查询gender为0,根据age排序,简单分页:

List employees = emplopyeeDao.selectList(
new EntityWrapper()
.eq(“gender”,0)
.orderBy(“age”)//直接orderby 是升序,asc
.last(“desc limit 1,3”)//在sql语句后面追加last里面的内容(改为降序,同时分页)
);

注:简单分页是指不用page对象进行分页。orderBy方法就是根据传入的column进行升序排序,若要降序,可以使用orderByDesc方法,也可以如案例中所示用last方法;last方法就是将last方法里面的value值追加到sql语句的后面,在该案例中,最后的sql语句就变为select ······ order by desc limit 1, 3,追加了desc limit 1,3所以可以进行降序排序和分页。

4、分页查询年龄在18 - 50且gender为0、姓名为tom的用户:

条件构造器除了EntityWrapper,还有Condition。用Condition来处理一下这个需求:
List employees = emplopyeeDao.selectPage(
new Page(1,2),
Condition.create()
.between(“age”,18,50)
.eq(“gender”,“0”)
);

注:Condition和EntityWrapper的区别就是,创建条件构造器时,EntityWrapper是new出来的,而Condition是调create方法创建出来。

5、根据条件更新:

@Test
public void testEntityWrapperUpdate(){
Employee employee = new Employee();
employee.setLastName(“苍老师”);
employee.setEmail(“cjk@sina.com”);
employee.setGender(0);
emplopyeeDao.update(employee,
new EntityWrapper()
.eq(“last_name”,“tom”)
.eq(“age”,25)
);
}

注:该案例表示把last_name为tom,age为25的所有用户的信息更新为employee中设置的信息。

6、根据条件删除:

emplopyeeDao.delete(
new EntityWrapper()
.eq(“last_name”,“tom”)
.eq(“age”,16)
);

注:该案例表示把last_name为tom、age为16的所有用户删除。

前面说了如果实体类继承了Model还可以直接通过对象进行一些crud操作,参考链接就放这里了
https://www.jianshu.com/p/a4d5d310daf8

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值