MyBatis学习记录

MyBatis 学习过程中遇到的问题和解决方案

MyBatis在数据库中使用日期类型

  • Spring使用 @ModelAttribute 接受数据

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    package com.sixi.ktpd.domain.form.admin;
    import ...;
    /**
    * Created with IntelliJ IDEA
    *
    * @author 喵♂呜
    * Created on 2017/8/30 19:31.
    */
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class CollectionSearchForm {
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date startTime;
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date endTime;
    }
  • 在 MyBatis 中使用日期类型的数据时 必须加上 jdbcType=TIMESTAMP 否则转换成的字符串将无法被解析

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <select id="list" resultType="java.util.Map">
    <include refid="Select"/>
    <where>
    <if test="startTime != null">
    AND gmt_create >= #{startTime,jdbcType=TIMESTAMP}
    </if>
    <if test="endTime != null">
    <![CDATA[
    AND gmt_create <= #{endTime,jdbcType=TIMESTAMP}
    ]]>
    </if>
    </where>
    </select>

还有这样的操作

使用 <sql> 区域配置 简化 UPDATEINSERT

  • 数据库结构

    1
    2
    3
    4
    5
    6
    7
    8
    9
    create table ktpd.user
    (
    id int auto_increment comment 'ID' primary key,
    username varchar(60) not null comment '用户名',
    password varchar(100) not null comment '密码',
    phone varchar(20) null comment '手机号',
    age int default '0' not null comment '年龄',
    )
    comment '用户表';
  • 添加ID为 Set<sql> 区域

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <sql id="Set">
    <set>
    <if test="username != null">
    username = #{username,jdbcType=VARCHAR},
    </if>
    <if test="password != null">
    password = #{password,jdbcType=VARCHAR},
    </if>
    <if test="phone != null">
    phone = #{phone,jdbcType=VARCHAR},
    </if>
    <if test="age != null">
    age = #{age,jdbcType=INTEGER},
    </if>
    </set>
    </sql>
  • 添加和更新的时候用 <include refid="Set"/> 包含区域

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <insert id="insert" useGeneratedKeys="true" keyProperty="id" parameterType="pw.yumc.demo.entity.User">
    INSERT INTO user
    <include refid="Set"/>
    </insert>
    <update id="update">
    UPDATE user
    <include refid="Set"/>
    WHERE id = #{id}
    </update>

MyBatis 插件

Mybatis-Generator

本插件用于生成 POJO类 和 Mapper接口 还有 XML 的配置文件

  • 保持 POJO 字段和数据库字段相同
    1
    2
    3
    4
    5
    <!-- 指定数据库表 -->
    <table tableName="%">
    <!--useActualColumnNames 保持字段名称和数据库一致-->
    <property name="useActualColumnNames" value="true"/>
    </table>

常见问题处理

  • 当返回值为 Map 字段类型为 TINYINT(1) 时 得到的结果是 Boolean 类型
    • 问题原因: 使用 Mybatis 查询 TINYINT(1) 字段数据 返回值为Map类型 那么 TINYINT(1) 的数据默认会转化为 Boolean 类型数据.
    • 处理方案:
      • 方案1: 使用 IFNULL(column, 0)
      • 方案2: 使用 CAST(column AS SIGNED)
      • 方案3: 数据库连接字符串添加参数 tinyInt1isBit=false 该值默认为 true
      • 方案4: 避免使用长度为 1 的 TINYINT 字段类型 改成 TINYINT(2) 即可