2021-05-24~2021-05-28总结(Mybatis)

2021-05-24~2021-05-28

  • 工作总结
    • 工作内容
    • 技术探索
        • 1.Lombok工具简介
          • 1.1 idea 安装Lombok工具:
          • 1.2 引入所需的jar包:
          • 1.3 常用注解简介:
          • 1.4 Lombox实现原理以及优点缺点:
            • 优点:
            • 缺点:
        • 2.浅谈mybatis与mybatis-plus
          • mybatis与mybatis-plus区别:
            • mybatis:
            • 简析:
            • 优点:
            • 缺点:
            • mybatis-plus:
            • 简析:
            • 优点:
            • 实体类注解
          • 牛客网错题回顾:
            • 题目
            • 选项:
            • 解析
    • 总结

工作总结

工作内容

本周工作内容主要是针对业务做的一些业务类的编写,所以本文的技术回顾也就将改为技术探索。

技术探索

1.Lombok工具简介
1.1 idea 安装Lombok工具:

我电脑的idea已经安装过了该插件,所以展示的会是已安装的情况。
路径 Flile > setting > Plugins > Marketplace 搜索 Lombox 点击安装
2021-05-24~2021-05-28总结(Mybatis)_第1张图片

1.2 引入所需的jar包:
<dependency>
    <groupId>org.projectlombokgroupId>
    <artifactId>lombokartifactId>
    <version>1.16.10version>
 dependency>
