MyBatis 学习过程中遇到的问题和解决方案
MyBatis在数据库中使用日期类型
- Spring使用 @ModelAttribute 接受数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17package com.sixi.ktpd.domain.form.admin;
import ...;
/**
* Created with IntelliJ IDEA
*
* @author 喵♂呜
* Created on 2017/8/30 19:31.
*/
public class CollectionSearchForm {
private Date startTime;
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>
区域配置 简化 UPDATE
和 INSERT
- 数据库结构
1
2
3
4
5
6
7
8
9create 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)
即可
- 方案1: 使用
- 问题原因: 使用 Mybatis 查询