MyBatisPlus(1)

目录

一:MyBatisPlus的快速入门

1.1:引入Mybatisplus的依赖

1.2:定义Mapper

1.3:UserMapper.xml中的配置

[二: 常见注解](#二: 常见注解)

2.1:常见的注解

2.1.1:表中IdType的枚举

2.1.2:使用@TableField的常见场景

三:核心功能

3.1:条件构造器

3.1.1:基于QueryWrapper的查询

3.1.2:基于UpdateWrapper的更新

3.2:自定义SQL

3.2.1:利用MP构造where条件

3.2.2:自定义SQL方法调用

3.3:IService接口基本用法

1:创建一个service的接口继承IService接口

2:创建Iservice的实现类继承ServiceImpl接口

3:测试类来进行使用


MyBatisPlus是基于MyBatis的基础上增强的,简化单表的增删查改的代码。

一:MyBatisPlus的快速入门

1.1:引入Mybatisplus的依赖

XML 复制代码
  <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.2</version>
  </dependency>

1.2:定义Mapper

自定义的Mapper接口继承BaseMapper<T>.T为操作的实体类的代码。

1.3:UserMapper.xml中的配置

不用写基础的增删改查代码。

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.mp.mapper.UserMapper">


</mapper>

二: 常见注解

MyBatisPlus通过扫描实体类,并基于反射获取实体类信息作为数据库表信息。

2.1:常见的注解

|-------------------------|---------------|
| @TableName(value值) | 用来指定表名 |
| @TableId(value值) | 用来指定表中的主键字段信息 |
| @TableField(value值) | 用来指定表中的普通字段信息 |

当表中的字段名或者表明与类名或者属性名不一致时,需要设置value属性,value属性为表名或者表的字段名。


2.1.1:表中IdType的枚举

|---------------|------------------------------------------|
| AUTO | 数据库自增长 |
| INPUT | 通过set方法自行注入 |
| ASSIGN_ID | 分配ID,接口identifierGenerator的方法nextId来生成Id |

当我们在数据库当中设置Id为自增长,但在类中的id未设置自增长时,默认的是ASSIGN_ID。

2.1.2:使用@TableField的常见场景

**1:**成员变量与数据库字段名不一致

**2:**成员变量名以is开头,且是布尔值

**3:**成员变量名与数据库关键字冲突(@TableField("`order`")

**4:**成员变量不是数据库字段@TableField(exist=false),用来标记成员变量不是数据库字段

案例演示1: 当数据库表名和类名不一致时。在类的前面加上其底下的注解

java 复制代码
@TableName("tb_user")

案例演示2:当我们设置数据库的id是自增的,此时,需要我们对于@TableId(type=IdType.Auto)

java 复制代码
  @TableId(type= IdType.AUTO)
    private Long id;

三:核心功能

3.1:条件构造器

条件构造器关系:

3.1.1:基于QueryWrapper的查询

需求1:查询名字中带o的,存款大于等于1000的人的id,username,info,balance字段

SQL语句:select id ,username,info,balance from user where username like "%O%"and balance>1000;

需求2:更新用户为jack的用户的余额为2000

SQL语句:update user set balance=2000 where username='jack'.

利用QueryWrapper进行实现需求1:

java 复制代码
 void testQueryWrapper(){
       QueryWrapper<User> queryWrapper=new QueryWrapper<User>()
               .select("id","username","info","balance")
               .ge("balance",1000)
               .like("username","o");
       List<User> users = userMapper.selectList(queryWrapper);
       System.out.println(users);
   }

查询结果:

利用QueryWrapper查询需求2:

java 复制代码
  @Test
    void testQueryWrapper1(){
        //更新查询的结果
       User user=new User();
       user.setBalance(2000);
       //更新的条件
       QueryWrapper<User> queryWrapper=new QueryWrapper<User>().eq("username","jack");
        //执行更新
       userMapper.update(user,queryWrapper);
                
   }

更新的结果:

3.1.2:基于UpdateWrapper的更新

需求1:更新id为1,2,4的用户的余额,扣200

SQL语句:update user set balance=balance-200 where id in(1,2,4)

java 复制代码
   @Test
    void testUpdateWrapper(){
        //由于是多个用户,所以我们不能使用上一个方式的更新,且balance-200,所以要使用UpdateWrapper
        List<Long> ids=List.of(1L,2L,4L);
       UpdateWrapper<User> userUpdateWrapper=new UpdateWrapper<User>()
               .setSql("balance=balance-200")
               .in("id",ids);
        userMapper.update(null,userUpdateWrapper);
   }

运行结果:

3.2:自定义SQL

我们可以利用Mybatis的wrapper来构造复杂的where条件,剩下的我们自己写。MybatisPlus适用于where条件的设置,剩下我们自己来写。

3.2.1:利用MP构造where条件

java 复制代码
    //1:更新条件
       List<Long> ids=List.of(1l,2l,3l);
       int amout=200;
       QueryWrapper<User> queryWrapper=new QueryWrapper<User>().in("id",ids);

3.2.2:自定义SQL方法调用

java 复制代码
  //调用自定义方法
       userMapper.updateBalanceByIds(queryWrapper,amout);

在mapper中的方法不要忘了对于QueryWrapper添加起别名@Param("ew")

java 复制代码
@Mapper
public interface UserMapper  extends BaseMapper<User> {


    void updateBalanceByIds(@Param("ew") QueryWrapper<User> queryWrapper,@Param("amout") int amout);
}
XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.mp.mapper.UserMapper">


    <update id="updateBalanceByIds">
        update tb_user set balance=balance-#{amout} ${ew.customSqlSegment}
    </update>
</mapper>

3.3:IService接口基本用法

用法:自定义service接口继承Iservice接口,实现类继承ServiceImpl.

1:创建一个service的接口继承IService接口

java 复制代码
public interface IUserService extends IService<User> {

}

2:创建Iservice的实现类继承ServiceImpl接口

java 复制代码
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {


}

3:测试类来进行使用

java 复制代码
@SpringBootTest
class UserServiceImplTest {

    @Autowired
    private IUserService iUserService;
    @Test
    void testSaverUser(){
        User user=new User();
        user.setUsername("李磊");
        user.setPassword("123");
        user.setPhone("18688990011");
        user.setBalance(200);
        user.setInfo("{\"age\": 24, \"intro\": \"英文老师\", \"gender\": \"female\"}");
        user.setCreateTime(LocalDateTime.now());
        user.setUpdateTime(LocalDateTime.now());
        iUserService.save(user);

    }
    @Test
    public void Query(){
        List<Long> ids=List.of(1l,2l,3l);
        List<User> users = iUserService.listByIds(ids);
        for (User user : users) {
            System.out.println(user);
        }

    }


}

未完待续.....

相关推荐
XuanRanDev8 分钟前
【每日一题】LeetCode - 三数之和
数据结构·算法·leetcode·1024程序员节
王俊山IT11 分钟前
C++学习笔记----10、模块、头文件及各种主题(一)---- 模块(5)
开发语言·c++·笔记·学习
为将者,自当识天晓地。13 分钟前
c++多线程
java·开发语言
小政爱学习!15 分钟前
封装axios、环境变量、api解耦、解决跨域、全局组件注入
开发语言·前端·javascript
daqinzl21 分钟前
java获取机器ip、mac
java·mac·ip
k093331 分钟前
sourceTree回滚版本到某次提交
开发语言·前端·javascript
激流丶37 分钟前
【Kafka 实战】如何解决Kafka Topic数量过多带来的性能问题?
java·大数据·kafka·topic
神奇夜光杯38 分钟前
Python酷库之旅-第三方库Pandas(202)
开发语言·人工智能·python·excel·pandas·标准库及第三方库·学习与成长
Themberfue41 分钟前
Java多线程详解⑤(全程干货!!!)线程安全问题 || 锁 || synchronized
java·开发语言·线程·多线程·synchronized·
plmm烟酒僧42 分钟前
Windows下QT调用MinGW编译的OpenCV
开发语言·windows·qt·opencv