mybatis-plus学习笔记

1.持久层接口—BaseMapper

创建的接口继承自BaseMapper<T>,那么基本的操作就都有了。
insert 、deleteById、updateById、selectById。

package com.example.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.entity.Employee;

public interface EmployeeMapper extends BaseMapper<Employee> {
}

测试:

@SpringBootTest
class SpringbootMybatisplus1ApplicationTests {
    @Autowired
    private EmployeeMapper employeeMapper;
@Test
    void findAllEmps() {
        List<Employee> employees = employeeMapper.selectList(null);
        employees.forEach(System.out::println);
    }
    @Test
    void testInsert1(){
        Employee e1 = new Employee(1L,"蒋瑞","男",20,"zjy@offcn.com");
        int num = employeeMapper.insert(e1);
        System.out.println("返回值:"+num);
    }
    @Test
    void testInsert(){
        Employee e1 = new Employee(2L,"张继雨","男",20,"zjy@offcn.com");
        int num = employeeMapper.insert(e1);
        System.out.println("返回值:"+num);
    }
    @Test
    void testDeleteById(){
        int num = employeeMapper.deleteById(2L);
        System.out.println("返回值:"+num);
    }
    //按照指定的条件删除对象:名字叫蒋瑞,并且性别是男的
    @Test
    void testDeleteByMap(){
        Map<String,Object> map = new HashMap<>();
        map.put("emp_name","蒋瑞");
        map.put("emp_gender","男");
        int num = employeeMapper.deleteByMap(map);
        System.out.println("返回值:"+num);
    }
    @Test
    void testdeleteBatchIds(){
        List<Long> ids = new ArrayList<>();
        ids.add(1L);
        ids.add(2L);
        int num = employeeMapper.deleteBatchIds(ids);
        System.out.println("返回值:"+num);
    }
    @Test
    void updateById(){
        Employee e1 = new Employee(2L,"张雨雨",null,20,"zjy@offcn.com");
        int num = employeeMapper.updateById(e1);
        System.out.println("返回值:"+num);
    }
    @Test
    void selectById(){
        Employee employee = employeeMapper.selectById(2L);
        System.out.println(employee);
        employee = employeeMapper.selectById(3L);
        System.out.println(employee);
    }
    @Test
    void selectBatchIds(){
        List<Long> ids = new ArrayList<>();
        ids.add(2L);
        ids.add(1367686308726788098L);
        List<Employee> employees = employeeMapper.selectBatchIds(ids);
        employees.forEach(System.out::println);
    }
    @Test
    void selectByMap(){
        Map<String,Object> map = new HashMap<>();
        map.put("emp_name","张雨雨");
        map.put("emp_gender","男");
        List<Employee> employees = employeeMapper.selectByMap(map);
        employees.forEach(System.out::println);
    }

在这里插入图片描述

2.Wrapper

Wrapper:类似对象操作的方式封装条件,一般使用他的子类QueryWrapper进行操作。

支持编程链的书写结构。qr.eq(name,aaa).and().eq(age,12);

delete update selectOne\count\list\maps\ojbs\page\mapspage

@Test
void delete(){
    //张雨雨 且 男
    QueryWrapper<Employee> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("emp_name","张雨雨").eq("emp_gender","男");
    int num = employeeMapper.delete(queryWrapper);
}

测试:

@Test
    void delete(){
        //张雨雨 且 男
        QueryWrapper<Employee> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("emp_name","张雨雨").eq("emp_gender","男");
        int num = employeeMapper.delete(queryWrapper);
    }

    @Test
    //修改名字是张春雨 或 性别为男 年龄为30
    void update(){
        Employee entity = new Employee();
        entity.setAge(30);//要修改的数据

        //组织条件
        QueryWrapper<Employee> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("emp_name","张春雨")
                .or()
                .eq("emp_gender","男");
        int num = employeeMapper.update(entity, queryWrapper);
        System.out.println(num);
    }
    //查询性别为男的
    @Test
    void selectOne(){
        QueryWrapper<Employee> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("emp_gender","女");
        Employee employee = employeeMapper.selectOne(queryWrapper);
        System.out.println(employee);
    }
    //几个男性
    @Test
    void selectCount(){
        QueryWrapper<Employee> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("emp_gender","男");
        Integer num = employeeMapper.selectCount(queryWrapper);
        System.out.println("结果集:"+num);
    }
    @Test
    void selectList(){
        //查询所有男性,且按照年龄降序排序
        QueryWrapper<Employee> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("emp_gender","男").orderByDesc("age");
        List<Employee> employees = employeeMapper.selectList(queryWrapper);
        employees.forEach(System.out::println);
    }
    @Test
    void selectMaps(){
        //查询所有男性,且按照年龄降序排序
        QueryWrapper<Employee> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("emp_gender","男").orderByDesc("age");
        List<Map<String,Object>> employees = employeeMapper.selectMaps(queryWrapper);
        for(Map<String,Object> map:employees){
            System.out.println("-----------------------");
            for(Map.Entry<String,Object> me:map.entrySet()){
                System.out.println(me.getKey()+"="+me.getValue());
            }
        }
    }
    @Test
    void selectObjs(){
        QueryWrapper<Employee> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("emp_gender","男").orderByDesc("age");
        List<Object> objects = employeeMapper.selectObjs(queryWrapper);
        for(Object obj:objects)
            System.out.println(obj);
    }
    @Test
    void selectList1(){
        //模糊查询
        QueryWrapper<Employee> queryWrapper = new QueryWrapper<>();
//        queryWrapper.like("emp_name","雨");//模糊
        queryWrapper.likeRight("emp_name","张");//姓张
        List<Employee> employees = employeeMapper.selectList(queryWrapper);
        employees.forEach(System.out::println);
    }
    @Test
    //分页查询:IPage接口,Page是IPage的实现类
    void selectPage(){
        Page<Employee> page = new Page<>(2,3);//查看第1页,每页显示3条
        Page<Employee> page1 = employeeMapper.selectPage(page, null);
        System.out.println("每页条数:"+page1.getSize());
        System.out.println("总条数:"+page1.getTotal());
        System.out.println("分页记录:"+page1.getRecords());
    }

3.字段映射

@TableId注解 主键映射
@TableName 类名和表名映射
@TableField注解 类字段名和表中字段名映射


```java

```java
//    @TableId //单独使用:表明empId是主键字段(对应数据库empId或emp_id)。自动映射
//    private Long empId;//  empId  emp_id

//    @TableId(value="emp_id") //实体类属性名和表字段名映射
//    private Long eid;

