【Mybatis-plus】: mybatis-plus看这一个就行了

【Mybatis-plus】: mybatis-plus看这一个就行了,第1张

【Mybatis-plus】: mybatis-plus看这一个就行了 mybatis-plus

文章目录
  • mybatis-plus
    • 1.入门案例:
      • 建表:
      • 1.1创建工程:springboot工程:
      • 1.2 引入依赖:
      • 1. 3.编写配置文件:application.properties 或者application.yaml
    • 2.代码编写:
      • 2.1 pojo实体类编写:
      • 2.2 mapper接口(userMapper):
      • 2.3 测试:
      • ** 日志配置:
      • 2.4 添加 *** 作:(userMapper.insert())
    • 3. 主键生成策略:
      • 3.1. 自动增长:(Auto_increment)
      • 3.2 uuid:(生产随机唯一的值):
      • 3.3 mybatis-plus 自带策略(雪花算法)(也是默认的):
    • 4.实现update *** 作:
    • 5.自动填充:
      • 5.1 create_time 和 update_time
      • 5.2 MyMateObjectHandler 配置
    • 6.乐观锁(并行 *** 作):
      • 6.1 .在实体类的字段上加上@Version注解
      • 6.2 编写配置类:
    • 7.分页查询:
      • 7.1 分页配置:
      • 7.2 测试:
    • 8.逻辑删除:
      • 8.1 添加 deleted字段;
      • 8.2 实体类字段上加上@TableLogic注解
      • 8.3 配置
    • 9.Wrapper:
        • 9.1 QueryWrapper
        • 各种方法:
      • 9.2 updateWrapper:
    • 10.代码生成器:
    • 最后:

1.入门案例: 建表:
	create table user
(
    id          bigint auto_increment comment '主键ID'
        primary key,
    name        varchar(30)      null comment '姓名',
    age         int              null comment '年龄',
    email       varchar(50)      null comment '邮箱',
    create_time datetime         null comment '创建时间',
    update_time datetime         null comment '修改时间',
    version     int    default 1 null comment '乐观锁',
    deleted     int(1) default 0 null comment '逻辑删除'
)
    charset = utf8;
1.1创建工程:springboot工程:

1.2 引入依赖:
	 
        
            org.springframework.boot
            spring-boot-starter-web
        

        
            org.springframework.boot
            spring-boot-devtools
            runtime
            true
        
        

            org.springframework.boot
            spring-boot-starter-test
            test
        

        

            mysql
            mysql-connector-java
        

        
            org.projectlombok
            lombok
        


        
            com.baomidou
            mybatis-plus-boot-starter
            3.0.5
        

        
            junit
            junit
            test
        



    

1. 3.编写配置文件:application.properties 或者application.yaml

	#数据库链接配置
spring:
  datasource:
    username: 用户名
    password: 密码
    url: jdbc:mysql://localhost:3306/数据库明?useSSL=false&useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
    driver-class-name: com.mysql.cj.jdbc.Driver
#日志配置
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    #逻辑删除 配置
  global-config:
    db-config:
      logic-delete-field: deleted
      logic-delete-value: 1
      logic-not-delete-value: 0
2.代码编写:

类,包结构:

2.1 pojo实体类编写:
	

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {

    @TableId(type = IdType.AUTO)//自动增长
    private Long id;
    private String name;
    private Integer age ;
    private String  email;

    @TableLogic//逻辑删除注解
    private Integer deleted;  //逻辑删
    @Version   //乐观锁注解
    private Integer version;

    @TableField(fill = FieldFill.INSERT)//插入是时候更新
    private Date createTime;

    @TableField(fill = FieldFill.INSERT_UPDATE)//更新时候更新
    private Date updateTime;

}
2.2 mapper接口(userMapper):
	
@Mapper
public interface UserMapper extends baseMapper {

}

注意: 标注 @mapper 注解
继承baseMapper<>

2.3 测试:
		@SpringBootTest
class MybatisPlusApplicationTests {

    @Autowired
    private UserMapper userMapper;

    @Test
    void contextLoads () {
        List userList = userMapper.selectList (null);
        for (User user : userList) {
            System.out.println ("user = " + user);
        }
    }
  }

测试结果:

** 日志配置:
	#日志配置
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

