Mybatis总结

#{}和${}区别

  • #{}是预编译,mybatis处理#{}时,会将它替换成,调用preparedStatement的set方法来赋值,使用#{}能有效防止sql注入
  • ${}是字符串替换,mybatis使用${}时会直接将其替换成字符串

实体类属性名和表字段名不一致

  • 使用别名,在sql语句中使用as将表字段名和属性名关联
<select id=”selectorder” parametertype=”int” resultetype=”me.gacl.domain.order”> 
      select order_id as id, order_no as orderNo ,order_price as price form orders where order_id=#{id}; 
</select>
  • 使用resultMap来映射字段名和类实体名的对应关系
<select id="getOrder" parameterType="int" resultMap="orderresultmap">
        select * from orders where order_id=#{id}
    </select>
   <resultMap type=”me.gacl.domain.order” id=”orderresultmap”> 
        <!–用id属性来映射主键字段–> 
        <id property=”id” column=”order_id”> 
        <!–用result属性来映射非主键字段,property为实体类属性名,column为数据表中的属性–> 
        <result property = “orderNo” column =”order_no”/> 
        <result property=”price” column=”order_price” /> 
    </reslutMap>

like查询

  • 在java代码使用通配符
  • 在sql语句使用通配符

mybatis如何将执行sql的结果封装成目标对象并返回的,有哪些映射方式

第一种就是使用别名,第二种就是使用resultMap,有了字段名和属性名的映射关系之后,mybatis可以通过反射创建对象,通过反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。

如何获取自动生成的(主)键值?

insert 方法总是返回一个int值 - 这个值代表的是插入的行数。
而自动生成的键值在 insert 方法执行完后可以被设置到传入的参数对象中。

如何在mapper中传递多个参数

  • 使用占位符,用#{0}#{1}表示第一个和第二个参数
  • 使用@param注解
  • 使用Map集合作为参数装载

Mybatis的动态标签

  • Mybatis动态sql可以让我们在Xml映射文件内,以标签的形式编写动态sql,完成逻辑判断和动态拼接sql的功能。
  • Mybatis提供了9种动态sql标签:trim|where|set|foreach|if|choose|when|otherwise|bind。
  • 其执行原理为,使用OGNL从sql参数对象中计算表达式的值,根据表达式的值动态拼接sql,以此来完成动态sql的功能。

通常一个xml文件会和一个DAO接口对应,DAO的原理,DAO接口里面的方法是否能重载

  • DAO接口,又称为Mapper接口,接口的全限定名,又是映射文件的namespace,接口的方法名,就是映射文件中的MappedStatement,接口方法的参数就是传递给sql的参数
  • Mapper接口是没有实现类的,当调用接口方法时,接口全限定名+方法名拼接字符串作为key值,可唯一定位一个mappedStatement
  • Dao接口的方法是不能重载的,因为全限定名+方法名的保存和寻找策略
  • 工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理将dao接口生产代理Proxy对象,代理对象会拦截接口方法,转而执行MappedStatement所代表的sql,然后将sql执行结果返回

myBatis是否支持延迟加载,原理是什么

  • Mybatis支持association关联对象和collection关联集合对象的延迟加载,association指一对一,collection指一对多;通过配置lazyLoadingEnable=true/false
  • 使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用a.getB().getName(),拦截器发现a.getB()为null,就会单独发送事先先保存的查询关联B对象的sql,把B查询上来,使用a.setB(b),再使用a.getB().getName()
  • Hibernate的延迟加载原理一致

Mybatis的Executor执行器

  • simpleExecutor:每执行一次update和select,就开启一个Statement对象,用完立刻关闭
  • reuseExecutor:执行update或select,以sql为key查找Statement对象,存在就使用,不存在就创建,用完之后不关闭,属于重复使用的Statement对象
  • BatchExecutor:执行update,将所有的sql都添加到批处理中,等待统一执行,缓存了多个Statement对象,每个Statement对象都是addBatch完毕后,等待逐一执行executeBatch()批处理
  • 都严格控制在session的生命周期内

Mybatis插件的原理以及实现

  • Mybatis中仅可以编写ParameterHandler、ResultSetHandler、StatementHandler、Executor4种接口的插件
  • 使用JDK的动态代理,为需要拦截的接口生成代理对象以实现方法拦截,每当执行这4种接口对象的方法时,就会进入拦截方法,具体就是InvocationHandler的invoke()方法
  • 实现Mybatis的插件需要实现Interceptor接口的intercept()方法,然后给插件添加注解,指定需要拦截的哪一个接口的方法,然后在配置文件添加插件配置

Mybatis和hibernate区别

  • Mybatis属于半自动ORM框架,需要自己编写sql,可以严格控制sql的执行性能,灵活度高,非常适合对关系数据要求不高的软件开发,例如互联网软件,企业运营类软件,但是mybatis无法做到数据库无关性,要实现多个数据库需要定义多套sql映射文件
  • hibernate属于全自动ORM,数据库无关性好,对于关系模型要求高点软件,如果使用hibernate可以节省很多代码,提高效率,但是学习门槛高,在性能和对象模型之间权衡需要很强的经验和能力
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 229,362评论 6 537
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 99,013评论 3 423
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 177,346评论 0 382
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,421评论 1 316
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,146评论 6 410
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 55,534评论 1 325
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,585评论 3 444
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,767评论 0 289
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,318评论 1 335
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,074评论 3 356
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,258评论 1 371
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,828评论 5 362
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,486评论 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,916评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,156评论 1 290
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 51,993评论 3 395
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,234评论 2 375

推荐阅读更多精彩内容

  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 5,569评论 0 4
  • Mybatis相关 1.Mybatis是什么? 2.为什么选择Mybatis? 3、#{}和${}的区别是什么? ...
    梦殇_fccd阅读 992评论 0 5
  • Mybatis相关 1.Mybatis是什么? 2.为什么选择Mybatis? 3、#{}和${}的区别是什么? ...
    zhihaoZzz阅读 1,296评论 0 2
  • 一、注解归类 mybatis最初配置信息是基于 XML ,映射语句(SQL)也是定义在 XML 中的。而到了 My...
    shirayner阅读 837评论 0 1
  • 事实:边出试卷,边听音乐 感受:轻松, 想法:成功的人做事都是专注的 行动:关掉手机,专注出试卷 觉察:发现不对的...
    闪耀星空A阅读 103评论 0 0