<!-- 传递多参数的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获取属性值的问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)