Mybatis专题

Mybatis的#号和$号的区别

#{}

使用#{}意味着使用的预编译的语句,如果存在参数则会使用"?"占位符。有预编译功能,效率高。

${}

使用${}时的sql不会当作字符串处理,是什么就是什么,字符串拼接符,存在sql注入,一般不使用。

如何实现Mybatis动态模糊查询

当在映射文件中使用like + #{}时,传参需要提供%号。底层通过占位符拼接,相对安全。
当在映射文件中使用like + %${vakue}%时,传参不需要提供%号。底层通过字符串拼接方式,存在sql注入问题。

Dao的方法能重载吗?

Dao接口里的方法是不能重载的,因为是全限名+方法名的保存和寻找策略
Dao接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Dao接口生成代理proxy对象,代理对象proxy会拦截接口方法,转而执行MappedStatement所代表的生气咯,然后将sql执行结果返回。

Mybatis延迟加载和实现原理

Mybatis仅支持association关联对象和collection关联集合对象的延迟加载,association指的就是一对一,collection指的就是一对多查询。在Mybatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=true|false。
它的原理是,使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用a.getB().getName(),拦截器invoke()方法发现a.getB()是null值,那么就会单独发送事先保存好的查询关联B对象的sql,把B查询上来,然后调用a.setB(b),于是a的对象b属性就有值了,接着完成a.getB().getName()方法的调用。这就是延迟加载的基本原理。

使用mapper接口调用时有哪些要求

  1. Mapper接口方法名和mapper.xml中定义的每个sql的id相同
  2. Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql的parameterType的类型相同
  3. Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
  4. Mapper.xml文件中的namespace即是mapper接口的类路径

Mybatis如何实现接口和xml文件映射的

Mybatis在初始化SqlSessionFactoryBean的时候,找到mapperLocations路径去解析里面所有的XML文件,把每个sql标签内容封装成SqlSource对象,然后通过MappedStatement对象封装每一个sql标签的id(全限定类名+方法名)以及sqlSource对象。接着将MappedStatement关联到Configuration对象中。而Configuration对象是Mybati的一个重要属性,Configuration对象可以通过SqlSession,当通过SqlSession对象调用getMapper方法时,会创建一个dao接口的代理对象,当dao代理对象调用方法时会执行代理对象的invoke方法,在invoke方法执行过程中,通过Configuration对象拿到MappedStatement对象封装的sql执行,并将执行结果封装到dao实体类中,从而完成接口和xml文件的映射。

Mybatis的理解

首先Mybatis是一个对象关系映射(Object Relational Mapping,简称ORM)框架,是为了解决面向对象与关系数据库存在的互补匹配的现象。也就是说Mybatis的关注点在于对象与数据库之间的映射,Mybatis会把从数据库中得到的松散数据进行封装,使开发者直接拿到一个对象。Mybatis其实是对jdbc的操作数据库的过程进行了封装,使开发者只需要关注SQL本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。mybatis需要手写sql语句,对jdbc的封装程度不如hibernate,但因此也灵活得多。

Mybatis的开发流程

  1. 加载mybatis全局配置文件(数据源、mapper映射文件等),解析配置文件,mybatis基于xml配置文件生成Configuration,和一个个MappedStatement(包括了参数映射配置、动态sql语句、结果映射配置),其对应着<select|update|delete|insert>标签项。
  2. SqlSessionFactoryBuilder通过Configuration对象生成SqlSessionFactory,用来开启SqlSession。
  3. SqlSession对象完成和数据库的交互。
    a、用户程序调用mybatis接口层api(即Mapper接口中的方法)。
    b、SqlSession通过调用api的Statement ID找到对应的MappedStatement对象。
    c、通过Executor(负责动态SQL的生成和查询缓存的维护)将MappedStatement对象进行解析,sql参数转化、动态sql拼接,生成jdbc Statement对象。
    d、JDBC执行sql。
    e、借助MappedStatement中的结果映射关系,将返回结果转化成HashMap、JavaBean等存储结构并返回。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值