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
);
测试结果:
相关推荐
在某些场景下,MyBatis内置的类型转换器可能无法满足我们的需求,这时就需要我们自定义TypeHandler。下面将详细介绍如何在MyBatis中实现自定义类型转换器。 首先,我们需要了解MyBatis的基本概念。MyBatis是一个...
Mybatis自定义类型转换器的使用技巧是指在Mybatis框架中,使用自定义类型转换器来实现类型之间的转换,以满足特殊的业务需求。在这篇文章中,我们将详细介绍Mybatis自定义类型转换器的使用技巧,通过示例代码来演示...
在实际应用中,你需要在MyBatis的配置文件中注册这个自定义的 `CryptTypeHandler`,这样MyBatis在处理 `CryptType` 类型的字段时就会使用这个转换器。例如: ```xml <typeHandler handler=...
使用这个转换器时,我们需要在MyBatis的Mapper XML文件中为字段指定这个自定义的TypeHandler,或者在实体类的枚举属性上使用`@TypeHandler`注解。 枚举类型的使用场景多种多样,例如: 1. 订单状态:如待支付、已...
1. 自定义TypeHandler:当MyBatis内置的TypeHandler无法满足需求时,可以编写自定义TypeHandler,覆盖默认的类型转换逻辑,如处理自定义枚举类型、复杂对象等。 2. 自定义Executor:Executor是MyBatis的执行器,...
为了解决这个问题,我们需要将自定义的枚举TypeHandler注册到Mybatis的TypeHandlerRegistry中,确保Mybatis在遇到特定枚举类型时能自动使用我们定义的转换器。 实现这个目标,我们需要以下步骤: 1. **注册自定义...
MyBatis 使用 TypeHandler 来处理数据库类型与 Java 类型之间的转换。默认情况下,MyBatis 提供了一系列的预定义 TypeHandlers。例如,当字段为 int 类型,而实体类属性为 boolean 时,可通过自定义 TypeHandler ...
TypeHandler 是 MyBatis 中的类型处理器,该对象负责将 Java 对象转换成 SQL 语句中可用的类型。 3.6 对象包装器工厂 对象包装器工厂是 MyBatis 中的核心对象之一,该对象负责将 Java 对象转换成 SQL 语句中可用的...
或者研究TypeHandler,针对特定类型开发自定义的类型处理器;还可以研究Mapper的动态加载机制,提高应用的灵活性。总之,掌握源码对于深入理解MyBatis的工作机制、提升开发效率和解决实际问题具有重要意义。
TypeHandler是MyBatis中处理Java类型和JDBC类型之间转换的关键组件。通过自定义TypeHandler,我们可以实现对特殊类型的支持。 9. **XML配置和注解映射** MyBatis支持XML配置和注解两种方式来定义SQL映射。源码中...
9. **TypeHandler**: 类型处理器,处理Java类型与数据库类型的映射,确保数据的正确转换。 10. **XML配置文件和注解映射**: MyBatis支持XML方式和注解方式来定义SQL语句和映射关系,通过`@Select`, `@Insert`, `@...
8. **TypeHandler**: 处理Java类型到JDBC类型和反之的转换,是MyBatis类型映射的核心。 9. **Mapper接口和Mapper XML文件**: MyBatis允许开发者定义自定义的Mapper接口和对应的XML文件,XML文件中定义了SQL语句和...
10. **类型处理器(TypeHandler)**:MyBatis的类型处理器负责Java类型和JDBC类型之间的转换。 11. **XML配置与注解配置**:MyBatis允许使用XML或注解两种方式配置SQL,开发者可以根据喜好选择。 在实际开发中,...
6. **TypeHandler**:MyBatis 提供了对 Java 类型和数据库类型之间的自动转换,TypeHandler 在其中起到了关键作用。源码分析 TypeHandler,可以帮助理解 MyBatis 如何处理不同类型的数据转换。 7. **插件支持**:...
4. **TypeHandler**:Mybatis 内置了多种TypeHandler,用于处理Java类型和数据库类型之间的转换。开发者可以根据需要自定义TypeHandler以处理特殊类型的映射。 5. **Mapper接口**:通过Mapper接口,开发者可以在...
自定义类型处理器,用于处理Java类型与JDBC类型之间的转换,如DateTypeHandler、BigDecimalTypeHandler等。 6. **缓存机制** MyBatis支持本地缓存(Local Cache)和二级缓存(Second Level Cache),提升查询效率...
- TypeHandler 用于 Java 类型和 JDBC 类型之间的转换,确保数据正确地在 Java 应用和数据库之间进行传递。 7. **动态 SQL** - MyBatis 的强大之处在于其支持动态 SQL,通过 if、choose、when、otherwise、...
为解决此问题,我们可以创建一个自定义的TypeHandler,实现`org.apache.ibatis.type.TypeHandler`接口。这个类型处理器负责将枚举值转化为字符串(存储)和从字符串恢复为枚举(读取)。在MyBatis的配置中注册这个...
7. **TypeHandler**: 类型处理器,处理 Java 类型与 JDBC 类型之间的转换。 8. **SqlSession**: 与数据库交互的接口,提供 CRUD 操作方法,每个操作都应在一个 SqlSession 的作用域内完成,并确保关闭 SqlSession。...
6. **TypeHandler**:处理数据类型转换,确保Java类型和JDBC类型之间的准确转换。 7. **Plugins**:MyBatis的插件机制,可以通过拦截器对Executor、StatementHandler、ParameterHandler和ResultSetHandler进行增强...