2.4 添加 *** 作:(userMapper.insert())
	 //插入
    @Test
    public void testInsert(){
        User user = new User (null, "的萨克", 23, "dsafrwr@qq.com",null,null,null,null);
        int insert = userMapper.insert (user);
        System.out.println (user);
        System.out.println (insert);

    }

测试结果:

3. 主键生成策略: 3.1. 自动增长:(Auto_increment)
	 @TableId(type = IdType.AUTO)//自动增长
    private Long id;
3.2 uuid:(生产随机唯一的值):
	 @TableId(type = IdType.ASSIGN_UUID)//uuid
    private Long id;
3.3 mybatis-plus 自带策略(雪花算法)(也是默认的):

雪花算法生成的ID是一个64 bit的long型的数字且按时间趋势递增。大致由首位无效符、时间戳差值、机器编码,序列号四部分组成。

如图:

  • 首位无效符:第一个 bit 作为符号位,因为我们生成的都是正数,所以第一个 bit 统一都是 0。
  • 时间戳:占用 41 bit ,精确到毫秒。41位最好可以表示2^41-1毫秒,转化成单位年为 69 年。
  • 机器编码:占用10bit,其中高位 5 bit 是数据中心 ID,低位 5 bit 是工作节点 ID,最多可以容纳 1024 个节点。
  • 序列号:占用12bit,每个节点每毫秒0开始不断累加,最多可以累加到4095,一共可以产生 4096 个ID。
	 @TableId(type = IdType.NONE)//
    private Long id;
4.实现update *** 作:
	    @Test //修改
    public void updateTest(){
        User user = new User ();
        user.setAge (24);
        user.setId (7L);

        userMapper.updateById (user);
        System.out.println (user);
    }

5.自动填充: 5.1 create_time 和 update_time
	  @TableField(fill = FieldFill.INSERT)//插入是时候更新
    private Date createTime;

    @TableField(fill = FieldFill.INSERT_UPDATE)//更新时候更新
    private Date updateTime;
5.2 MyMateObjectHandler 配置

	@Component
public class MyMateObjectHandler implements metaObjectHandler {
	//insert 时候执行
    @Override
    public void insertFill ( metaObject metaObject ) {

        this.setFieldValByName ("createTime",new Date (),metaObject);
        this.setFieldValByName ("updateTime",new Date (),metaObject);
    }
//update 时候执行
    @Override
    public void updateFill ( metaObject metaObject ) {

        this.setFieldValByName ("updateTime",new Date (),metaObject);
    }
}

6.乐观锁(并行 *** 作):

乐观锁是为了解决线程冲突情况下脏读,幻读等,乐观锁就是为了解决这个问题而产生的;乐观锁默认情况下认为数据是不会发生冲突的,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则返回给用户错误信息,让用户决定如何去做。

利用版本号去控制,一个人改了值则 版本号+1 ,只要版本号不一样就不能 *** 作成功。

6.1 .在实体类的字段上加上@Version注解
	@Version   //乐观锁注解
    @TableField(fill = FieldFill.INSERT)//插入时候更新
    private Integer version;

6.2 编写配置类:

1.在添加时候默认值为1;

	@Component
public class MyMateObjectHandler implements metaObjectHandler {

    //insert时候执行
    @Override
    public void insertFill ( metaObject metaObject ) {

        this.setFieldValByName ("createTime",new Date (),metaObject);
        this.setFieldValByName ("updateTime",new Date (),metaObject);
        //insert默认值:version=1
        this.setFieldValByName ("version",1,metaObject);
    }

2.配置乐观锁插件:

@EnableTransactionManagement //自动管理事务
@Configuration
@MapperScan("按需修改")
public class MybatisPlusConfig {
    
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
        return new OptimisticLockerInterceptor();
    }

    
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return mybatisPlusInterceptor;
    }
}
7.分页查询: 7.1 分页配置:
	@EnableTransactionManagement //自动管理事务
@Configuration
public class MybatisConfig {


    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor () {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        //乐观锁配置插件 OptimisticLockerInnerInterceptor
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        // 最新版  分页 PaginationInnerInterceptor
        interceptor.addInnerInterceptor (new PaginationInnerInterceptor (DbType.H2));

        return interceptor;
    }
}

7.2 测试:
	  //分页
    @Test
    public void testPage(){
        //参数一:当前页    参数二: 页面大小
        Page page = new Page<> (1,5);
//        page.getPages ();//获得总页数
//        page.getCurrent ();//获得当前第几页
//        long size = page.getSize ();//活得每页的数量
        Page userPage = userMapper.selectPage (page, null);
        long pages = userPage.getPages ();
        for (User record : page.getRecords ()) {
            System.out.println (record);
        }
        System.out.println (pages);
//        System.out.println (size);
    }
