Mybatis-plus入门

                               内容来源于官方文档mp.baomidou.com/

1:Mybatis-plus是什么?

  • Mybatis-Plus(简称MP)是一个Mybatis的增强工具

  • 只是在Mybatis的基础上做了增强却不做改变

  • MyBatis-Plus支持所有Mybatis原生的特性

  • 所以引入Mybatis-Plus不会对现有的Mybatis构架产生任何影响

  • MyBatis 增强工具包,简化 CRUD 操作

  • 启动加载 XML 配置时注入单表 SQL 操作 ,为简化开发工作、提高生产率而生。

  • 最后总结就是为了简化开发 提高效率!

2:Mybatis-plus的特性(官网 :mp.baomidou.com/):

  • 特性

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
  • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
  • 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
  • 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
  • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  • 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
  • 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
  • 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
  • 内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
  • 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

 

 

 

           <!--mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
                <!--  lombok驱动      -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
                <!--  mybatis-plus 驱动      -->
        <dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus</artifactId>
    <version>3.4.2</version>
</dependency>

 

3:配置mysql配置文件:

spring.datasource.username=root
spring.datasource.password=5825600
spring.datasource.url=jdbc:mysql://localhost:3306/xiaolu?useSSL=false&useUnicode=false&characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

#日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
# 配置逻辑删除
mybatis-plus.global-config.db-config.logic-delete-value=0
mybatis-plus.global-config.db-config.logic-not-delete-value=1

4:借鉴官网的sql语句来创建表 并插入数据:

DROP TABLE IF EXISTS user;
CREATE TABLE user
(
    id BIGINT(20) NOT NULL COMMENT '主键ID',
    name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
    age INT(11) NULL DEFAULT NULL COMMENT '年龄',
    email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
    PRIMARY KEY (id)
);
DELETE FROM user;

INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');

 

5:创建数据库实例:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;
    private String name;
    private Integer age;
    private String email;
 }

6:编写Mapper接口:

//继承BaseMapper类的方法
@Repository   //表示持久层
public interface UserMapper extends BaseMapper<User> {
}

7:测试类中 测试:

 @Autowired
    UserMapper userMapper;
    @Test
    /**
     * 查询语句
     */
    void contextLoads() {
        List<User> users = userMapper.selectList(null);
        users.forEach(System.out::println);//jdk8的新特性
    }

 查询结果:

 

2:根据条件查询:

  /*
      条件查询用map来设置条件
     */
 @Test
    public void selectMap(){
     Map<String, Object> map=new HashMap<>();
     map.put("name","小杰");
     List<User> users = userMapper.selectByMap(map);
     System.out.println(users);
 }

3:分页查询:

1:先创建一个配置类来配置分页插件:

//扫描文件件
@MapperScan("com.jie.mapper")
@EnableTransactionManagement
@Configuration         //配置类
public class MyBatisPlusConfig {
    /**
     * 这是分页查询的插件
     * @return
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        return paginationInterceptor;
    }}

2:在测试类中测试:

 /*
 分页查询
  */
@Test
    public void selectPage(){
    Page<User> page = new Page(1,3);
    IPage<User> userIPage = userMapper.selectPage(page, null);
    page.getRecords().forEach(System.out::println);
}

 

 

 

 众所周知 CRUD:接下来插入语句:

@Test
    public void insert(){
        User user = new User();
        user.setName("小杰");
        user.setAge(19);
        user.setEmail("1927545042@qq.com");
        /*
        因为insert里面要一个参数 这里不写id因为会自动生成id
        利用雪花算法: Parameters: 1371685508409307138(Long),
        小杰(String), 18(Integer), 1927545042@qq.com(String)
        如果像实现id自增的话需要在实体类id上面加注解:@TableId(type = IdType.AUTO)
        记得数据库的表也要自增 不然就会报错
         */
        int insert = userMapper.insert(user);
        System.out.println(insert);
    }

实现id自增:(如果像实现id自增的话需要在实体类id上面加注解:@TableId(type = IdType.AUTO)记得数据库的表也要自增 不然就会报错)

 @TableId(type = IdType.AUTO)
    private Long id;

 

更新语句:

