前言

今天在开发练习项目时遇到两个mybatis使用问题

第一个问题是mapper方法参数问题,在参数大于一个时,mybatis不会自动识别参数命名

第二个问题是Pojo中使用Joda DateTime类型的字段,mybatis并不天然支持DateTime,这个问题想必有众多开发者都遇到过

两个问题均得到有效解决,在此进行总结记录

Mapper中针对多参数的方法正确声明方式

UserMapper interface中包含如下方法定义,用于删除用户权限

// 错误定义,此为演示
void deleteAuthority(String username, Authority authority);

对应UserMapper.xml中内容如下

<delete id="deleteAuthority">
DELETE FROM authorities WHERE username = #{username} AND authority = #{authority};
</delete>

执行时出错,提示无法找到username与authority参数

修复方式,在方法声明中,参数增加@Param注解,如下

void deleteAuthority(@Param("username") String username, @Param("authority") Authority authority);

支持Joda DateTime

例如 Pojo/Model 类型定义如,ctime表示用户创建时间,使用joda DateTime类型

public class User {
private String username;
private String password;
private DateTime ctime;
private List<UserAuthority> authorities; ... 各种 get set 方法
}

mapper中addUser方法定义如下,对于ctime字段,Mybatis默认不支持DateTime类型,且没有提供对应的TypeHander,因此需自行实现,如下的实现必然报错

