`

myibatis3 使用 typeHandler自定义类型转换器

 
阅读更多

1. 使用myibatis3 时,把list 列表中的内容存储到数据库的 varchar 字段中。

 

2.pojo 类

public class Role implements Serializable {

    private Long id; //编号

    private String role; //角色标识

    private String description; //角色描述

    private List<Long> resourceIds; //拥有的资源(要转换的字段)

    private Boolean available = Boolean.FALSE; //是否可用

    public Role() {

    }

 

    public Role(String role, String description, Boolean available) {

        this.role = role;

        this.description = description;

        this.available = available;

    }

 

    public Long getId() {

        return id;

    }

 

    public void setId(Long id) {

        this.id = id;

    }

 

    public String getRole() {

        return role;

    }

 

    public void setRole(String role) {

        this.role = role;

    }

 

    public String getDescription() {

        return description;

    }

 

    public void setDescription(String description) {

        this.description = description;

    }

 

    public List<Long> getResourceIds() {

        if(resourceIds == null) {

            resourceIds = new ArrayList<Long>();

        }

        return resourceIds;

    }

 

    public void setResourceIds(List<Long> resourceIds) {

        this.resourceIds = resourceIds;

    }

 

    public String getResourceIdsStr() {

        if(CollectionUtils.isEmpty(resourceIds)) {

            return "";

        }

        StringBuilder s = new StringBuilder();

        for(Long resourceId : resourceIds) {

            s.append(resourceId);

            s.append(",");

        }

        return s.toString();

    }

 

    public void setResourceIdsStr(String resourceIdsStr) {

        if(StringUtils.isEmpty(resourceIdsStr)) {

            return;

        }

        String[] resourceIdStrs = resourceIdsStr.split(",");

        for(String resourceIdStr : resourceIdStrs) {

            if(StringUtils.isEmpty(resourceIdStr)) {

                continue;

            }

            getResourceIds().add(Long.valueOf(resourceIdStr));

        }

    }

 

    public Boolean getAvailable() {

        return available;

    }

 

    public void setAvailable(Boolean available) {

        this.available = available;

    }

 

    @Override

    public boolean equals(Object o) {

        if (this == o) return true;

        if (o == null || getClass() != o.getClass()) return false;

 

        Role role = (Role) o;

 

        if (id != null ? !id.equals(role.id) : role.id != null) return false;

 

        return true;

    }

 

    @Override

    public int hashCode() {

        return id != null ? id.hashCode() : 0;

    }

 

    @Override

    public String toString() {

        return "Role{" +

                "id=" + id +

                ", role='" + role + '\'' +

                ", description='" + description + '\'' +

                ", resourceIds=" + resourceIds +

                ", available=" + available +

                '}';

    }

}

 

 

3.定义类型转换类

 

import java.sql.CallableStatement;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.ArrayList;

import java.util.List;

 

import org.apache.ibatis.type.JdbcType;

import org.apache.ibatis.type.TypeHandler;

/**

 * list 列表存储到数据库时,存储为varchar 类型

 * 

 * @author dell

 *

 */

public class ListTypeHandler implements TypeHandler{

 

@Override

public Object getResult(ResultSet rs, String name) throws SQLException {

String value = rs.getString(name);

String [] array =value.split(",");

List<Long> list = new ArrayList<Long>();

if(null !=array){

int len = array.length;

for(int i=0;i<len;i++){

list.add(Long.parseLong(array[i]));

}

}

return list;

}

 

@Override

public Object getResult(ResultSet res, int in) throws SQLException {

return null;

}

 

@Override

public Object getResult(CallableStatement cst, int in) throws SQLException {

List<Long> list = (List<Long>)cst.getObject(in);

 

return list;

}

 

 

/**

*PreparedStatement pst, 

* int place, 参数位置

* Object obj, Java类型的对象

* JdbcType type  数据库类型

*/

@Override

public void setParameter(PreparedStatement pst, int place, Object obj, JdbcType type) throws SQLException {

@SuppressWarnings("unchecked")

List<Long> b = (List<Long>) obj;    

  StringBuffer value = new StringBuffer(60);

  for(Long l:b){

  value.append(l.toString()).append(",");

  }

  pst.setString(place, value.toString());

 

 

}

 

}

 

 

 

4.注册类型转化类

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

<!-- 别名 -->

<typeAliases>

<typeAlias type="boce.auth.shiro.pojo.User" alias="user"/>

<typeAlias type="boce.auth.shiro.pojo.Resources" alias="Resources"/>

<typeAlias type="boce.auth.shiro.pojo.Role" alias="Role"/>

 

</typeAliases> 

 

<typeHandlers>

<typeHandler javaType="java.util.List" jdbcType="VARCHAR"    

      handler="boce.auth.common.util.ListTypeHandler" />

    </typeHandlers>

</configuration>

 

 

 

5. 使用自定义转化类

 

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE mapper

  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="boce.auth.shiro.pojo.Role">

 

 

 

<resultMap type="Role" id="id_role">

<id column="id" property="id" />

<result column="role" property="role" />

<result column="description" property="description"/>

    <result column="resource_ids" property="resourceIds" javaType="java.util.List" jdbcType="VARCHAR"/>

  <result column="available" property="available" />

 

</resultMap> 

 

 

 

<insert id="id_insert_save" parameterType="Role" >

<selectKey keyProperty="id" order="BEFORE" resultType="Long">

select sql_id.nextval from dual

</selectKey>

insert into sys_role(id, role, description, 

resource_ids, available) 

values

     (#{id}, #{role,jdbcType=VARCHAR}, #{description,jdbcType=VARCHAR}, 

     #{resourceIds,javaType=java.util.List,jdbcType=VARCHAR}, 

     #{available})

</insert>

 

</mapper>

 

 

 

 

6.表结构:

create table SYS_ROLE

(

  ID           NUMBER not null,

  ROLE         VARCHAR2(100),

  DESCRIPTION  VARCHAR2(100),

  RESOURCE_IDS VARCHAR2(100),

  AVAILABLE    INTEGER default 0

);

 



 

 

测试结果:



 

 

 

 

 

  • 大小: 15.6 KB
  • 大小: 19 KB
分享到:
评论

相关推荐

    Mybatis实现自定义类型转换器TypeHandler的方法

    在某些场景下,MyBatis内置的类型转换器可能无法满足我们的需求,这时就需要我们自定义TypeHandler。下面将详细介绍如何在MyBatis中实现自定义类型转换器。 首先,我们需要了解MyBatis的基本概念。MyBatis是一个...

    Mybatis自定义类型转换器的使用技巧

    Mybatis自定义类型转换器的使用技巧是指在Mybatis框架中,使用自定义类型转换器来实现类型之间的转换,以满足特殊的业务需求。在这篇文章中,我们将详细介绍Mybatis自定义类型转换器的使用技巧,通过示例代码来演示...

    MyBatis自定义类型转换器实现加解密

    在实际应用中,你需要在MyBatis的配置文件中注册这个自定义的 `CryptTypeHandler`,这样MyBatis在处理 `CryptType` 类型的字段时就会使用这个转换器。例如: ```xml &lt;typeHandler handler=...

    1.springbood+mybatis项目demo2.mybatis自定义枚举类型的转换器以及各种使用场景

    使用这个转换器时,我们需要在MyBatis的Mapper XML文件中为字段指定这个自定义的TypeHandler,或者在实体类的枚举属性上使用`@TypeHandler`注解。 枚举类型的使用场景多种多样,例如: 1. 订单状态:如待支付、已...

    自定义mybatis流程分析.rar

    1. 自定义TypeHandler:当MyBatis内置的TypeHandler无法满足需求时,可以编写自定义TypeHandler,覆盖默认的类型转换逻辑,如处理自定义枚举类型、复杂对象等。 2. 自定义Executor:Executor是MyBatis的执行器,...

    Mybatis实战之TypeHandler高级进阶

    为了解决这个问题,我们需要将自定义的枚举TypeHandler注册到Mybatis的TypeHandlerRegistry中,确保Mybatis在遇到特定枚举类型时能自动使用我们定义的转换器。 实现这个目标,我们需要以下步骤: 1. **注册自定义...

    MyBatis 讲义 第二版.docx

    MyBatis 使用 TypeHandler 来处理数据库类型与 Java 类型之间的转换。默认情况下,MyBatis 提供了一系列的预定义 TypeHandlers。例如,当字段为 int 类型,而实体类属性为 boolean 时,可通过自定义 TypeHandler ...

    mybatis3.x源码深度解析与最佳实践.pdf

    TypeHandler 是 MyBatis 中的类型处理器,该对象负责将 Java 对象转换成 SQL 语句中可用的类型。 3.6 对象包装器工厂 对象包装器工厂是 MyBatis 中的核心对象之一,该对象负责将 Java 对象转换成 SQL 语句中可用的...

    mybatis-3-mybatis-3.2.6

    或者研究TypeHandler,针对特定类型开发自定义的类型处理器;还可以研究Mapper的动态加载机制,提高应用的灵活性。总之,掌握源码对于深入理解MyBatis的工作机制、提升开发效率和解决实际问题具有重要意义。

    mybatis3 源码

    TypeHandler是MyBatis中处理Java类型和JDBC类型之间转换的关键组件。通过自定义TypeHandler,我们可以实现对特殊类型的支持。 9. **XML配置和注解映射** MyBatis支持XML配置和注解两种方式来定义SQL映射。源码中...

    mybatis-3-mybatis-3.5.8.zip源码

    9. **TypeHandler**: 类型处理器,处理Java类型与数据库类型的映射,确保数据的正确转换。 10. **XML配置文件和注解映射**: MyBatis支持XML方式和注解方式来定义SQL语句和映射关系,通过`@Select`, `@Insert`, `@...

    MyBatis Source MyBatis源代码

    8. **TypeHandler**: 处理Java类型到JDBC类型和反之的转换,是MyBatis类型映射的核心。 9. **Mapper接口和Mapper XML文件**: MyBatis允许开发者定义自定义的Mapper接口和对应的XML文件,XML文件中定义了SQL语句和...

    mybatis-3-mybatis-3.5.7.tar.gz

    10. **类型处理器(TypeHandler)**:MyBatis的类型处理器负责Java类型和JDBC类型之间的转换。 11. **XML配置与注解配置**:MyBatis允许使用XML或注解两种方式配置SQL,开发者可以根据喜好选择。 在实际开发中,...

    mybatis-3.5.9 源码(mybatis-3-mybatis-3.5.9.tar.gz)

    6. **TypeHandler**:MyBatis 提供了对 Java 类型和数据库类型之间的自动转换,TypeHandler 在其中起到了关键作用。源码分析 TypeHandler,可以帮助理解 MyBatis 如何处理不同类型的数据转换。 7. **插件支持**:...

    mybatis-3.2.2-src.rar 源码

    4. **TypeHandler**:Mybatis 内置了多种TypeHandler,用于处理Java类型和数据库类型之间的转换。开发者可以根据需要自定义TypeHandler以处理特殊类型的映射。 5. **Mapper接口**:通过Mapper接口,开发者可以在...

    mybatis3源码

    自定义类型处理器,用于处理Java类型与JDBC类型之间的转换,如DateTypeHandler、BigDecimalTypeHandler等。 6. **缓存机制** MyBatis支持本地缓存(Local Cache)和二级缓存(Second Level Cache),提升查询效率...

    mybatis-3.5.9 源码(mybatis-3-mybatis-3.5.9.zip)

    - TypeHandler 用于 Java 类型和 JDBC 类型之间的转换,确保数据正确地在 Java 应用和数据库之间进行传递。 7. **动态 SQL** - MyBatis 的强大之处在于其支持动态 SQL,通过 if、choose、when、otherwise、...

    boot+mybatis、mybatis中枚举转换器、前后端分离项目统一返回格式、boot集成quraz框架实现定时任务

    为解决此问题,我们可以创建一个自定义的TypeHandler,实现`org.apache.ibatis.type.TypeHandler`接口。这个类型处理器负责将枚举值转化为字符串(存储)和从字符串恢复为枚举(读取)。在MyBatis的配置中注册这个...

    mybatis-3-master.zip

    7. **TypeHandler**: 类型处理器,处理 Java 类型与 JDBC 类型之间的转换。 8. **SqlSession**: 与数据库交互的接口,提供 CRUD 操作方法,每个操作都应在一个 SqlSession 的作用域内完成,并确保关闭 SqlSession。...

    mybatis-3-mybatis-3.4.1源码

    6. **TypeHandler**:处理数据类型转换,确保Java类型和JDBC类型之间的准确转换。 7. **Plugins**:MyBatis的插件机制,可以通过拦截器对Executor、StatementHandler、ParameterHandler和ResultSetHandler进行增强...

Global site tag (gtag.js) - Google Analytics