前言

今天在开发练习项目时遇到两个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. 【python】命令行解析工具getopt用法

    处理命令行参数的模块 用法: opts, args = getopt.getopt( sys.args[1:],  shortStr,  longList) 输入: shortStr 形式如下: &q ...

  2. laravel发送邮件

    这里已163为例: 1..env文件配置和mail.php配置(默认使用.env) MAIL_DRIVER=smtp MAIL_HOST=smtp.163.com MAIL_PORT=465 MAIL ...

  3. NTP服务器和国内可用的NTP地址

    NTP 是什么?   NTP 是网络时间协议(Network Time Protocol),它用来同步网络设备[如计算机.手机]的时间的协议. NTP 实现什么目的?   目的很简单,就是为了提供准确 ...

  4. Eclipse上安装springsource-tool-suite(转)

    Eclipse上安装springsource-tool-suite 版本必须匹配. spring tool suite 是一个基于eclipseIDE开发环境中的用于开发spring应用程序的工具.提 ...

  5. nginx结合tomcat一起使用

    反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时 ...

  6. Android 如何快速生成aar?

    aar主要分为两步 第一步 新建一个Module类似于Eclipse中的project 然后AddLibrary然后点击Finish完成 生成mylibrary-debug.aar文件 然后将.aar ...

  7. vue中使用axios发送请求

    我们知道,vue2.0以后,vue就不再对vue-resource进行更新,而是推荐axios,而大型项目都会使用 Vuex 来管理数据,所以这篇博客将结合两者来发送请求 1.安装axios cnpm ...

  8. bzoj 4753 最佳团体

    Written with StackEdit. Description \(JSOI\)信息学代表队一共有N名候选人,这些候选人从\(1\)到\(N\)编号.方便起见,\(JYY\)的编号是\(0\) ...

  9. 选择第n大的数(分治法和排列实现)

    个人心得:在买的书上看到的一个经典分治题,题目意思就是给定一个数组,求第k小的数. 第一反应就是排序,然后返回第k-1位置的数就可以了,这样算法的复杂度是nlongn,在快速排序的基础下还是挺不错的. ...

  10. Google网站遭到域名劫持

    今天晚上,包括Google.com在内的绝大多数Google国际网站,例如Google.com.Gmail.Google Reader.Google Docs等,在中国部分省市均出现无法访问的情况. ...