[原创]Spring Boot + Mybatis 简易使用指南(二)多参数方法支持 与 Joda DateTime类型支持
前言
今天在开发练习项目时遇到两个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类型支持的更多相关文章
- [原创]Spring Boot + Mybatis 简易使用指南(一)基础环境搭建
前言 作者: Ant QQ:517377100 相对于使用JdbcTemplate,Mybatis可自动建立pojo类型与数据库列的映射关系,数据库访问层的开发简单了许多 所有数据库访问操作,均封装在 ...
- Spring Boot + Mybatis + Redis二级缓存开发指南
Spring Boot + Mybatis + Redis二级缓存开发指南 背景 Spring-Boot因其提供了各种开箱即用的插件,使得它成为了当今最为主流的Java Web开发框架之一.Mybat ...
- Spring Boot 揭秘与实战(二) 数据存储篇 - MyBatis整合
文章目录 1. 环境依赖 2. 数据源3. 脚本初始化 2.1. 方案一 使用 Spring Boot 默认配置 2.2. 方案二 手动创建 4. MyBatis整合5. 总结 4.1. 方案一 通过 ...
- Spring Boot入门教程2-1、使用Spring Boot+MyBatis访问数据库(CURD)注解版
一.前言 什么是MyBatis?MyBatis是目前Java平台最为流行的ORM框架https://baike.baidu.com/item/MyBatis/2824918 本篇开发环境1.操作系统: ...
- 快速搭建一个Spring Boot + MyBatis的开发框架
前言:Spring Boot的自动化配置确实非常强大,为了方便大家把项目迁移到Spring Boot,特意总结了一下如何快速搭建一个Spring Boot + MyBatis的简易文档,下面是简单的步 ...
- Spring Boot 2.0 升级指南
Spring Boot 2.0 升级指南 前言 Spring Boot已经发布2.0有5个月多,多了很多新特性,一些坑也慢慢被填上,最近有空,就把项目中Spring Boot 版本做了升级,顺便整理下 ...
- Spring Boot + MyBatis + Druid + Redis + Thymeleaf 整合小结
Spring Boot + MyBatis + Druid + Redis + Thymeleaf 整合小结 这两天闲着没事想利用**Spring Boot**加上阿里的开源数据连接池**Druid* ...
- Spring Boot + Mybatis 配置多数据源
Spring Boot + Mybatis 配置多数据源 Mybatis拦截器,字段名大写转小写 package com.sgcc.tysj.s.common.mybatis; import java ...
- spring boot + mybatis + layui + shiro后台权限管理系统
后台管理系统 版本更新 后续版本更新内容 链接入口: springboot + shiro之登录人数限制.登录判断重定向.session时间设置:https://blog.51cto.com/wyai ...
随机推荐
- <img>边框的border属性
默认地,图像是没有边框的(除非图像在 a 元素内部). 浏览器通常会把代表超链接的图像(例如包含在 <a> 标签中的图像)显示在两个像素宽的边框里面,以表示读者可以通过选择这个图像来访问相 ...
- ORACLE expdp \ impdp \ exp \ imp
(转自:http://www.cnblogs.com/lanzi/archive/2011/01/06/1927731.html) EXPDP命令行选项1. ATTACH该选项用于在客户会话与已存在导 ...
- 使用Python 2.7实现的垃圾短信识别器
最近参加比赛,写了一个垃圾短信识别器,在这里做一下记录. 官方提供的数据是csv文件,其中训练集有80万条数据,测试集有20万条数据,训练集的格式为:行号 标记(0为普通短信,1为垃圾短信) 短信内容 ...
- macOS 下 Visual Studio Code(VSCODE)安装配置及应用
Visual Studio Code 重新定义了 Code 编辑. 在任何操作系统上编辑和调试应用程序内置 Git 支持1000 种以上的扩展免费和开源 为什么使用VSCODE? 我们来看看以下功能: ...
- keras&tensorflow+分布式训练︱实现简易视频内容问答框架
内容来源:Keras 之父讲解 Keras:几行代码就能在分布式环境训练模型 把 Keras API 直接整合入 TensorFlow 项目中,这样能与你的已有工作流无缝结合.至此,Keras 成为了 ...
- ss-libev 源码解析local篇(1): ss_local的启动,客户端连入
学习研究ss-libev的一点记录(基于版本3.0.6) ss_local主要代码在local.c中,如果作为一个库编译,可通过start_ss_local_server启动local server. ...
- HDU - 6116:路径计数 (组合数&NTT)
一个包含四个点的完全图,可以在任意节点出发,可以在任意节点结束,给出每个点被经过的次数,求有多少种合法的遍历序列.如果两个序列至少有一位是不同的,则认为它们不相同. Input 2 3 3 3 Sam ...
- 利用Github免费搭建个人主页(个人博客)
之前闲着, 利用Github搭了个免费的个人主页. 涉及: Github注册 Github搭建博客 域名选购 绑定域名 更多 一 Github注册 在地址栏输入地址:http://github.co ...
- Info.plist字段列表详解
常用字段: 1.获取版本信息: NSDictionary*infoDic = [[NSBundle mainBundle] infoDictionary]; NSString *localVersio ...
- [转]linux下查看进程内存使用情况
动态查看一个进程的内存使用 1.top命令 top -d 1 -p pid [,pid ...] //设置为delay 1s,默认是delay 3s 如果想根据内存使用量进行排序,可以shift + ...