Mybatis的输入输出映射和全局配置文件

来源:互联网 发布:红外图像处理算法 编辑:程序博客网 时间:2024/06/10 00:05

  前边我们见过了虚拟机的八大内存结构,即类加载器负责将类的信息加载到JVM中的方法区中,方法区不只是存储一些类的信息,如属性,方法,还会存储一些常量池相关的信息,方法区是线程共享;堆是存储大部分的实例对象的区域,是JVM中最主要的区域,需要注意的是堆内存是所有线程共享的;Java的NEO库允许使用直接内存,直接内存是Java堆外的直接向系统申请的内存空间,它的读写性能比从堆中读写的性能要高;垃圾回收区是负责回收堆,方法区和直接内存中的对象实例的,对于不再使用的对象,Java回收区会在后台默默的查找、标识和释放这些对象;栈是每一个线程私有的,它负责存储方法中的局部变量和参数变量,栈中保存数据的单位是栈帧,每一个方法的调用都会产生在栈顶一个栈帧,其中含局部变量表、操作数栈和帧数据区,当这个方法结束时(无论正常还是异常),这个栈帧就会被弹出,那么其中的变量也会自动销毁,不用垃圾回收来处理了。针对栈中销毁数据的方式,我们可以使用栈上分配的方式将一些原本应该分配在堆中小的对象(因为栈空间比堆空间小)打散分配到栈中,这样消除的时候就不用使用垃圾回收器了,从而提高系统的性能。本地方法栈和栈基本一致,不同的是他可以允许本地方法的调用。PC寄存器是也是每个线程私有的空间,若当前方法为本地方法,PC寄存器的值为undefined;若当前方法不是本地方法,PC寄存器会指向当前正在执行的指令。执行引擎是JVM核心的组件之一,负责执行加载进来的字节码文件。

  今天我们来讲一讲如何sqlMapConfig.xml配置文件、输入参数和输出结果的映射类型和动态SQL。

  1.sqlMapConfig.xml

  我们知道,这个sqlMapConfig.xml配置文件是Mybatis框架的一个全局的配置文件,我们可以在其中设置一些属性来使得整个工程中所有应用Mybatis的地方都可以被这些属性影响,就体现了全局性

  ① <properties resource=""/>:这个属性节点可以将外部的proeprties文件加载到这个全局配置文件中,如db.proeprties。

  需要注意的是:我们在使用OGNL读取属性时,会先从proeprties节点的下一个节点property中读取属性,再从加载的属性文件中读取属性,最后再从输入参数parameterType中读取属性,即parameterType的属性具有最高的优先级。所以我们一般不从property节点中设置属性,且要让加载进来的属性文件中的name具有一定的特殊性,如:jdbc.username=xxx.

  ② <settings>节点可以设置一些mybatis框架运行时的参数,如二级缓存,延迟加载等等。

  ③ <typeAlias type="" name="" />这个节点负责为一些类起一个别名,这样我们就可以在mapper.xml中直接使用这个别名来代替使用全类名了,简化代码开发。还可以批量为一个包中的类进行别名定义,默认类的别名是类的名称或者类名称首字母小写

  ④ <typeHandles >节点可以指明类型处理器,即如何将输入参数的Java类型转换为SQL语句中的数据库类型。一般这个节点时不需要指定的,默认的类型转换器已经足够了。

  ⑤ <mappers></mappers>节点,这个节点负责将Mapper.xml文件加载到全局配置文件中,就好像Hibernate将hbm.xml文件加载到全局配置文件hibernate.cfg.xml中一样。加载方式可以是通过resource直接加载该映射文件,也可以通过class加载对应的接口而将这个映射文件加载进来,还可以批量加载通过加载package属性将其加载进来。需要注意的是必须要遵守接口名和Mapper.xml的名必须一致且在同一个包下

  2.输入输出映射

  ① 输入映射

  输入映射通过parameterType属性指定输入参数的属性,输入类型可以是基本数据类型,HashMap和包装类型。建议输入映射使用POJO的包装类型,便于系统的维护和扩展

  ② 输出映射

  输出映射可以有两种方式

  resutlType:当SQL查询到的字段列名和resultType指定的类的属性名只要有一个一致时,就可以反射创建对象成功,即将查询到的记录和Java对象映射成功。

  resultMap:当我们希望将查询到的字段的列名和名称不一致的属性名也匹配的上的时候,就需要我们使用resultMap来映射了。具体方式是另定义一个resultMap节点,然后将select节点的resutlMap属性指向这个resultMap节点就可以了。需要注意的是:定义的resultMap节点是可以跨Mapper.xml来使用的,只需在不同的映射文件中的resultMap属性的引用前使用namespace.resultMapId即可。

  3.动态SQL

  ① 动态SQL

  指的是Mybatis可以对写在映射文件中的SQL进行灵活的拼接,通过表达式对SQL进行判断然后进行拼接和组装。

  如where和if节点来判断输入参数的值不为空时再进行where条件的添加。

  ② 动态SQL片段

  我们为了提高代码的重用性,将动态SQL判断代码块抽取出来组成一个SQL片段,这样其他的statement就可以引用了,甚至其他映射文件中的statement也可以使用了。

  ③ 动态SQL--foreach

  这个节点可以完成类似于SQL中id in (1,2,3)这样的SQL语句的拼装。处理的是当输入参数的类中有一个list类型或者数组类型的属性传入时如何完成SQL语句的拼装。