错误案例
<insert id="addUser" parameterType="user">
INSERT INTO users(username, password, ctime) VALUES(#{username}, #{password}, #{ctime})
</insert>

自定义实现DateTimeTypeHandler

参考此处外国友人的讨论 Mybatis Joda Time Support

参考其源码 LukeL99/joda-time-mybatis的实现

以下是是本人对DateTimeTypeHandler的实现,前人基础上稍作重构

public class DateTimeTypeHandler implements TypeHandler<DateTime> {
@Override
public void setParameter(PreparedStatement preparedStatement, int i, DateTime dateTime, JdbcType jdbcType)
throws SQLException {
if (dateTime != null) {
preparedStatement.setTimestamp(i, new Timestamp(dateTime.getMillis()));
} else {
preparedStatement.setTimestamp(i, null);
}
} @Override
public DateTime getResult(ResultSet resultSet, String s) throws SQLException {
return toDateTime(resultSet.getTimestamp(s));
} @Override
public DateTime getResult(ResultSet resultSet, int i) throws SQLException {
return toDateTime(resultSet.getTimestamp(i));
} @Override
public DateTime getResult(CallableStatement callableStatement, int i) throws SQLException {
return toDateTime(callableStatement.getTimestamp(i));
} private static DateTime toDateTime(Timestamp timestamp) {
if (timestamp != null) {
return new DateTime(timestamp.getTime(), DateTimeZone.UTC);
} else {
return null;
}
}
}

正确使用方式,在mapper xml中需要指定DateTime类型参数对应的 typeHandler

<insert id="addUser" parameterType="user">
INSERT INTO users(username, password, ctime) VALUES(#{username}, #{password},
#{ctime, typeHandler=DateTimeTypeHandler})
</insert>

这里的DateTimeTypeHandler为使用完全限定名(无命名空间),原因是我已经在配置中加好了alias,方法请参考本人上一篇博客,即在构建sqlSessionFactoryBean时,通过setTypeAliases方法指定使用的类型

[原创]Spring Boot + Mybatis 简易使用指南(二)多参数方法支持 与 Joda DateTime类型支持的更多相关文章

  1. [原创]Spring Boot + Mybatis 简易使用指南(一)基础环境搭建

    前言 作者: Ant QQ:517377100 相对于使用JdbcTemplate,Mybatis可自动建立pojo类型与数据库列的映射关系,数据库访问层的开发简单了许多 所有数据库访问操作,均封装在 ...

  2. Spring Boot + Mybatis + Redis二级缓存开发指南

    Spring Boot + Mybatis + Redis二级缓存开发指南 背景 Spring-Boot因其提供了各种开箱即用的插件,使得它成为了当今最为主流的Java Web开发框架之一.Mybat ...

  3. Spring Boot 揭秘与实战(二) 数据存储篇 - MyBatis整合

    文章目录 1. 环境依赖 2. 数据源3. 脚本初始化 2.1. 方案一 使用 Spring Boot 默认配置 2.2. 方案二 手动创建 4. MyBatis整合5. 总结 4.1. 方案一 通过 ...

  4. Spring Boot入门教程2-1、使用Spring Boot+MyBatis访问数据库(CURD)注解版

    一.前言 什么是MyBatis?MyBatis是目前Java平台最为流行的ORM框架https://baike.baidu.com/item/MyBatis/2824918 本篇开发环境1.操作系统: ...

  5. 快速搭建一个Spring Boot + MyBatis的开发框架

    前言:Spring Boot的自动化配置确实非常强大,为了方便大家把项目迁移到Spring Boot,特意总结了一下如何快速搭建一个Spring Boot + MyBatis的简易文档,下面是简单的步 ...

  6. Spring Boot 2.0 升级指南

    Spring Boot 2.0 升级指南 前言 Spring Boot已经发布2.0有5个月多,多了很多新特性,一些坑也慢慢被填上,最近有空,就把项目中Spring Boot 版本做了升级,顺便整理下 ...

  7. Spring Boot + MyBatis + Druid + Redis + Thymeleaf 整合小结

    Spring Boot + MyBatis + Druid + Redis + Thymeleaf 整合小结 这两天闲着没事想利用**Spring Boot**加上阿里的开源数据连接池**Druid* ...

  8. Spring Boot + Mybatis 配置多数据源

    Spring Boot + Mybatis 配置多数据源 Mybatis拦截器,字段名大写转小写 package com.sgcc.tysj.s.common.mybatis; import java ...

  9. spring boot + mybatis + layui + shiro后台权限管理系统

    后台管理系统 版本更新 后续版本更新内容 链接入口: springboot + shiro之登录人数限制.登录判断重定向.session时间设置:https://blog.51cto.com/wyai ...

随机推荐

  1. 【scala】Option类型

    一般来说,对于每种语言都会有一个关键字来表示一个对象引用的“无”.在Java中使用的是null. 而Scala则融合了函数式编程的风格,当预计到变量或者函数返回值可能不会引用任何值的时候,使用Opti ...

  2. 基于openfire+smack即时通讯instant message开发

    前言 Java领域的即时通信的解决方案可以考虑openfire+spark+smack.当然也有其他的选择. Openfire 是基于Jabber协议(XMPP)实现的即时通信服务器端版本,目前建议使 ...

  3. 【tensorflow:Google】三、tensorflow入门

    [一]计算图模型 节点是计算,边是数据流, a = tf.constant( [1., 2.] )定义的是节点,节点有属性 a.graph 取得默认计算图 g1 = tf.get_default_gr ...

  4. mysql中delete的表别名使用方法

    在 mapper.xml 中的 dynamicWhere 动态查询中使用了表别名,Delete 语句引用了动态查询,如下: <delete id="delete" param ...

  5. JAVA并发全景图1.1版本

    感谢微信群"Spring Boot那些事"兄弟们的热心整理和总结

  6. [置顶] Android玩转百度地图Sha1获取正确姿势?

    场景一 由于最近项目钟要用到定位功能因此肯定需要用到地图以及地位功能,相信大家也知道目前国内比较出名的地图像百度.高德.腾讯等这些还是用到比较多的,于是思考了一下决定还是用百度,相信老司机们都知道的哈 ...

  7. 旧书重温:0day2【7】堆溢出实验

    相关文章我拍成了照片,放在了我的QQ空间不是做广告(一张一张的传太麻烦了)http://user.qzone.qq.com/252738331/photo/V10U5YUk2v0ol6/    密码9 ...

  8. [QT] Tab键切换焦点顺序

    在Qt Designer 中点击“编辑Tab顺序“按钮进入编辑Tab顺序模式,如下图: 之后界面会变成这样: 随处点击右键即可弹出菜单,选择  "制表符顺序列表..." 出现 剩下 ...

  9. plsql基本操作 复制表 导出表 导出表结构 及其导入

    上一片中介绍了安装instantclient +plsql取代庞大客户端的安装,这里说下plsql的基本操作 plsql操作界面图: 1.复制表 语句:create table IGIS_COPY a ...

  10. Write operations are not allowed in read-only mode 只读模式下(FlushMode.NEVER/MANUAL)写操作不

    org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read ...