复制这段内容后打开百度网盘手机App,操作更方便哦
有多个 result 是否抛出异常 |
本文讲解了MyBatis-Plus
在使用过程中的配置选项,其中部分配置继承自MyBatis
原生所支持的配置。
MyBatis Mapper 所对应的 XML 文件位置,如果您在 Mapper 中有自定义方法(XML 中有自定义实现),需要进行该配置,告诉 Mapper 所对应的 XML 文件位置,Maven 多模块项目的扫描路径需以 classpath*:
开头 (即加载多个 jar 包下的 XML 文件)。
MyBaits 别名包扫描路径,通过该属性可以给包中的类注册别名,注册后在 Mapper 对应的 XML 文件中可以直接使用类名,而不用使用全限定的类名(即 XML 中调用的时候不用包含包名)。
枚举类 扫描路径,如果配置了该属性,会将路径下的枚举类进行注入,让实体类字段能够简单快捷的使用枚举属性。
启动时是否检查 MyBatis XML 文件的存在,默认不检查。
通过该属性可指定 MyBatis 的执行器,MyBatis 的执行器总共有三种:
指定外部化 MyBatis Properties 配置,通过该配置可以抽离配置,实现不同环境的配置部署。
原生 MyBatis 所支持的配置,本部分(Configuration)的配置大都为 MyBatis 原生支持的配置,这意味着您可以通过 MyBatis XML 配置文件的形式进行配置。
是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN(下划线命名) 到经典 Java 属性名 aColumn(驼峰命名) 的类似映射。此属性在 MyBatis 中原默认值为 false,在 MyBatis-Plus 中,此属性也将用于生成最终的 SQL 的 select body,如果您的数据库命名符合规则无需使用
默认枚举处理类,如果配置了该属性,枚举将统一使用指定处理器进行处理。
需要注意,它的取值可以有以下几种,可以使用内置,也可以自定义:
当设置为 true 的时候,懒加载的对象可能被任何懒属性全部加载,否则,每个属性都按需加载。需要和 lazyLoadingEnabled 一起使用。
MyBatis 自动映射策略,通过该配置可指定 MyBatis 是否并且如何来自动映射数据表字段与对象的属性,总共有 3 种可选值:
MyBatis 自动映射时未知列或未知属性处理策略,通过该配置可指定 MyBatis 在自动映射过程中遇到未知列或者未知属性时如何处理,总共有 3 种可选值:
单服务架构中(有且仅有只有一个程序提供相同服务),一级缓存开启不会影响业务,只会提高性能。 微服务架构中需要关闭一级缓存,原因:Service1先查询数据,若之后Service2修改了数据,之后Service1又再次以同样的查询条件查询数据,因走缓存会出现查处的数据不是最新数据。
指定当结果集中值为 null 的时候是否调用映射对象的 Setter(Map 对象时为 put)方法,通常运用于有 Map.keySet() 依赖或 null 值初始化的情况。
通俗的讲,即 MyBatis 在使用 resultMap 来映射查询结果中的列,如果查询结果中包含空值的列,则 MyBatis 在映射的时候,不会映射这个字段,这就导致在调用到该字段的时候由于没有映射,取不到而报空指针异常。
当您遇到类似的情况,请针对该属性进行相关配置以解决以上问题。
注意:基本类型(int、boolean 等)是不能设置成 null 的。
指定一个提供 Configuration 实例的工厂类。该工厂生产的实例将用来加载已经被反序列化对象的懒加载属性值,其必须包含一个签名方法static Configuration getConfiguration()
。(从 3.2.3 版本开始)
这里只列出 MyBatis3 的 settings 标签的属性,更多配置,请自行探索!
我们这里以日志打印为例,一般使用驼峰命名对应 “ - ”
该配置是影响所有映射器中配置缓存的全局开关。 | |
该配置是延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。在特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态。 | |
当启用时,对任意延迟属性的调用会使带有延迟加载属性的对象完整加载,反之,每种属性将会按需加载。 | |
是否允许单一语句返回多结果集,需要兼容驱动。 | |
使用列标签代替列名。不同的驱动会有不同的表现,具体可参考相关驱动文档或通过测试这两种不同的模式来观察所用驱动的结果。 | |
允许JDBC 支持自动生成主键,需要驱动兼容。如果设置为 true,则这个设置强制使用自动生成主键,尽管一些驱动不能兼容但仍可正常工作(比如 Derby)。 | |
指定 MyBatis 应如何自动映射列到字段或属性。 NONE:表示取消自动映射。 PARTIAL:表示只会自动映射,没有定义嵌套结果集和映射结果集。 FULL:表示会自动映射任意复杂的结果集,无论是否嵌套。 |
|
指定自动映射当中未知列(或未知属性类型)时的行为。 默认是不处理,只有当日志级别达到 WARN 级别或者以下,才会显示相关日志,如果处理失败会抛出 SqlSessionException异常。 | |
SIMPLE:是普通的执行器。 REUSE:会重用预处理语句。 BATCH:执行器将重用语句并执行批量更新。 |
|
设置超时时间,它决定驱动等待数据库响应的秒数。 | |
设置数据库驱动程序默认返回的条数限制,此参数可以重新设置。 | |
指定按语句设置忽略它的滚动策略。(Since: 3.5.2) | |
允许在嵌套语句中使用分页(RowBounds)。 如果允许,设置 false。 |
|
允许在嵌套语句中使用分页(ResultHandler)。 如果允许,设置false |
|
是否开启自动驼峰命名规则映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射。 | |
SESSION:这种情况下会缓存一个会话中执行的所有查询。 STATEMENT:代表本地会话仅用在语句执行上,对相同 SqlScssion 的不同调用将不会共享数据。 |
|
当没有为参数提供特定的 JDBC 类型时,为空值时指定 JDBC 类型。某些驱动需要指定列的 JDBC 类型,多数情况直接用一般类型即可,比如 NULL、VARCHAR 或 OTHER。 | |
指定哪个对象的方法触发一次延迟加载。 | 一个逗号分隔的方法名称列表 |
指定动态 SQL 生成的默认语言。 | 类型别名或指定类的全名称 |
类型别名或指定类的全名称 | |
指定当结果集中值为 null 时,是否调用映射对象的 setter(map 对象时为 put)方法,这对于 Map.keySet() 依赖或 null 值初始化时是有用的。注意,基本类型(int、boolean 等)不能设置成 null。 | |
指定 MyBatis 增加到日志名称的前缀。 | |
指定 MyBatis 所用日志的具体实现,未指定时将自动査找。 | |
指定 MyBatis 创建具有延迟加载能力的对象所用到的代理工具。 | |
指定 VFS 的实现类。 | 自定义VFS实现的类的全名称,用逗号分隔。 |
允许使用方法签名中的名称作为语句参数名称。 为了使用该特性,你的项目必须采用 Java 8 编译,并且加上 -parameters 选项。(Since: 3.4.1) | |
指定提供配置实例的类。返回的配置实例用于加载反序列化对象的惰性属性。此类必须具有签名静态配置getConfiguration() 的方法。(Since: 3.2.3) | 类型别名或指定类的全名称 |
从SQL中删除多余的空白字符。注意,这也会影响SQL中的文字字符串。(Since 3.5.5) |
表名是否使用驼峰转下划线命名,只对表名生效。
大写命名,对表名和字段名均生效。
全局的entity的逻辑删除字段属性名,(逻辑删除下有效)
逻辑已删除值,(逻辑删除下有效)
逻辑未删除值,(逻辑删除下有效)
字段验证策略之 insert,在 insert 的时候的字段验证策略。
字段验证策略之 update,在 update 的时候的字段验证策略。
插件功能:提供数据分页功能。
溢出总页数后是否进行处理(默认不处理,参见 插件#continuePage 方法)
|
单页分页条数限制(默认无限制,参见 插件#handlerLimit 方法)
|
数据库类型(根据类型获取应使用的分页方言,参见 插件#findIDialect 方法)
|
插件功能:防止全表更新与全表删除,依次保护数据库的安全,建议开发环境使用,不建议生产环境使用。
插件功能:该功能依赖 p6spy
组件,完美的输出打印 SQL 及执行时长, 3.1.0
以上版本支持。
添加插件:该插件不用添加自动集成
插件功能:当要更新一条记录的时候,希望这条记录没有被别人更新,可以使用乐观锁,MyBatis-Plus就提供了乐观锁插件。
实现方式:乐观锁实现方式如下
插件功能:可以通过接口方法名直接创建对应mapper中的sql标签,还可以Mapper和xml可以来回跳,更多功能自行探索!
接口方法:然后在添加一个@Repository注解
注意:我们不需要编写xml映射,因为我们会采用sql注入的形式,在 MybatisPlus 启动的时候就注入。
注释“执行分析插件”:会影响代码执行,它会阻止全表删除操作,所以先注释掉,反正我们已经学会了
添加“自定义SQL注入对象”:
控制台截图:没有写xml映射代码,它也会执行删除,原因是我们在启动的时候自动注入了
逻辑删除:数据删除并不会真正的从数据库中将数据删除掉,而是将当前被删除的这条数据中的一个逻辑删除字段置为删除状态。
代码生成:运行代码生成器,生成代码
添加配置:application.properties,如果以下配置已经存在,请忽略此步骤
#那个字段是逻辑删除字段,也可以在字段上添加注解@TableLogic,在这里边配置是全局生效
数据库截图:你会发现数据还存在,只是将其中的逻辑删除标志由0改为了1,代表逻辑删除
实现自定义枚举有两种方式,一种是使用注解而另一种是使用实现接口IEnum的方式,在接下来的案例中,我们会分别使用这两种进行讲解,这样可以让大家学的更全面一些。
我们现在有一个需求,每当插入一个学生的时候,自动的给学生状态设置为”插入“,每当修改的时候,如果状态标志位为null,就把标志字段设置为”修改“,这时候就需要自动填充功能了。
metaobject:元对象,是 Mybatis 提供的一个用于更加方便,更加优雅的访问对象的属性,给对象的属性设置值的一个对象,还会用于包装对象,支持对 Object 、Map、Collection等对象进行包装,本质上 metaObject 获取对象的属性值或者是给对象的属性设置值,最终是要通过 Reflector 获取到属性的对应方法的 Invoker,最终 invoke。
测试方法:依次执行两个方法
温馨提示:自3.3.0开始,默认使用雪花算法+UUID(不含中划线)
支持自动转换为String类型,但数值类型不支持自动转换,需精准匹配,例如返回Long,实体主键就不支持定义为Integer |
默认不含中划线的UUID生成 |
在实际开发中,我们经常会使用到MySQL和Oracle数据库,但是这两种数据库对于主键有不同的策略,如下:
那我们Oracle又要如何使用主键策略,在这里,我们就不进行一步一步介绍了,我们只提出解决方法
如果内置支持不满足你的需求,可实现IKeyGenerator接口来进行扩展。
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。