mybatis的sql文件怎么通过下标获取对象里数组类型的字段的某个值

mybatis的sql文件怎么通过下标获取对象里数组类型的字段的某个值,第1张

<!-- 传递多参数的array参数表的foreach使用 -->

<select id="getStudentAllArray" resultMap="reusltMap_student"

resultType="comdepponmybatisexsiceTestStudent"

parameterType="array">

select from t_maydel_student where stunum in

<foreach collection="array" index="index" item="item" open="(" separator="," close=")">

#{item}

</foreach>

</select>

MyBatis-plus是完全基于MyBatis开发的一个增强工具,是在MyBatis的基础上做增强的框架,为简化开发、提高效率而生。

它在MyBatis原本的框架上增加了很多实用性功能,比如乐观锁插件、字段自动填充功能、分页插件、条件构造器、sql 注入器等等。使用 MyBatis-plus 可以完全不写任何 XML 文件,直接使用继承了BaseMapper 接口的类对象完成对数据库的映射 *** 作

基于映射的原理,MyBatis-plus 必然要实现 Mapper中的方法与 SQL 语句的对应转化,以下即为 MyBatis-plus 重要流程图例

1在 MyBatis-plus 中, MybatisPlusAutoConfiguration 自动配置类的 sqlSessionFactory() 方法为 Spring提供创建 sqlSession 的工厂类对象,对 sqlSessionFactory 进行定义的定义类变为了 MybatisSqlSessionFactoryBean 。

在 sqlSessionFactory() 方法中,除了注入 MyBatis本身的组件,还会注入MyBatis-plus 的 主键生成器、SQL 注入器等组件,最后通过 MybatisSqlSessionFactoryBean#getObject() 方法获取到 sqlSessionFactory 对象

2 MybatisSqlSessionFactoryBean#getObject() 执行懒加载策略,最后通过 buildSqlSessionFactory() 方法创建 SqlSessionFactory 工厂类对象。这个方法的流程很长,不过大致可以分为两个步骤:

3 MybatisXMLConfigBuilder#parse() 会去解析配置文件,最后会调用到其内部方法 mapperElement() 。这个方法完成解析 Mapper工作,并将其添加到配置类 MybatisConfiguration 中

4 MybatisConfiguration#addMapper() 方法其实是去调用 MybatisMapperRegistry#addMapper() 方法,其核心是 MybatisMapperAnnotationBuilder#parse()

5 MybatisMapperAnnotationBuilder#parse() 方法真正开始完成 Mapper 接口中的方法与 SQL 语句的映射,其中 parseStatement() 方法是解析 @Select/@Update 等注解写入的 SQL语句,而代码 GlobalConfigUtilsgetSqlInjector(configuration)inspectInject(assistant, type ) 通过 MaBatis-plus的 SQL 注入器完成 Mapper 方法与 SQL 语句的转化

6 AbstractSqlInjector#inspectInject() 会完成 BaseMapper 接口中提供的通用方法对应的 SQL 语句准备,这部分主要通过 AbstractMethod#inject() 方法完成

7 AbstractMethod#inject() 方法并没有什么特别的 *** 作,只是调用其子类实现 injectMappedStatement() 方法。以 SelectOne#injectMappedStatement() 为例,其 SQL 语句的核心在于 SqlMethod 类,这个枚举类中缓存了可以动态拼接的 SQL 语句脚本,只需要填上参数 format 就可以得到 SQL 语句的执行脚本。

以上过程结束,只需要将所有信息通过 addInsertMappedStatement() 方法封装成 MappedStatement 对象并将其加入到容器中,这样 Mapper接口方法调用时,就可以通过 动态代理 的方式找到其对应执行的 SQL 脚本,至此 SQL 语句准备及配置解析就完成了。

最后拼接的 SQL 语句 脚本形式如下示例,实际执行数据库 *** 作时会解析这个脚本完成变量替换,从而得到可执行的 SQL 语句

8 SqlSessionFactory 对象的创建需要回到 MybatisSqlSessionFactoryBean#buildSqlSessionFactory() 方法中,很容易追踪到 MybatisSqlSessionFactoryBuilder#build() 方法,最后其实是通过 SqlSessionFactoryBuilder#build() 方法创建了一个 DefaultSqlSessionFactory 对象返回

1 @MapperScan 注解通过 @Import(MapperScannerRegistrarclass) 引入扫描注册的类 MapperScannerRegistrar ,该类实现了 ImportBeanDefinitionRegistrar 接口并重写 registerBeanDefinitions() 方法,在该方法中注册了 MapperScannerConfigurer 类

2 MapperScannerConfigurer 是 Mapper接口的扫描配置类,实现了 BeanDefinitionRegistryPostProcessor 接口,其 postProcessBeanDefinitionRegistry() 方法会在容器启动过程中被回调,通过 ClassPathMapperScanner#scan() 方法完成 Mapper 的扫描注册

3 ClassPathMapperScanner#processBeanDefinitions() 将扫描到的 Mapper接口生成的对应 BeanDefinition 的 beanClass 属性替换为 MapperFactoryBean ,这样每次获取 Mapper 实例实际是通过 MapperFactoryBean 的实例去获取