    //type指定主键生成策略。IdType.ASSIGN_ID,采用雪花算法由MP生成的唯一的ID
                        // IdType.AUTO。由数据库生成主键
    @TableId(type = IdType.AUTO)

4.业务层接口—IService

public interface EmployeeService extends IService<Employee> {
}
@Service
public class EmployeeServiceImpl
        extends ServiceImpl<EmployeeMapper, Employee>
        implements EmployeeService {

}

测试:

@Autowired
    private EmployeeService employeeService;
    @Test
    void testSave(){
        Employee employee = new Employee();
        employee.setEmpName("东方不败");
        employee.setEmail("dfbb@example.org");
        employeeService.save(employee);
    }
    @Test
    void testSaveOrUpdate(){
        Employee employee = new Employee();
        employee.setEmpId(1410231010219208706L);
        employee.setEmpName("任你行");
        employee.setEmail("rwx@example.org");
        employeeService.saveOrUpdate(employee);
    }
	@Test
    void testGetOne(){
        QueryWrapper<Employee> qw1 = new QueryWrapper<>();
        qw1.like("emp_name","任");
//        Employee one = employeeService.getOne(qw1);//存在多条记录会抛出异常
        Employee one = employeeService.getOne(qw1,false);//存在多条记录会不抛出异常,取第一条
        System.out.println(one);
    }

5.代码生成器

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.47</version>
    <scope>runtime</scope>
</dependency>
<dependency><!--mybatis plus的启动器-->
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</arti在这里插入代码片factId>
    <version>3.4.2</version>
</dependency>
<dependency><!--mybatis plus的生成器-->
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.4.1</version>
</dependency>
<dependency><!--mybatis plus生成器使用的模板技术velocity-->
    <groupId>org.apache.velocity</groupId>
    <artifactId>velocity-engine-core</artifactId>
    <version>2.3</version>
</dependency>
@Test
    void contextLoads() {
        // 代码生成器
        AutoGenerator mpg = new AutoGenerator();
        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");
        gc.setOutputDir(projectPath + "/src/main/java");
        gc.setAuthor("author");//设置作者
        gc.setOpen(false);//生成是后是否打开资源管理器
        gc.setFileOverride(false);//重新生成文件时是否覆盖
        gc.setServiceName("%sService");
        // gc.setSwagger2(true); 实体属性 Swagger2 注解
        mpg.setGlobalConfig(gc);

        // 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://localhost:3306/mybatis_plus_demo?useSSL=false");
        dsc.setDriverName("com.mysql.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword("sorry");
        dsc.setDbType(DbType.MYSQL);
        mpg.setDataSource(dsc);

        // 包配置
        PackageConfig pc = new PackageConfig();
        pc.setModuleName(null);
        pc.setParent("com.example");
        pc.setController("controller");
        pc.setEntity("entity");
        pc.setService("service");
        pc.setMapper("mapper");
        mpg.setPackageInfo(pc);

        // 5、策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setInclude("employee");//对那一张表生成代码
        strategy.setNaming(NamingStrategy.underline_to_camel);//数据库表映射到实体的命名策略
        strategy.setTablePrefix(pc.getModuleName() + "_"); //生成实体时去掉表前缀

        strategy.setColumnNaming(NamingStrategy.underline_to_camel);//数据库表字段映射到实体的命名策略
        strategy.setEntityLombokModel(true); // lombok 模型 @Accessors(chain = true) setter链式操作

        strategy.setRestControllerStyle(true); //restful api风格控制器
        strategy.setControllerMappingHyphenStyle(true); //url中驼峰转连字符

        mpg.setStrategy(strategy);

        // 6、执行
        mpg.execute();
    }

MP总结

mapper和service基础接口,字段映射、查询分页、代码生成器


版权声明:本文为qq_45411727原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。