当前位置:网站首页>MP框架基本操作(自用)

MP框架基本操作(自用)

2022-06-10 22:50:00 m0_61499313

目录

前置 条件 

依赖  

  配置信息 yml 

映射 问题

  规则 表名 

​编辑

  规则  主键 

设置字段映射关系

基础使用 

 基础查询 没有 条件

 添加 

  删除 

修改

条件选择器

QueryWrapper

     常用条件

       基本使用

UpdateWrapper

   基本使用

自定义方法(mapper 接口)

分页查询

   准备  分页 插件

  单表查询      

  多表查询 

Service

改造前

 改造后

自定义方法

自动填充

 逻辑删除


前置 条件 

依赖  

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.0</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

  配置信息 yml 

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mp_db?characterEncoding=utf-8&serverTimezone=UTC
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver

启动类 

@SpringBootApplication
@MapperScan("com.mapper")
public class SGApplication {

    public static void main(String[] args) {
        SpringApplication.run(SGApplication.class);
    }
}

映射 问题

  规则 表名 

可以在实体类的类名上加上@TableName注解进行标识

如果表名是tb_user,而实体类名是User则可以使用以下写法。

@TableName("tb_user")
public class User {
	//....
}

  规则  主键 

例如:

​ 我们要设置主键自动增长则可以设置如下

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;
	//.....
}

AUTO

数据库ID自增,依赖于数据库。该类型请确保数据库设置了 ID自增 否则无效

NONE

未设置主键类型。若在代码中没有手动设置主键,则会根据主键的全局策略自动生成(默认的主键全局策略是基于雪花算法的自增ID)

INPUT

需要手动设置主键,若不设置。插入操作生成SQL语句时,主键这一列的值会是null。

ASSIGN_ID

当没有手动设置主键,即实体类中的主键属性为空时,才会自动填充,使用雪花算法

ASSIGN_UUID

当实体类的主键属性为空时,才会自动填充,使用UUID
 

设置字段映射关系

如果表中一个列名叫 address而 实体类中的属性名为addressStr则可以使用如下方式进行配置。

    @TableField("address")
    private String addressStr;

MP 中 默认驼峰命名,userName  ---   user_name(数据库里)

基础使用 

 基础查询 没有 条件

XXXXXMapper.selectList(null)

 添加 

Domain domain =new domain();
domain.set字段("");
XXmapper.insert(domain)

  删除 

1 直接 根据id 删除
XXmapper.deteteByid(X);
2  创建 数组 删除  
   List<Integer> ids = new ArrayList<>();
        ids.add(5);
        ids.add(6);
        ids.add(7);
        int i = userMapper.deleteBatchIds(ids);
        System.out.println(i);


    Map<String, Object> map = new HashMap<>();
        map.put("name","提姆");
        map.put("age",22);
        int i = userMapper.deleteByMap(map);
        System.out.println(i);
    }

修改

domain do  = new domaim(); 

do.setid();
do.set字段();

  mapper.update(do)

条件选择器

QueryWrapper

     常用条件

eq:equals,等于
gt:greater than ,大于 >
ge:greater than or equals,大于等于≥
lt:less than,小于<
le:less than or equals,小于等于≤
between:相当于SQL中的BETWEEN
like:模糊匹配。like(“name”,“黄”),相当于SQL的name like ‘%黄%’
likeRight:模糊匹配右半边。likeRight(“name”,“黄”),相当于SQL的name like ‘黄%’
likeLeft:模糊匹配左半边。likeLeft(“name”,“黄”),相当于SQL的name like ‘%黄’
notLike:notLike(“name”,“黄”),相当于SQL的name not like ‘%黄%’
isNull
isNotNull
and:SQL连接符AND
or:SQL连接符OR