 /**
     * 更新方法
     * 所有的sql都是动态sql
     */
    @Test
    public void update(){
        User user = new User();
        user.setId(4L);
        user.setName("小杰");
        user.setAge(19);
        int i = userMapper.updateById(user);//这里面的参数不能填id要填User

    }

删除语句:

1:根据id删除

@Test
public void delect(){
     //根据id删除
     userMapper.deleteById(1L);
}

2:根据条件删除:

@Test
public void delect2(){
    //根据条件删除
    Map map1=new HashMap();
    map1.put("name","小杰");
    userMapper.deleteByMap(map1);
}

3:删除多个数据:

@Test
    public void delete(){
    //删除多个数据
   userMapper.deleteBatchIds(Arrays.asList(1371685508409307140L, 1371685508409307141L));

4:逻辑删除:在数据库中没有被移除

1:在数据表中增加deleted字段:

默认值为:1          被删除了的值为:0

 

 

 

 2:在配置文件中配置:

# 配置逻辑删除
mybatis-plus.global-config.db-config.logic-delete-value=0
mybatis-plus.global-config.db-config.logic-not-delete-value=1

3:在配置类中添加逻辑删除组件:

  @Bean
    public ISqlInjector sqlInjector(){
        return new LogicSqlInjector();
    }

4:测试 如果测试成功 数据库的deleted字段的值会显示为0

  条件查询(部分) 可以借鉴官网:(mp.baomidou.com/):

 1:不为null的值 :  isNotNull();

   //条件构造器
        @Test
    public void wrapper(){
            QueryWrapper<User> objectQueryWrapper = new QueryWrapper<>();
            objectQueryWrapper.isNotNull("name");//不为null的值
            userMapper.selectList(objectQueryWrapper);
        }

 2:查询一个数据:.eq();

  public void test1(){
            QueryWrapper<User> objectQueryWrapper = new QueryWrapper<>();
            objectQueryWrapper.eq("","");//查询一个数据 多个用map
            userMapper.selectList(objectQueryWrapper);
        }

3:查询年龄为10~20的:between();

  @Test
    public void between(){
        QueryWrapper<User> objectQueryWrapper = new QueryWrapper<>();
        objectQueryWrapper.between("age",10,20);
        //查询年龄为10——20的;
        userMapper.selectCount(objectQueryWrapper);
    }

4:模糊查询 :

notLike:模糊查询
likeLeft :左模糊
likeRight:右模糊
 @Test
    public void test2(){
     //模糊查询
        QueryWrapper<User> objectQueryWrapper = new QueryWrapper<>();
        objectQueryWrapper.notLike("name","小")
                .likeLeft("age","1")
                .likeRight("name","k");
                //左模糊 和右模糊   %
        List<Map<String, Object>> maps = userMapper.selectMaps(objectQueryWrapper);
        maps.forEach(System.out::println);
    }

5:根据sql语句来进行操作:inSql();

@Test
    public void sql(){
         //条件查询 可以写完整sql语句
        QueryWrapper<User> objectQueryWrapper = new QueryWrapper<>();
        objectQueryWrapper.inSql("id","select id from user where id=4 ");
        List<Object> objects = userMapper.selectObjs(objectQueryWrapper);
        objects.forEach(System.out::println);
    }

6:升序排序(orderByAsc())和降序排序(orderByDesc()):

 @Test
    public void orb(){
        //排序:升序:orderByAsc    降序:orderByDesc()
        QueryWrapper<User> objectQueryWrapper = new QueryWrapper<>();
            objectQueryWrapper.orderByAsc("id");
        List<User> users = userMapper.selectList(objectQueryWrapper);
        users.forEach(System.out::println);
    }

最后代码自动生成器:可以直接从官网中查找 我这边使用的是狂神的 因为看的狂神的教程:

只需要改实体类名字 和包名 还有 数据库配置即可
/ 代码自动生成器 
public class KuangCode {
public static void main(String[] args) {
    // 需要构建一个 代码自动生成器 对象 
    AutoGenerator mpg = new AutoGenerator(); 
    
    // 配置策略 
    // 1、全局配置 
    GlobalConfig gc = new GlobalConfig();
    String projectPath = System.getProperty("user.dir"); 
    gc.setOutputDir(projectPath+"/src/main/java");
    gc.setAuthor("狂神说"); gc.setOpen(false);
    gc.setFileOverride(false);
    
    // 是否覆盖
    gc.setServiceName("%sService");
    
    // 去Service的I前缀
    gc.setIdType(IdType.ID_WORKER);
    gc.setDateType(DateType.ONLY_DATE);
    gc.setSwagger2(true);
    mpg.setGlobalConfig(gc);
    
    //2、设置数据源
    DataSourceConfig dsc = new DataSourceConfig();
    dsc.setUrl("jdbc:mysql://localhost:3306/user? useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8");
    dsc.setDriverName("com.mysql.cj.jdbc.Driver");
    dsc.setUsername("root");
    dsc.setPassword("123456");
    dsc.setDbType(DbType.MYSQL); mpg.setDataSource(dsc);
    
    //3、包的配置
    PackageConfig pc = new PackageConfig();
    //只需要改实体类名字 和包名 还有 数据库配置即可
    pc.setModuleName("blog"); pc.setParent("com.kuang");
    pc.setEntity("entity"); pc.setMapper("mapper");
    pc.setService("service"); pc.setController("controller");
    mpg.setPackageInfo(pc);
    
    //4、策略配置
    StrategyConfig strategy = new StrategyConfig();
  strategy.setInclude("数据库表的名字可以输入多个");
    
    // 设置要映射的表名
    strategy.setNaming(NamingStrategy.underline_to_camel);
    strategy.setColumnNaming(NamingStrategy.underline_to_camel);
    strategy.setEntityLombokModel(true);
    
    // 自动lombok;
    strategy.setLogicDeleteFieldName("deleted"); 
    
    // 自动填充配置
    TableFill gmtCreate = new TableFill("gmt_create", FieldFill.INSERT);
    TableFill gmtModified = new TableFill("gmt_modified", FieldFill.INSERT_UPDATE);
    ArrayList<TableFill> tableFills = new ArrayList<>();
    tableFills.add(gmtCreate); tableFills.add(gmtModified);
    strategy.setTableFillList(tableFills);
    
    // 乐观锁
    strategy.setVersionFieldName("version");
    strategy.setRestControllerStyle(true);
    strategy.setControllerMappingHyphenStyle(true);
    
    // localhost:8080/hello_id_2 
    mpg.setStrategy(strategy);
    mpg.execute(); //执行 
    }
}

                          希望大家利用好Mybatis-plus简化开发!!!

如果想看springboot的博客 可以点击我的主页!里面有从入门到外包的一些文章

posted @ 2021-03-16 22:26  小杰i  阅读(160)  评论(0编辑  收藏  举报