关于mybatis的使用之怎么传递参数总结

关于mybatis的使用之怎么传递参数总结,第1张

MyBatis中使用parameterType向SQL语句传参,parameterType后的类型可以是基本类型int,String,HashMap和java自定义类型。 在SQL中引用这些参数的时候,可以使用两种方式#{parameterName}或者${parameterName}, 首先,我们说一下这两种引用参数时

比如根据id或者字段条件查询获取表中的某一个字段值

User Sel(int id); //根据id查询

有时候我们需要模糊查询或者是全表查询,返回的数据是多条的, 那么可以把多条数据保存到list里面的。

这里需要注意的是返回是List类型 但是resultType依然是javaBean, 有些人会困惑这里怎么不是集合类型呢?其实透过现象看本质, 还是JavaBean。

当我们在查询的时候返回一条数据的时候,我们可以把{字段名,字段值}封装成Map结构。

一 其实可以看成是多个参数的:

二 可以看做是加了注解

可以把参数封装到Map里面 有些时候我们的业务数据查询没有定义对应的POJO,就进行参数的封装 *** 作。

mybatis自定义拦截器(一)基本使用

mybatis自定义拦截器(二)对象详解

1 不同拦截类型执行顺序:

2 多个插件拦截的顺序?

需要注意的是,因为拦截器Aa和拦截器Bb均是拦截的StatementHandler对象,所以拦截器B在此获取StatementHandler的时候,获取的是代理对象。

3 多个插件plugin()和intercept()方法的执行顺序

先执行每个插件的plugin方法,若是@Intercepts注解标明需要拦截该对象,那么生成类型对象的代理对象。(即使该插件需要拦截该类型对象,但是依旧会执行下一个插件的plugin方法)。知道执行完毕所有的plugin方法。在执行每个Intercept方法。

自定义拦截器必须使用mybatis提供的注解来声明我们要拦截的类型对象。

Mybatis插件都要有Intercepts [in特赛婆斯] 注解来指定要拦截哪个对象哪个方法。我们知道,Pluginwrap方法会返回四大接口对象的代理对象,会拦截所有的方法。在代理对象执行对应方法的时候,会调用InvocationHandler处理器的invoke方法。

具体规则如下:

如果我们的拦截器需要一些变量对象,而且这个对象是支持可配置的。

类似于Spring中的@Value("${}")从 applicationproperties 文件中获取。

使用方法:

方法中获取参数: propertiesgetProperty("username");

问题:但是为什么不直接使用@Value("${}") 获取变量?

解答:因为mybatis框架本身就是一个可以独立使用的框架,没有像Spring这种做了很多的依赖注入。

这个方法的作用是就是让mybatis判断,是否要进行拦截,然后做出决定是否生成一个代理。

需要注意的是:每经过一个拦截器对象都会调用插件的plugin方法,也就是说,该方法会调用4次。根据@Intercepts注解来决定是否进行拦截处理。

解答:判断是否拦截这个类型对象(根据@Intercepts注解决定),然后决定是返回一个代理对象还是返回原对象。

故我们在实现plugin方法时,要判断一下目标类型,是本插件要拦截的对象时才执行Pluginwrap方法,否则的话,直接返回目标本身。

我们知道,mybatis只能拦截四种类型的对象。而 intercept 方法便是处理拦截到的对象。比如我们要拦截 StatementHandler#query(Statement st,ResultHandler rh) 方法,那么 Invocation 就是这个对象, Invocation 中有三个参数。

orgapacheibatisreflectionSystemMetaObject#forObject :方便的获取对象中的值。

案例:将参数拼接到sql语句。

因为已经执行了ParameterHandler拦截器,故Statement对象已经是完全拼接好的SQL语句。

一个MappedStatement对象对应Mapper配置文件中的一个select/update/insert/delete节点,主要描述的是一条sql语句。其属性为:

>

1查看parameterType的类型是不是javautilList类型,如果是的话,看foreach 的collection属性是不是list,

因为 传递一个 List 实例或者数组作为参数对象传给 MyBatis,MyBatis 会自动将它包装在一个 Map 中,用名称在作为键。List 实例将会以“list” 作为键,而数组实例将会以“array”作为键

2看一下foreach里面的值有没有传递进来

3看foreach里面的名称字段是否写错

4还有就是我用Mybatis的时候,用mysql的值插入自动增长值,里面的key我在数据库中没有设置自动增长,然后我又用了selectkey,所以也会出现这种情况

--------------------------------------------------------------------

还有一种情况是item的属性不对,我在使用通用Map的时候,发现此问题。

通用Map的好处是减少了对Bean的书写,问题是如果数据库的查询结果为Null,对应属性的key也就不存在。

你好,很高兴为你解答

Mybatis的Mapper文件中的select、insert、update、delete元素中有一个parameterType属性,用于对应的mapper接口方法接受的参数类型

可以接受的参数类型有基本类型和复杂类型。

mapper接口方法一般接受一个参数,可以通过使用@Param注释将多个参数绑定到一个map做为输入参数

简单数据类型

mapper接口方法:

User selectByPrimaryKey(Integer id);

sql映射:

<selectid="selectByPrimaryKey"resultMap="BaseResultMap"parameterType="javalangInteger">

  select

  <includerefid="Base_Column_List"/>

  from basetb_user

  where id = #{id,jdbcType=INTEGER}

</select>

希望对你有帮助

以上就是关于关于mybatis的使用之怎么传递参数总结全部的内容,包括:关于mybatis的使用之怎么传递参数总结、mybatis里面xml文件中resultType值说明、mybatis(3)—自定义拦截器(上)基础使用等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/web/9486134.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-28
下一篇2023-04-28

发表评论

登录后才能评论

评论列表(0条)

    保存