此处体现了 FactoryBean 的定位,即用于获取同一类 bean 的工厂 bean。

4 @Autowired 自动注入 Mapper 触发容器获取 bean 的方法,调用到 MapperFactoryBean#getObject() 方法,最终调用到 sqlSessionTemplate#getMapper() 方法

5MyBatis-plus 使用的配置类是 MybatisConfiguration ,最终调用到 MybatisMapperRegistry#getMapper() 方法,这里就进入了动态代理获取 MapperProxy 实例的流程

6 MybatisMapperProxyFactory#newInstance() 方法给自动注入返回一个 MybatisMapperProxy 代理对象

7调用 Mapper 接口的方法触发代理对象的 MybatisMapperProxy#invoke() ,此时根据 Mapper 对象被调用的方法生成 MybatisMapperMethod 对象,通过 MybatisMapperMethod#execute() 去真正地执行 SQL 语句,从而完成数据库 *** 作。

在实际开发项目中,我们查询条件不可能很单一,查询字段可能包括很多字段,比如:查询条件可以有用户信息,商品信息,订单信息等。

这里我们的基础实体类是用户类,我在这个基础上扩展他,之后包装他作为我们的查询条件。

包装类:用于parameterType

UserMapper接口

mapper配置文件编写sql:

上图中可看到在mapperxml配置文件中用 userCustomusername 获取父类中的username私有成员变量,实际上是通过 userCustomgetUsername() 方法获得的

以下文章通过一个简单的例子来看看ognl的用法

另还有一篇文章展示了mybatis中的ognl教程

通过以上的了解,现在把User类中的 getUsername 方法注释掉

再次运行程序,得到以下报错:

接着,我们仍旧保留对 getUsername 方法的注释,但是现在把 username 设置为 public

再次运行测试程序,得到以下正常的结果显示

以上就证明了在mapperxml中, userCustomusername 实际上是通过调用了 userCustomgetUsername() 方法获得了user中的username属性,而不是userCustom直接访问父类User中的private修饰的username成员变量。

Mybatis所支持的jdbcType类型,是固定的,枚举如下:

BIT、 FLOAT、CHAR、TIMESTAMP、OTHER、 UNDEFINED、TINYINT、REAL、VARCHAR、BINARY、BLOB、 NVARCHAR、SMALLINT、DOUBLE、LONGVARCHAR、VARBINARY、CLOB、NCHAR、INTEGER、NUMERIC、DATE、LONGVARBINARY、BOOLEAN 、NCLOB、BIGINT、DECIMAL、TIME、NULL、CURSOR

在书写jabcType类型的时候,是有严格的大小写的区分的,否则会抛出异常。

生成mapper的时候一般都有一个xml文件,你点开那个xml文件就能看到里面sql语句了

如有疑问追问,如满意记得采纳,

如果有其他问题也可点我名字向我求助

答题不易,

如果没有回答完全,请您谅解,

请采纳最快回答的正确答案!!谢谢!

MeatObject是Mybatis的工具类,通过MetaObject获取和设置对象的属性值。

返回结果:

基本的pojo对象:

MetaObject提供了一个工具类:

当调用 SystemMetaObject 获取 MetaObject 对象时,每次均 new DefaultReflectorFactory() 了一个反射工厂类。

继续查看:

这个类并没有做很复杂的 *** 作,就是获取object的type类型,且存储到Map中。当同一个object调用 forObject() 时,后续调用可以在缓存中获取反射对象。

但注意: SystemMetaObject 方法因为每次均new了一个新的 DefaultReflectorFactory 工厂。若每次在方法中调用 SystemMetaObjectforObject 获取 MetaObject 对象。同一个对象可能不会走缓存。

推荐做法: 将 DefaultReflectorFactory 声明为静态变量:

在创建 MetaObject 对象的时候,就会将传入的Object对象的所有反射对象都缓存起来。后续调用 metaObjectsetValue 等方法时,直接在缓存中获取到反射对象,然后执行反射 *** 作。

创建MetaObject对象时,选择不同的Wrapper进行包装。

以普通的pojo为例,创建 BeanWrapper 对象,在 forClass 方法中会遍历object的所有方法。获取反射对象。

到此处:

到达此处,判断 缓存 中是否存在某对象的解析结果:

注意: MetaObjectforObject 会将object结果缓存起来,后续在使用MetaObjectforObject创建对象时,直接在缓存中获取。

若没有存在,则调用 new Reflector(type); 去创建cache对象。

总方法:

2 删除方法的前缀,获取属性名:

3 key为属性名,value是集合:

4 将局部变量放入到属性集合中:

5 放入到属性变量中

设置分词器:

>

以上就是关于mybatis的sql文件怎么通过下标获取对象里数组类型的字段的某个值全部的内容,包括:mybatis的sql文件怎么通过下标获取对象里数组类型的字段的某个值、MyBatis-Plus 使用这么方便,底层是如何处理的呢、关于Mybatis的mapper.xml文件中从pojo获取属性值的问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/web/9481643.html

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

发表评论

登录后才能评论

评论列表(0条)

保存