MyBatis&MyBatisPlus学习经验

MyBatis&MyBatisPlus

各位读者朋友你好,我是你的好朋友IT黑铁,在最近一段时间内我学习了Spring相关知识,今天继续分享学习经验,如有错误,还望指出!

学习途径:@黑马程序员Bilibili视频

MyBatis

作用:是一款优秀的持久层框架,用于简化jdbc开发。

maven坐标:mybatis

具体操作:第一种方式:在mybatis-config.xml中指定数据源(与spring整合时使用SqlSessionFactoryBean的bean)和映射文件(<mappers>中的mapper),在映射文件中指定mapper映射(可以指定名称空间,以区分不同空间的sql语句,名称空间名.SQL-id),最后使用SqlSessionFactoryBuilder造SQLSessionFactory对象,其中指定mybatis-config.xml输入流,获得SQLSessionFactory对象后获得其sqlSession对象,再使用sqlSession对象的对应方法指定名称空间名.SQL-id。第二种方式:用Mapper接口方法对应Mapper映射文件的SQL-id,并将Mapper映射文件放在和Mapper接口一样的目录下,若在不同父目录下,则创建包要将这俩放在同名的包下,并且要以/分隔才行,不能用点。同时需要将Mapper映射文件的名称空间名设置为Mapper接口的全限定名。最后只需使用sqlSession对象的getMapper方法指定Mapper接口类就可以获得对应Mapper对象。此时遵守了这几种限制后,在mybatis-config.xml指定映射文件就可以采用包扫描方式即设置<mappers>中的<package>为其指定扫描的包(在与Spring整合时使用MapperScannerConfigurer的bean)。第三种:

注意:Mybatis配置文件中可以设置别名,方便书写,设置<typeAliases>。

MybatisX:一款在IDEA中为提升Mybatis开发效率的插件。

Mapper语法:

使用<sql>设置sql片段以被复用,但不灵活。

     使用<resultMap>可以将数据库的字段名与封装实体属性名进行映射,值得注意的是在要返回封装的标签中需要将ResultMap属性替换resaultType属性,才能映射。

     占位符:#{}将其替换为?,并且替换参数时,会将参数包裹单引号,这样就杜绝了sql注入。${}拼sql,会出现sql注入问题,因为其只是拼接,不会加单引号,但其可以应用在不固定字段数量等场景时。

     SQL标签:<select>(查询标签)、<insert>(添加标签)、<update>(修改标签)、<delete>(删除标签)

     动态SQL:<if>、<choose><when>(相当于switch和case)

     其他标签:<foreach collection=? item=? separator=?>

参数传递:

     使用@Param注解指定多个参数的对应,其他单个参数直接使用。

注意:多个参数和单个参数中的Collection、List、Array封装为Map集合,依次添加键值信息,值得注意的是其中会依次添加两对相同的值但键不同,例多个参数中为arg0、param1,使用@Param注解的键将会替换arg0。所以建议适时使用@Param注解。

   注解开发:

         解决问题:方便快捷完成简单语句。

         相关注解:@Select、@Update、@Insert、@Delete、@Mapper(spring中直接将该bean视作Mapper接口)。

MyBatisPlus

作用:国人开发的基于MyBatis框架基础上开发的增强型工具。

内置通用Mapper和便利的插件:继承BaseMapper<?>,其中内置了简单的CRUD操作,支持多记录操作。若要进行条件查询,则使用QueryWrapper对象设置查询条件后,在调用查询方法时将其作为参数即可,同时支持链式编程、lambda格式(可以使用QueryWrapper对象的lambda方法或者使用LambdaQueryWrapper对象设置查询条件,后一种较为推荐,值得注意的是在组合查询条件中如果是并且则就是链式连着写而是或者则在链式条件中间用or连接,另外在条件查询中null值判断处理可以使用if条件判断,也可以直接使用设置条件的方法中的第一个condition参数。最后LambdaQueryWrapper查询投影只能投影实体对象有的属性,而不能支持集函数的使用,此时QueryWrapper就支持。其他更多查询函数可以在其官网查看)。分页插件的使用:第一种方式:在spring容器中定义MybatisPlusInterceptor的bean为其添加PaginationInnerInterceptor的拦截器,使用时即使用IPage对象。第二种方式:自定义拦截器类,使用@Interceptors注解,继承Interceptor,实现其三个方法。    SQL分析插件:第一种方式:按照分页插件的使用方式。第二种方式:定义SqlSqlExplainInterceptor的bean,并为该bean设置分析器setSqlParserList方法(该方式据我推测,第一种方式是第二种方式的简化)。第三种方式:当然也是自定义。性能插件:PerformanceInterceptor。

SQL注入原理:MP在启动时会将继承BaseMapper的SQL添加到mappedStatements中,是依靠一个接口ISqlInjector负责该工作,其有实现类AbstractSqlInjector实现其insepctInject方法,在其中查找AbstractMethod对象,该对象负责提供抽象方法injectMappedStatement以被子类实现来找到子类列表,找到该列表后,遍历执行其injectMappedStatement方法来将SQL添加到mappedStatements中,以被调用。综上,可以根据该原理实现自定义的SqlInjector,但要注意的是最好继承其默认实现类DefaultSqlInjector并获取其默认方法集合。

通用枚举:

     解决问题:MP提供了通用的枚举接口IEnum。

     具体实现:实现接口IEnum,再在配置文件中设置枚举的包扫描配置。

代码生成器:

     作用:执行代码生成程序,自动根据数据库表进行生成controller、dao、domain、mapper、service

具体实现:maven坐标mybatis-plus-generator代码生成器坐标,velocity-engine-core是代码生成器依赖的模板技术坐标。使用AutoGenerator对象,为该对象设置相关属性设置后,使用其方法execute生成代码,最后运行该程序即可。

相关注解:@TableName(绑定数据库的表名,但有时为了方便可以在springBoot配置文件中为表名设置前缀以让实体类与表对应起来)

                 @TableField(绑定数据库表的字段名,若设置exist属性=false,则表示该属性与数据库表无关;若设置select=false,则表示该属性不参与默认内置查询;设置fill属性配合实现MetaObjectHandler对象的bean可以设置自动填充)

                 @TableId(设置当前类中主键属性生成策略,但有时也可以在springBoot配置文件中直接设置主键属性生成策略)

                 @TableLogic(设置该属性为逻辑删除属性,但也可以在springBoot中通用配置逻辑删除相关)

                 @Version(设置当前属性为版本控制属性,配合OptimisticLockerInnerInterceptor拦截器使用,在每次查询   和修改时为sql追加version检查和修改,例乐观锁解决并发问题)

                 @Interceptors(设置type属性可以选择拦截路径;设置method拦截路径中的哪一个方法)

日志:开启日志-如果是在springBoot中则在配置文件中设置mybatis-plus:configuration:log-impl:org.apache.ibatis.ibatis.logging.stdout.StdOutImpl。

相关知识:

     ActiveRecord,属于ORM(对象关系映射)层,即是映射数据关系,例将数据库数据映射到对象中。在Java中要想开启AR,只需将实体类继承Model对象。     

          

posted @ 2022-08-03 22:26  炸天帮达令  阅读(45)  评论(0编辑  收藏  举报