8.逻辑删除
  • 逻辑删除:假的删除,只是以后查询不到
  • 物理删除:真的吧表中数据删除
	//delete 物理删除  删除数据  直接移除;
    @Test
    public void testDelete(){
        int i = userMapper.deleteById (1461235673628418052L);
    }
8.1 添加 deleted字段;

有的就不用太添加;

	alter table user add column deleted boolean;
8.2 实体类字段上加上@TableLogic注解
		@TableLogic
private Integer deleted;

8.3 配置

方法一:

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

方法二: 或者在配置类上配置:

		@TableLogic
private Integer deleted;


在配置类中配置

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

9.Wrapper:

9.1 QueryWrapper 各种方法:
 isNotNull  不为空
 *                 ge 大于等于
 *                 gt 大于
 *                 le 小于等于
 *                 lt 小于
 *                 eq 等于   selectOne
 *
 *                 between and
 *
 *                 like  模糊查询   %..%
 *                 likeLeft   %..
 *                 likeRight  ..%
 *                 notLike  not %..%
 *                 inSql (age,"select id from user where id > 3")
 *                          age in ("select id from user where id > 3")
 *
 *
 *                  orderByDesc     id 降序排序
	   @Test
    public void test1(){
        //查询name不为空,age小于等于 20 的
        QueryWrapper wrapper = new QueryWrapper<> ();
        wrapper.isNotNull ("name");
        wrapper.le ("age",20);
        List list = userMapper.selectList (wrapper);
        for (User user : list) {
            System.out.println (list);
        }
    }
9.2 updateWrapper:
	
@Test
public void testUpdate1() {
 
    //修改值
    User user = new User();
    user.setAge(99);
    user.setName("Andy");
 
    //修改条件
    UpdateWrapper userUpdateWrapper = new UpdateWrapper<>();
    userUpdateWrapper
        .like("name", "h")
        .or()
        .between("age", 20, 30);
 
    int result = userMapper.update(user, userUpdateWrapper);
    System.out.println(result);


	UPDATE user SET name=?, age=?, update_time=? WHERe deleted=0 AND name LIKE ? OR age BETWEEN ? AND ?
10.代码生成器:
	public class CodeGenerator {
    @Test
    public void run() {

        // 1����������������
        AutoGenerator mpg = new AutoGenerator();

        // 2��ȫ������
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");
        gc.setOutputDir("D:\JV\疫苗管理\project\" + "/src/main/java"); //生称的  位置,记得写绝对路径
        gc.setAuthor("dl");   //作者
        gc.setOpen(false); //���ɺ��Ƿ����Դ������
        gc.setFileOverride(false); //��������ʱ�ļ��Ƿ貸�
        gc.setServiceName("%sService");	//ȥ��Service�ӿڵ�����ĸI
        gc.setIdType(IdType.ID_WORKER_STR); //��������
        gc.setDateType(DateType.ONLY_DATE);//�������ɵ�ʵ��������������
        gc.setSwagger2(true);//����Swagger2ģʽ

        mpg.setGlobalConfig(gc);

        // 3������Դ����
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://localhost:3306/yimiao?serverTimezone=GMT%2B8");  //数据库链接  url
        dsc.setDriverName("com.mysql.cj.jdbc.Driver"); //driver
        dsc.setUsername(""); //数据库 名字  root
        dsc.setPassword(""); // 数据库 密码
        dsc.setDbType(DbType.MYSQL);
        mpg.setDataSource(dsc);

        // 4��������
        PackageConfig pc = new PackageConfig();
        pc.setModuleName("app"); //���
        pc.setParent("com.dl");  //包名
        pc.setController("controller");
        pc.setEntity("entity");
        pc.setService("service");
        pc.setMapper("mapper");
        mpg.setPackageInfo(pc);

        // 5����������
        StrategyConfig strategy = new StrategyConfig();
        strategy.setInclude("address","administrators","appointment","logs","users","vaccines");  //数据库的每个表的名字
        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();
    }
}
最后:

记得关注哦!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5691571.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-17
下一篇2022-12-17

发表评论

登录后才能评论

评论列表(0条)

    保存