- 浏览: 7955190 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (2425)
- 软件工程 (75)
- JAVA相关 (662)
- ajax/web相关 (351)
- 数据库相关/oracle (218)
- PHP (147)
- UNIX/LINUX/FREEBSD/solaris (118)
- 音乐探讨 (1)
- 闲话 (11)
- 网络安全等 (21)
- .NET (153)
- ROR和GOG (10)
- [网站分类]4.其他技术区 (181)
- 算法等 (7)
- [随笔分类]SOA (8)
- 收藏区 (71)
- 金融证券 (4)
- [网站分类]5.企业信息化 (3)
- c&c++学习 (1)
- 读书区 (11)
- 其它 (10)
- 收藏夹 (1)
- 设计模式 (1)
- FLEX (14)
- Android (98)
- 软件工程心理学系列 (4)
- HTML5 (6)
- C/C++ (0)
- 数据结构 (0)
- 书评 (3)
- python (17)
- NOSQL (10)
- MYSQL (85)
- java之各类测试 (18)
- nodejs (1)
- JAVA (1)
- neo4j (3)
- VUE (4)
- docker相关 (1)
最新评论
-
xiaobadi:
jacky~~~~~~~~~
推荐两个不错的mybatis GUI生成工具 -
masuweng:
(转)JAVA获得机器码的实现 -
albert0707:
有些扩展名为null
java 7中可以判断文件的contenttype了 -
albert0707:
非常感谢!!!!!!!!!
java 7中可以判断文件的contenttype了 -
zhangle:
https://zhuban.me竹板共享 - 高效便捷的文档 ...
一个不错的网络白板工具
http://macrochen.iteye.com/blog/526258
BATIS提供TypeHandlerCallback来提供对用户自定义类型的处理。
Java代码
public interface TypeHandlerCallback {
public void setParameter(ParameterSetter setter, Object parameter)
throws SQLException;
public Object getResult(ResultGetter getter)
throws SQLException;
public Object valueOf(String s);
}
它主要利用上述的三个方法来对自定义类型转换提供支持。下面我详细讲述下如何利用其来对自定义数据进行支持。
演示的内容主要是将表单中gender列中的字段转换为自己需要的内容(female<->女,male<->男)
1.数据库表people
Sql代码
create table people(
id int not null auto_increment,
gender varchar(10),
constraint pk primary key(id)
);
insert into people(id,gender) values (null,'female');
insert into people(id,gender) values (null,male);
insert into people(id,gender) values (null,null);
表单很简单,主要提供一个自增主键和一个可以为null的性别,并插入了实验数据。
2.POJO类
Java代码
package com.xxx.pojos;
public class People{
private int id;
private String gender;
/**
* @return the id
*/
public int getId() {
return id;
}
/**
* @param id
* the id to set
*/
public void setId(int id) {
this.id = id;
}
/**
* @return the gender
*/
public String getGender() {
return gender;
}
/**
* @param gender
* the gender to set
*/
public void setGender(String gender) {
this.gender = gender;
}
@Override
public String toString() {
return "id:" + id + " gender:" + gender;
}
}
3.TypeHandlerCallback实现类
Java代码
public class GenderTypeHandlerCallback implements TypeHandlerCallback {
private static final String R_FEMALE = "女";
private static final String R_MALE = "男";
private static final String FEMALE = "female";
private static final String MALE = "male";
/**
* @see com.ibatis.sqlmap.client.extensions.TypeHandlerCallback#getResult(com.ibatis.sqlmap.client.extensions.ResultGetter)
*/
public Object getResult(ResultGetter getter) throws SQLException {
if (getter.getObject() == null)
{
return null;
}
return convertDbToValue(getter.getString());
}
/**
* @see com.ibatis.sqlmap.client.extensions.TypeHandlerCallback#setParameter(com.ibatis.sqlmap.client.extensions.ParameterSetter,
* java.lang.Object)
*/
public void setParameter(ParameterSetter setter, Object value)
throws SQLException {
setter.setString(saveValueToDb((String) value));
}
/**
* @see com.ibatis.sqlmap.client.extensions.TypeHandlerCallback#valueOf(java.lang.String)
*/
public Object valueOf(String value) {
return convertDbToValue(value);
}
/**
* 将POJO中的值转换数据库值存储
*
* @param value
* @return
*/
private String saveValueToDb(String value) {
if (value.equals(R_MALE))
{
return FEMALE;
} else if (value.equals(R_FEMALE))
{
return MALE;
} else
{
throw new IllegalArgumentException("参数值不正确!" + value);
}
}
/**
* 将数据库的值转换为POJO所需要的值
*
* @param value
* @return
*/
private String convertDbToValue(String value) {
if (value.equals(FEMALE))
{
return R_FEMALE;
} else if (value.equals(MALE))
{
return R_MALE;
} else
{
throw new IllegalArgumentException("参数值不正确!" + value);
}
}
}
4.注册TypehandlerCallback
可以在多个配置文件中进行注册:
1).sqlMapConfig.xml。全局配置注册.
2)单独的parameterMap或resultMap中注册。
本例主要演示在parameterMap中进行注册
Xml代码
<resultMap class="com.xxx.pojos.People" id="people">
<result property="id" column="id" javaType="int" jdbcType="INT"/>
<result property="gender" column="gender" javaType="string" nullValue="male" jdbcType="VARCHAR" typeHandler="com.xxx.typeHandler.GenderTypeHandlerCallback" />
</resultMap>
5.运行结果
可以发现,原本在数据库中存储中gender列内容为female,male和null,但是经过自定义类型转换后相应变成了男或女。
6.遇到的问题
上述内容经过我测试没有任何问题,不过我在看到相关资料时却出现了一个问题:
在TypeHandlerCallback方法中,存在一个valueOf()方法,其主要作用是当数据库中列可以为空(null)时进行处理。相应地,你需要在注册时在result的nullValue中填写为空时的默认值,如上面的nullValue="male"。
此外,还需要特别注意的一点就是:即使你在注册时填写了nullValue='male',仍然会出现NUllpointer异常,并且跟踪发现valueOf方法没有被调用,解决方法是在getResult方法中添加 if (getter.getObject() == null) { return null; }
即需要你手动判断一次是否为null,当其结果返回null时才有会调用valueOf方法载入所设置的nullValue的值。
BATIS提供TypeHandlerCallback来提供对用户自定义类型的处理。
Java代码
public interface TypeHandlerCallback {
public void setParameter(ParameterSetter setter, Object parameter)
throws SQLException;
public Object getResult(ResultGetter getter)
throws SQLException;
public Object valueOf(String s);
}
它主要利用上述的三个方法来对自定义类型转换提供支持。下面我详细讲述下如何利用其来对自定义数据进行支持。
演示的内容主要是将表单中gender列中的字段转换为自己需要的内容(female<->女,male<->男)
1.数据库表people
Sql代码
create table people(
id int not null auto_increment,
gender varchar(10),
constraint pk primary key(id)
);
insert into people(id,gender) values (null,'female');
insert into people(id,gender) values (null,male);
insert into people(id,gender) values (null,null);
表单很简单,主要提供一个自增主键和一个可以为null的性别,并插入了实验数据。
2.POJO类
Java代码
package com.xxx.pojos;
public class People{
private int id;
private String gender;
/**
* @return the id
*/
public int getId() {
return id;
}
/**
* @param id
* the id to set
*/
public void setId(int id) {
this.id = id;
}
/**
* @return the gender
*/
public String getGender() {
return gender;
}
/**
* @param gender
* the gender to set
*/
public void setGender(String gender) {
this.gender = gender;
}
@Override
public String toString() {
return "id:" + id + " gender:" + gender;
}
}
3.TypeHandlerCallback实现类
Java代码
public class GenderTypeHandlerCallback implements TypeHandlerCallback {
private static final String R_FEMALE = "女";
private static final String R_MALE = "男";
private static final String FEMALE = "female";
private static final String MALE = "male";
/**
* @see com.ibatis.sqlmap.client.extensions.TypeHandlerCallback#getResult(com.ibatis.sqlmap.client.extensions.ResultGetter)
*/
public Object getResult(ResultGetter getter) throws SQLException {
if (getter.getObject() == null)
{
return null;
}
return convertDbToValue(getter.getString());
}
/**
* @see com.ibatis.sqlmap.client.extensions.TypeHandlerCallback#setParameter(com.ibatis.sqlmap.client.extensions.ParameterSetter,
* java.lang.Object)
*/
public void setParameter(ParameterSetter setter, Object value)
throws SQLException {
setter.setString(saveValueToDb((String) value));
}
/**
* @see com.ibatis.sqlmap.client.extensions.TypeHandlerCallback#valueOf(java.lang.String)
*/
public Object valueOf(String value) {
return convertDbToValue(value);
}
/**
* 将POJO中的值转换数据库值存储
*
* @param value
* @return
*/
private String saveValueToDb(String value) {
if (value.equals(R_MALE))
{
return FEMALE;
} else if (value.equals(R_FEMALE))
{
return MALE;
} else
{
throw new IllegalArgumentException("参数值不正确!" + value);
}
}
/**
* 将数据库的值转换为POJO所需要的值
*
* @param value
* @return
*/
private String convertDbToValue(String value) {
if (value.equals(FEMALE))
{
return R_FEMALE;
} else if (value.equals(MALE))
{
return R_MALE;
} else
{
throw new IllegalArgumentException("参数值不正确!" + value);
}
}
}
4.注册TypehandlerCallback
可以在多个配置文件中进行注册:
1).sqlMapConfig.xml。全局配置注册.
2)单独的parameterMap或resultMap中注册。
本例主要演示在parameterMap中进行注册
Xml代码
<resultMap class="com.xxx.pojos.People" id="people">
<result property="id" column="id" javaType="int" jdbcType="INT"/>
<result property="gender" column="gender" javaType="string" nullValue="male" jdbcType="VARCHAR" typeHandler="com.xxx.typeHandler.GenderTypeHandlerCallback" />
</resultMap>
5.运行结果
可以发现,原本在数据库中存储中gender列内容为female,male和null,但是经过自定义类型转换后相应变成了男或女。
6.遇到的问题
上述内容经过我测试没有任何问题,不过我在看到相关资料时却出现了一个问题:
在TypeHandlerCallback方法中,存在一个valueOf()方法,其主要作用是当数据库中列可以为空(null)时进行处理。相应地,你需要在注册时在result的nullValue中填写为空时的默认值,如上面的nullValue="male"。
此外,还需要特别注意的一点就是:即使你在注册时填写了nullValue='male',仍然会出现NUllpointer异常,并且跟踪发现valueOf方法没有被调用,解决方法是在getResult方法中添加 if (getter.getObject() == null) { return null; }
即需要你手动判断一次是否为null,当其结果返回null时才有会调用valueOf方法载入所设置的nullValue的值。
发表评论
-
复习:强迫线程顺序执行方式
2019-01-03 23:42 1594方法1: 三个线程,t1,t2,t3,如果一定要按顺序执行, ... -
(转)不错的前后端处理异常的方法
2019-01-02 23:16 2024前言 在 Web 开发中, 我们经常会需要处理各种异常, 这是 ... -
info q的极客时间大咖说等资料下载
2018-08-15 08:40 3479info q的极客时间大咖说等资料下载,还有不少思维导图 链 ... -
CXF 客户端超时时间设置(非Spring配置方式)
2018-07-03 22:38 2244import org.apache.cxf.endpoint. ... -
(转)synchronized关键字画像:正确打开方式
2018-06-14 09:25 499https://mp.weixin.qq.com/s/b3Sx ... -
CountDownLatch的例子
2018-06-13 14:10 697public class StatsDemo { ... -
两道面试题,带你解析Java类加载机制
2018-06-12 16:29 624https://mp.weixin.qq.com/s/YTa0 ... -
Spring中获取request的几种方法,及其线程安全性分析
2018-06-11 09:03 676https://mp.weixin.qq.com/s/KeFJ ... -
内部类小结
2018-06-06 10:25 444https://mp.weixin.qq.com/s/hErv ... -
JVM虚拟机小结1
2018-06-04 20:43 5531 jps -l //列出详细的类名和进程ID 2)jps ... -
windows下自带命令行工具查看CPU资源情况等
2018-06-04 12:53 3113微软提供了不少命令行 ... -
(收藏)深入分析Java的序列化与反序列化
2018-05-30 15:21 626https://mp.weixin.qq.com/s/T2Bn ... -
apache common包中的序列化工具
2018-05-30 09:10 1849什么是序列化 我们的 ... -
JAVA8 JVM的变化: 元空间(Metaspace)
2018-05-24 22:30 973本文将会分享至今为至我收集的关于永久代(Permanent G ... -
(转)服务器性能指标(一)——负载(Load)分析及问题排查
2018-05-21 21:03 1379原创: Hollis Hollis 负载 ... -
(转)对象复用
2018-05-20 15:27 870public class Student { priv ... -
mapreduce中入门中要注意的几点
2018-05-06 08:59 679在 mapreduce中,比如有如下的词: I love b ... -
HDFS的基本操作
2018-05-02 21:47 946-mkdir 在HDFS创建目录 ... -
一个不错的开源工具类,专门用来解析日志头部的,好用
2018-05-02 20:00 777一个不错的开源工具类,专门用来解析日志头部的,好用。 http ... -
介绍个不错的RESTFUL MOCK的工具wiremock
2018-04-27 21:02 1915介绍个不错的RESTFUL MOCK的工具wiremock,地 ...
相关推荐
`TypeHandlerCallback`是iBatis(或MyBatis)中的一个重要接口,用于处理Java类型与数据库类型之间的转换。在处理数据库操作时,数据的类型转换是必不可少的步骤,因为Java类型和数据库存储的数据类型往往不完全匹配...
总结来说,`iBatis`的自定义数据类型机制允许我们在不支持中文的数据库中存储汉字,通过编写自定义的TypeHandler,我们可以灵活地将中文字符串转换为数据库可以接受的格式,然后在读取时恢复原状。这种方式在无法...
MyBatis提供了BaseTypeHandler作为类型处理器的基类,大部分自定义类型处理器会继承这个基类,因为它提供了一些通用的处理逻辑。 **自定义类型处理器的原理**: 1. **setParameter**:此方法负责将Java类型的参数...
### Ibatis调用Oracle存储过程返回自定义类型 在企业级应用开发中,尤其是在金融、保险等业务场景中,往往需要处理复杂的数据结构与逻辑。本文将深入探讨如何使用Ibatis框架来调用Oracle数据库中的存储过程,并实现...
自定义类型处理器需要实现`org.apache.ibatis.type.TypeHandler`接口,并重写`setNonNullParameter`、`getNullableResult`和`getResultFromCursor`方法。 ```java public class CustomTypeHandler implements ...
ibatIS代码生成插件是一款高效实用的开发工具,它主要应用于Java开发环境中,通过自动化的方式帮助开发者快速生成常见的CRUD(创建、读取、更新、删除)操作代码,极大地提高了开发效率。这款插件基于Abator框架,...
在IT行业中,数据库操作是应用开发的核心部分,而Ibatis作为一个优秀的持久层框架,极大地简化了Java应用程序与数据库之间的交互。动态查询语句配置是Ibatis的一个重要特性,它允许我们在运行时根据业务需求构建灵活...
8. **类型处理器**:MyBatis的TypeHandler接口提供了更丰富的类型转换,避免了在SQL语句中处理复杂数据类型时的困扰。 9. **缓存机制**:MyBatis提供了一级缓存和二级缓存,可以提高数据查询的效率。 10. **集成...
Ibatis提供了多种方式来实现映射,如自动类型匹配、自定义类型处理器、复杂关联映射等。 7. **缓存机制**:Ibatis内置了本地缓存和二级缓存,可以提高数据读取速度。本地缓存作用于单个SqlSession,而二级缓存则...
7. **自定义类型处理器**:`<typehandler>`元素允许开发者自定义类型处理器,解决JDBC无法自动转换的复杂类型问题。 8. **SQL映射文件命名约定**:在Ibatis中,通常按照Java类或接口的全限定名来命名SQL映射文件,...
标题中的“自定义Ibatis生成器”指的是在使用MyBatis框架时,为了解决重复的手动编写SQL映射文件和Mapper接口,开发者可以创建自己的代码生成器,以自动化这个过程。Ibatis生成器(也称为MyBatis Generator)允许...
Ibatis对枚举类型的原生支持可能不如实体类那样直观,但通过一些策略,我们可以实现枚举与数据库字段之间的映射。以下将详细解释如何在Ibatis中处理枚举类型。 首先,我们需要定义枚举类。枚举类通常包含若干枚举...
5. **类型处理器扩展**:iBATIS3允许开发者自定义类型处理器,用于处理不同类型之间的转换,这为处理非标准数据类型提供了便利。 6. **插件架构**:iBATIS3支持插件架构,开发者可以通过编写插件来扩展框架的功能,...
转ibatis动态sql - phoebus0501 - 博客园.mht
7. **结果映射**:iBATIS能自动将查询结果映射到Java对象,通过结果映射配置,可以指定字段与Java属性之间的映射关系,支持自定义类型处理器以处理复杂类型的映射。 8. **参数映射**:在调用SQL时,iBATIS可以自动...
综上所述,通过iBATIS操作Oracle的CLOB数据,需要对iBATIS的映射文件、类型处理器以及Oracle的CLOB特性有深入理解。在实际开发中,合理配置和使用这些机制,能够有效地管理大量文本数据,同时保持代码的简洁性和可...
在iBatis中,输入输出参数类型的支持非常丰富,几乎涵盖了Java中常见的所有基本数据类型及其封装类,同时也支持自定义JavaBean类型的传递。这使得开发者在处理数据库操作时具有很高的灵活性。 - **基本数据类型**: ...
8. **高级话题**:涵盖与iBATIS相关的高级主题,如批处理、延迟加载、自定义类型处理器、插件扩展等,提升开发者对iBATIS框架的深度理解。 9. **最佳实践**:提供实用的项目开发建议,如如何设计合理的映射文件结构...
7. **Type Handlers**:iBATIS提供了默认的类型处理器,但开发者也可以自定义类型处理器,以便对特定的数据类型进行特殊处理,比如日期格式化。 8. **Transactions**:iBATIS支持手动和自动事务管理,可以根据需求...
标题 "ibatis类型" 暗示我们讨论的是关于iBATIS这个持久层框架的一些特定类型或组件。iBATIS是Java开发中的一个流行数据库访问框架,它允许开发者将SQL语句直接集成到XML配置文件中,实现了SQL与Java代码的分离,...