MyBatis - zhongjiajie/zhongjiajie.github.com GitHub Wiki

MyBatis

Mybatis说白了就是操作数据库的工具,对象关系映射.MyBatis是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架.MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集.MyBatis可以对配置和原生Map使用简单的XML或注解,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录. Mybatis-Spring: Mybatis针对Spring的适配版本, 可以用依赖注入的方式调用SqlSession

一般是controller接受前端传进来的url及参数,调用service层的核心代码,service层调用dao层的接口,并通过mybatis访问数据库

  • controller: 对应的实例是model层
  • dao: 对应的实例是po层,dao层编写interface后会由spring boot内部帮忙实现
  • mybatis: 自动实现的是dao文件夹下的interface与数据库的交互

MyBatis必知必会

  • 通过Mapper访问数据库
    • 这里有两层意思:
      • 具体的sql都写在mapper中
      • 上层需要获得mapper去访问数据库
  • sql写在哪儿
    • 可以写在定义mapper的interface中
    • 可以写在Mapper.xml中: 个人感觉写在xml文件中,能更加方便的使用mybatis的动态sql特性
  • SqlSession
    • 我们需要SqlSession去打开一个会话.之后,你可以使用它来执行映射语句,提交或回滚连接,最后,当不再需要它的时候, 你可以关闭session.使用MyBatis-Spring之后,你的bean可以通过一个线程安全的 SqlSession 来注入,基于 Spring 的事务配置 来自动提交,回滚,关闭 session. 不再需要手动关闭SqlSession.
  • mybatis配置的xml问题
    • SelectKey在Mybatis中是为了解决Insert数据时不支持主键自动生成的问题,他可以很随意的设置生成主键的方式

      属性 描述
      keyProperty selectKey 语句结果应该被设置的目标属性
      resultType 结果的类型.MyBatis 通常可以算出来,但是写上也没有问题.MyBatis 允许任何简单类型用作主键的类型,包括字符串
      order 这可以被设置为 BEFORE 或 AFTER.如果设置为 BEFORE,那么它会首先选择主键,设置 keyProperty 然后执行插入语句.如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 元素-这和如 Oracle 数据库相似,可以在插入语句中嵌入序列调用
      statementType 和前面的相 同,MyBatis 支持 STATEMENT ,PREPARED 和CALLABLE 语句的映射类型,分别代表 PreparedStatement 和CallableStatement 类型
      <insert id="insert">
        insert into people (
        name,
        age,
        sex
        )
        values (
        #{name,jdbcType=VARCHAR},
        #{age,jdbcType=VARCHAR},
        #{sex,jdbcType=VARCHAR}
        )
        <selectKey resultType="Long" order="AFTER" keyProperty="id">
            SELECT LAST_INSERT_ID() AS id
        </selectKey>
      </insert>

动态sql

Mybatis动态sql

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>

其中foreach中的item属性对应的是内部的#{item}元素,collection属性对应的是参数的名称,如果是HashMap就是对应的key如果是对象就是属性名.

  • foreach和if混用时要主要if的判断条件,如果要判断是否为空然后拼接动态sql要用<if test="item != null"> <foreach> ... </foreach> </if>,不能使用<if test="item != ''">因为list不能和String比较

插入多条记录

mybatis可以提供批量的功能,以插入功能为例,指定集合是List,item是item,调用的时候item.column就算定义完了,interface

<insert id="insert">
    insert into table (column)
    values
    <foreach collection ="list" item="item" index= "index" separator =",">
    (#{item.column,jdbcType=INTEGER})
    </foreach>
</insert>

实现翻页功能

com.github.pagehelper.PageInterceptorPageHelper-使用方法

Mybatis SQL xml处理大于号小于号(判断处理)

Mybatis需要通过xml格式处理sql语句时,经常会用到<, <=, >, >=等符号,但是会引起xml格式的错误,这样会导致后台将xml字符串转换为xml文档时报错,从而导致程序错误.我们需要将原符号改成xml中可是被且不会报错的替换符号.

原符号 替换符号
< <
<= <=
> >
>= >=
& &
' '
" "
  • Mybatis做等值判断时一直报错,因为一开始写的是fwbdh = 'BAK',应该是fwbdh == 'BAK',同时Mybatis的if when 对test表达式对参数进行判断时,可以调用java.lang.String中定义的方法
<if test="fwbdh != null and fwbdh == 'BAK'">
    fwbdh=#{fwbdh}
<if>

FAQ

resulttype是指一条记录的类型

Mybatis使用xml的话,resulttype是指一条记录的类型,而不是全部记录的类型

dao层传多个参数需要绑定@Param

如果xml只用了多个参数而不是map,或者一个参数,那么dao层需要使用@Param绑定xml中的变量名

// 如果只有一个参数, `@Param` 参数是可选的
List<Entry> selectById(int id);
List<Entry> selectById(@Param("id") int id);

// 如果有多个参数要传递到xml `@Param`参数是必填的
List<Entry> selectByRange(@Param("startDate") Date startDate, @Param("endDate") Date endDate);

⚠️ **GitHub.com Fallback** ⚠️