1.3 常用注解简介:
  1. @Data : 注解在类上, 为类提供(读、写)属性, 此外还提供了 equals()、hashCode()、toString() 方法 (常规来说我们的实体类就只需要在该类上使用该注解就可以完成所需的基本功能
  2. @Getter/@Setter : 注解在类上, 为类提供读写属性
  3. @ToString : 注解在类上, 为类提供 toString() 方法
  4. @Slf4j : 注解在类上, 为类提供一个属性名为 log 的 log4j 的日志对象
  5. @Log4j : 注解在类上, 为类提供一个属性名为 log 的 log4j 的日志对象
1.4 Lombox实现原理以及优点缺点:

Lombok本质上就是一个实现了“JSR 269 API”(Sun公司在2005.2.1提交了JSR 269,用于支持在编译期对annotation进行处理)的程序。在使用javac(编译)的过程中,它产生作用的具体流程如下:

  1. javac对源代码进行分析,生成了一棵抽象语法树(AST)
  2. 运行过程中调用实现了“JSR 269 API”的Lombok程序
  3. 此时Lombok就对第一步骤得到的AST进行处理,找到@Data注解所在类对应的语法树(AST),然后修改该语法树(AST),增加getter和setter方法定义的相应树节点
  4. javac使用修改后的抽象语法树(AST)生成字节码文件,即给class增加新的节点(代码块)
    总结:先对所要编译的文件生成语法树(AST)之后找到有使用@data注解的类进行对应语法树的修改,增加语法树的节点,最后将修改后的语法树生成最终的字节码文件,从而实现功能
优点:
  1. 能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,提高了一定的开发效率,让代码变得简洁,不用过多的去关注相应的方法,属性做修改时,也简化了维护为这些属性所生成的getter/setter方法等。
    总结:简化了代码的书写,需要修改属性的时候,减少了属性与所使用属性方法之间的耦合度
缺点:
  1. 不支持多种参数构造器的重载
  2. 降低了源代码的可读性和完整性,降低了阅读源代码的舒适度
  3. Lombok 这种插件,已经不仅仅是插件了,它在编译器编译时通过操作AST(抽象语法树)改变字节码生成,变相的说它就是在改变java语法,它改变了你编写源码的方式,它不像 spring 的依赖注入一样是运行时的特性,而是编译时的特性。如果一个项目有非常多这样的插件,会极大的降低阅读源代码的舒适度。

(总结:Lombox的使用大大提高了程序员在编写代码时的效率,但从可读性与完整性来说就会存在缺失,加之是在编译过程中做的修改,从某种角度上来说直接的更改了java代码的写法。)

2.浅谈mybatis与mybatis-plus

Mybatis-Plus是一个Mybatis的增强工具,只是在Mybatis的基础上做了增强却不做改变,MyBatis-Plus支持所有Mybatis原生的特性,所以引入Mybatis-Plus不会对现有的Mybatis构架产生任何影响。

mybatis与mybatis-plus区别:
mybatis:
简析:
  • 所有SQL语句全部自己写
  • 手动解析实体关系映射转换为MyBatis内部对象注入容器
  • 不支持Lambda形式调用
优点:
  1. MyBatis封装了JBDC底层访问数据库的细节。
  2. SQL语句封装在配置文件中,便于统一管理与维护,降低了程序的耦合度,SQL代码从程序代码中彻底分离出来,可重用。
  3. 提供了动态SQL标签,支持编写动态SQL。
  4. 提供映射标签,支持对象与数据库的ORM字段关系映射
缺点:
  1. 过于依赖数据库SQL语句,导致数据库移植性差,更换数据库,如果SQL语句有差异,SQL语句工作量大
    由于xml里标签id必须唯一,导致DAO中方法不支持方法重载。
mybatis-plus:
简析:
  • 强大的条件构造器,满足各类使用需求
  • 内置的Mapper,通用的Service,少量配置即可实现单表大部分CRUD操作
    支持Lambda形式调用
  • 提供了基本的CRUD功能,连SQL语句都不需要编写
  • 自动解析实体关系映射转换为MyBatis内部对象注入容器
优点:
  1. 依赖少:仅仅依赖 Mybatis 以及 Mybatis-Spring 。
  2. 损耗小:启动即会自动注入基本 CURD(增、删、改、查),性能基本无损耗,直接面向对象操作 。
  3. 通用CRUD操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求 。
  4. 多种主键策略:支持多达4种主键策略(内含分布式唯一ID生成器),可自由配置。
  5. 支持热加载:Mapper 对应的 XML 支持热加载,对于简单的 CRUD 操作,甚至可以无 XML 启动
  6. 支持ActiveRecord:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可实现基本 CRUD 操作
  7. 内置分页插件:基于 Mybatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通List查询。
  8. 内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能有效解决慢查询 。
  9. 默认将实体类的类名查找数据库中的表,使用@TableName(value=“table1”)注解指定表名,@TableId指定表主键,若字段与表中字段名保持一致可不加注解。
实体类注解
  • 表名注解 @TableName
    值 描述
    value ---------- 表名( 默认空 )
    resultMap ---------- xml 字段映射 resultMap ID
  • 主键注解 @TableId
    值 描述
    value ---------- 字段值(驼峰命名方式,该值可无)
    type ----------主键 ID 策略类型( 默认 INPUT ,全局开启的是 ID_WORKER )
    (ASSIGN_ID(雪花算法)、ASSIGN_UUID(排除中划线的UUID)、AUTO(数据库ID自增)、INPUT(插入前自行设置主键值))
  • 字段注解 @TableField
    值 描述
    value ----------字段值(驼峰命名方式,该值可无)
    el ---------- 详看注释说明
    exist ----------是否为数据库表字段( 默认 true 存在,false 不存在 )
    strategy ---------- 字段验证 ( 默认 非 null 判断)
    fill ----------字段填充标记 ( FieldFill, 配合自动填充使用 )
  • 字段填充策略 FieldFill
    值 描述
    DEFAULT ----------默认不处理
    INSERT ----------插入填充字段
    UPDATE ----------更新填充字段
    INSERT_UPDATE ----------插入和更新填充字段
  • 序列主键策略 注解 @KeySequence
    值 描述
    value ----------序列名
    clazz ----------id的类型
    乐观锁标记注解 ----------@Version

总结:大体来说能使用mybatis-plus就没必要去使用my-batis,前者完全的兼容了后者的所有特性,并且更加简便的完成了一些基础CURD大大减少了开发者的无效开发时间,后续会挑一个比较长的时间来具体深入的写一篇关于mybatis-puls的使用。

牛客网错题回顾:
题目
package NowCoder;
class Test {
	public static void hello() {
	    System.out.println("hello");
	}
}
public class MyApplication {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Test test=null;
		test.hello();
	}
}
选项:

A. 能编译通过,并正确运行
B.因为使用了未初始化的变量,所以不能编译通过
C.以错误的方式访问了静态方法
D.能编译通过,但因变量为null,不能正常运行

解析
  1. 因为Test类的hello方法是静态的,所以是属于类的,当实例化该类的时候,静态会被优先加载而且只加载一次,所以不受实例化new Test();影响,只要是使用到了Test类,都会加载静态hello方法!
  2. 另外,在其他类的静态方法中也是可以调用公开的静态方法,此题hello方法是使用public修饰的所以在MyApplication中调用hello也是可以的。
    总结:即使Test test=null;这里也会加载静态方法,所以test数据中包含Test类的初始化数据。(静态的,构造的,成员属性)所以答案选:A

总结

1、对于很多插件都只停留在使用的阶段
2、对于mybatis-plus 实现原理的不熟悉
3、基础知识还需提高

成功的速度要超过失去的速度--zwx

你可能感兴趣的:(周记总结,java)