Mybatis入门及常见问题

Mybatis

框架概述

框架 Framework是整个或部分系统的可重复性设计,表现为一组抽象构件及构件实例间交互的方法;
另一种定义认为,框架是可被应用开发者定制的应用骨架。前者是从应用方面而后者是从目的方面给出的定义。  
简而言之,框架其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统。

MyBatis概述

MyBatis 是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架,几乎避免了所有的JDBC代码和手动设置参数以及返回结果集。
通常对配置或者原生的MAP使用简单的配置文件或者朱姐,将接口和POJOs映射成数据库中的记录。
优点是:配置简单 基本就是两个JAR文件和sql映射文件,基本上sql卸载xml文件里易于管理,写成注释亦可、接触sql语句和代码的耦合
缺点:sql语句字段多,移植性差针对不同的库有不同的sql语句

动态SQL

SQL拼接在传统的JDBC中因为少空格报错或者其他原因很难找,使用动态SQL元素会好很多。下面介绍4个标签:
1、if
2、choose(when,otherwise)
3、trim(where,set)
4、foreach
if
<select id="findActiveBlogWithTitleLike"
     resultType="Blog">
  SELECT * FROM BLOG 
  WHERE state = ‘ACTIVE’ 
  //如果传入title,就会模糊查询”title“,并返回结果
  <if test="title != null">
    AND title like #{title}
  </if>
  //如果两个条件同时进行搜索:例如title和autho
  <if test="author != null and author.name != null">
    AND author_name like #{author.name}
  </if>
</select>
choose(when,otherwise)
有时候我们不想两个条件同时搜索,只需要有那个条件搜那个,EG
<select id="findActiveBlogLike"
     resultType="Blog">
     SELECT * FROM BLOG WHERE state = ‘ACTIVE’
  <choose>
    <when test="title != null">
     AND title like #{title}
    </when>
    <when test="author != null and author.name != null">
     AND author_name like #{author.name}
    </when>
    <otherwise>
    //如果两者都没提供,就返回所有符合条件的Blog
     AND featured = 1
    </otherwise>
  </choose>
</select>
trim(where,set)
<select id="findActiveBlogLike"
     resultType="Blog">
  SELECT * FROM BLOG 
  //把where标签拼进去,这样在如果所有if条件都没有匹配到的情况下,不会发生sql语句拼成 SELECT * FROM WHERE 这种情况
  <where> 
    <if test="state != null">
         state = #{state}
    </if> 
    <if test="title != null">
        AND title like #{title}
    </if>
    <if test="author != null and author.name != null">
        AND author_name like #{author.name}
    </if>
  </where>
</select>
<set>同理

foreach
<select id="selectPostIn" resultType="domain.blog.Post">
  SELECT *
  FROM POST P
  WHERE ID in
  <foreach item="item" index="index" collection="list"
      open="(" separator="," close=")">
        #{item}
  </foreach>
</select>

Java API

MyBatis的主要 Java 接口就是SqlSession。

SqlSessions 是由 SqlSessionFactory 实例创建的。SqlSessionFactory 对 象 包 含 创 建 SqlSession 实 例 的 所 有 方 法 。 而 SqlSessionFactory 本 身 是 由 SqlSessionFactoryBuilder 创建的,它可以从 XML 配置,注解或手动配置 Java 来创建 SqlSessionFactory。

SqlSessionFactory
SqlSessionFactory有六中方法可以创建SqlSession,
    SqlSession openSession()
    SqlSession openSession(boolean autoCommit)
    SqlSession openSession(Connection connection)
    SqlSession openSession(TransactionIsolationLevel level)
    SqlSession openSession(ExecutorType execType,TransactionIsolationLevel level)
    SqlSession openSession(ExecutorType execType)
    SqlSession openSession(ExecutorType execType, boolean autoCommit)
    SqlSession openSession(ExecutorType execType, Connection connection)
    Configuration getConfiguration();
默认的opensession()没有参数,它所创建的sqlsession:1、会开启一个事务(不自动提交)2、连接对象从活动环境配置的ds得到,3.事务隔离级别将会使用默认设置4、预处理语句不复用

注意:sqlsession是Mybatis中非常强大的一个雷,所有执行语句方法,提交或者回滚事务,获取映射器实例都通过它。

MyBatis 与ORM区别

MyBatis属于半ORM,因为sql语句需要自己编写,优点是灵活,好改。缺点是,移植性差,mysql与oracle语句不一样。

SQL注入(#{}与${}的区别)

1、#{ } 会进行预编译处理,对传进来的数据加” “将传入的数据当成字符串

2、${ }就是字符串替换,且一般用于传入数据库对象,例如:select * from user where id = ${value} 这样看没什么问题,但是如果传入的是攻击性语句:001;drop table user 一般sql注入写的很长的一条sql语句,检查不出来就会删库。

MyBatis缓存机制

一、一级缓存:sqlsession缓存,缓存数据只在SqlSession中有效,在操作数据库时,先建立Sqlsession会话对象,在对象中有一个HashMap用于存数数据,且私有。

具体步骤:第一次select会将查到数据存到hahmap中,第二次传入select传入参数相同,从缓存中返回数据。

注意:1、如果sqlsession执行增删改操作,并且提交了事务,mybatis会清空缓存,

2、默认开启一级缓存,SqlSession的Hashmap是将[namespace:sql:参数]作为key 查询语句sql作为value的

二、二级缓存:mapper级别的缓存,同一个namespace的mapper.xml再被多个Sqlsession使用时,会采用二级缓存。二级缓存需要手动开启。

在conf.xml配置全局变量

<settings>
        <setting name="cacheEnabled" value="true"/>默认是false:关闭二级缓存
<settings>

在userMapper.xml配置

<cache eviction="LRU" flushInterval="60000" size="512" readOnly="true"/>当前mapper下所有语句开启二级缓存

配置的是LRU缓存,60s刷新一次,存储最大512个对象,对象read-only

具体流程:当一个sqlsession执行select操作室,关闭session时会创建一个二级缓存,存储查询结果。

当另一个session执行查操作会先查一级缓存,一级缓存没有查二级。

注意:二级缓存在sqlsession执行增删改并提交时,mapper的二级缓存也就关闭了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值