in: in(“age",{1,2,3})相当于 age in(1,2,3)

groupBy: groupBy(“id”,“name”)相当于 group by id,name

orderByAsc :orderByAsc(“id”,“name”)相当于 order by id ASC,name ASC

orderByDesc :orderByDesc (“id”,“name”)相当于 order by id DESC,name DESC

       基本使用

 
        QueryWrapper wrapper = new QueryWrapper();
        wrapper.gt("XXX",XX);
        wrapper.eq("address","狐山");
        List<XXX> XXXX = XXXMapper.selectList(wrapper);
       

UpdateWrapper

   基本使用

   UpdateWrapper<XXX> updateWrapper = new UpdateWrapper<>();
        updateWrapper.gt("id",1);  更新的范围
        updateWrapper.set("age",99);  修改的数据
        XXXXMapper.update(null,updateWrapper);

自定义方法(mapper 接口)

public interface UserMapper extends BaseMapper<User> {

    User findMyUser(Long id);
}

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.sangeng.mapper.UserMapper">

    <select id="findMyUser" resultType="com.sangeng.domian.User">
       select * from user where id = #{id} 
    </select>
</mapper>

分页查询

   准备  分页 插件

@Configuration
public class PageConfig {

    /**
     * 3.4.0之前的版本
     * @return
     */
   /* @Bean
    public PaginationInterceptor paginationInterceptor(){
        return  new PaginationInterceptor();
    }*/

    /**
     * 3.4.0之后版本
     * @return
     */
   @Bean
   public MybatisPlusInterceptor mybatisPlusInterceptor(){
       MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
       mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
       return mybatisPlusInterceptor;
   }
}

  单表查询  
    


    public void testPage(){
        IPage<XXX> page = new Page<>();
        //设置每页条数
        page.setSize(2);
        //设置查询第几页
        page.setCurrent(1);
        userMapper.selectPage(page, null);
        System.out.println(page.getRecords());//获取当前页的数据
        System.out.println(page.getTotal());//获取总记录数
        System.out.println(page.getCurrent());//当前页码
    }

  多表查询 

     查询   A   B  两个 表格  的 时候 

     补充一下  使用 mapper  中  对应的 实体类 

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Orders  {
	//省略无关代码
    private String userName;
}

 IPage<XXX> findAllOrders(Page<XXXX> XXXX);

  

    public void testOrdersPage(){
        Page<Orders> page = new Page<>();
        //设置每页大小
        page.setSize(2);
        //设置当前页码
        page.setCurrent(2);
        ordersMapper.findAllOrders(page);
        System.out.println(page.getRecords());
        System.out.println(page.getTotal());
    }

  

Service

改造前

public interface UserService {
    List<User> list();
}

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;

    @Override
    public List<User> list() {
        return userMapper.selectList(null);
    }
}

 改造后

     相比较之前 接口 会自带一些方法,基本的查询增删改查直接调用接口就可以完成。

public interface UserService extends IService<User> {

}

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements UserService {
	
}
    @Autowired
    private UserService userService;


    @Test
    public void testSeervice(){
        List<User> list = userService.list();
        System.out.println(list);
    }

自定义方法

       相比较mapper 接口里面的使用 ,没有什么区别

public interface UserService extends IService<User> {


    User test();
}
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements UserService {

    @Autowired
    private OrdersMapper ordersMapper;

    @Override
    public User test() {
        UserMapper userMapper = getBaseMapper();
        List<Orders> orders = ordersMapper.selectList(null);
        User user = userMapper.selectById(3);
        //查询用户对于的订单
        QueryWrapper<Orders> wrapper = new QueryWrapper<>();
        wrapper.eq("user_id",3);
        List<Orders> ordersList = ordersMapper.selectList(wrapper);
        return user;
    }
}

         

自动填充

   使用 tablefield(fill = fiedfill.insert_update)

    

 /**
     * 更新时间
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;

    /**
     * 创建时间
     */
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;

自定义填充处理器 MetaObjectHandler 

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        this.setFieldValByName("createTime", LocalDateTime.now(), metaObject);
        this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
        //                            "字段",数据类型,value
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
    }
}

 逻辑删除

配置

yml
mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: delFlag  # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
      logic-delete-value: 1 # 逻辑已删除值(默认为 1)
      logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)

    删除后 delflag 的 默认值 会发生变化

结果

原网站

版权声明
本文为[m0_61499313]所创,转载请带上原文链接,感谢
https://blog.csdn.net/m0_61499313/article/details/125021251