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

);

 



 

 

测试结果:



 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值