我正在尝试为 ArrayList 编写类型处理程序,但这给了我错误,任何人都可以帮助我。

我想将 ArrayList 作为 VARCHAR 存储在数据库中并将其检索为 ArrayList。

package com.someweb.typehandlers; 
 
import java.sql.CallableStatement; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.util.ArrayList; 
import java.util.Collection; 
 
import org.apache.ibatis.type.BaseTypeHandler; 
import org.apache.ibatis.type.JdbcType; 
import org.apache.ibatis.type.MappedJdbcTypes; 
import org.apache.ibatis.type.MappedTypes; 
//@MappedTypes(java.util.ArrayList.class) 
 
//@MappedJdbcTypes(JdbcType.VARCHAR) 
public class StringArrayListTypeHandler extends BaseTypeHandler<ArrayList<String>>  
{ 
@Override 
public void setNonNullParameter(PreparedStatement ps, int i, ArrayList<String> parameter, JdbcType jdbcType) 
        throws SQLException { 
    // TODO Auto-generated method stub 
    StringBuilder str=new StringBuilder(parameter.toString()); 
    ps.setString(i,str.substring(1,str.length()-1)); 
 
} 
 
@Override 
public ArrayList<String> getNullableResult(ResultSet rs, String columnName) throws SQLException { 
    // TODO Auto-generated method stub 
 
    String str=rs.getString(columnName); 
 
    ArrayList<String> roles=new ArrayList<String>(); 
    String[] rolesarray=str.split(","); 
    for(String s:rolesarray) 
    roles.add(s); 
 
    return roles; 
} 
 
@Override 
public ArrayList<String> getNullableResult(ResultSet rs, int columnIndex) throws SQLException { 
    // TODO Auto-generated method stub 
    String str=rs.getString(columnIndex); 
 
    ArrayList<String> roles=new ArrayList<String>(); 
    String[] rolesarray=str.split(","); 
    for(String s:rolesarray) 
    roles.add(s); 
 
    return roles;   } 
 
@Override 
public ArrayList<String> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { 
    // TODO Auto-generated method stub 
    String str=cs.getString(columnIndex); 
 
    ArrayList<String> roles=new ArrayList<String>(); 
    String[] rolesarray=str.split(","); 
    for(String s:rolesarray) 
    roles.add(s); 
 
    return roles;   } 
 
} 

我是 myBatis 的新手。所以有人帮我我不知道如何做到这一点

我的 dto 类看起来像这样
package com.someweb.dto; 
 
import java.security.Principal; 
import java.sql.Array; 
import java.text.SimpleDateFormat; 
import java.util.ArrayList; 
import java.util.List; 
 
public class UserDTO implements Principal { 
 
private int id; 
private String username; 
 
private String name; 
private String password; 
private String token; 
private String email; 
private boolean isAuthenticated; 
private boolean is_active; 
 
private List<String> role; 
private String phone; 
public String getToken() { 
    return token; 
} 
 
public void setToken(String token) { 
    this.token = token; 
} 
 
public String getUsername() { 
    return username; 
} 
 
public void setUsername(String username) { 
    this.username = username; 
} 
 
public String getEmail() { 
    return email; 
} 
 
public void setEmail(String email) { 
    this.email = email; 
} 
 
public boolean isAuthenticated() { 
    return isAuthenticated; 
} 
 
public void setAuthenticated(boolean isAuthenticated) { 
    this.isAuthenticated = isAuthenticated; 
} 
 
public List<String> getRole() { 
    return role; 
} 
 
 
 
public void setRole(List<String> role) { 
    this.role = role; 
} 
public void setRole(String role) { 
     this.role.add(role); 
} 
 public void addRole(String role) 
 { 
     if(role==null) this.role=new ArrayList<String>(); 
     this.role.add(role); 
 
 } 
 
public int getId() { 
    return id; 
} 
 
public void setId(int id) { 
    this.id = id; 
} 
 
public String getName() { 
    return name; 
} 
 
public void setName(String name) { 
    this.name = name; 
} 
 
public String getPassword() { 
    return password; 
} 
 
public void setPassword(String password) { 
    this.password = password; 
} 
 
public boolean isIs_active() { 
    return is_active; 
} 
 
public void setIs_active(boolean is_active) { 
    this.is_active = is_active; 
} 
 
public String getPhone() { 
    return phone; 
} 
 
public void setPhone(String phone) { 
    this.phone = phone; 
} 
} 

我的映射器文件代码是这样的
    <resultMap id="userResultMap" type="com.someweb.dto.UserDTO"> 
  <id property="id" column="id" /> 
  <result property="username" column="username"/> 
  <result property="password" column="password"/> 
  <result property="email" column="email"/> 
 <result property="phone" column="phone"/> 
 <result property="is_active" column="is_active"/> 
  <collection property="role" ofType="java.lang.String" > 
        <result column="role" /> 
    </collection> 
 
</resultMap> 
<insert id="insertUser" useGeneratedKeys="true" 
    keyProperty="id"> 
  insert into tblusers(username,password,email,phone,role,is_active)  
  values(#{username},#{password},#{email},#{phone},#{role,typeHandler=com.someweb.typehandlers.StringArrayListTypeHandler},#{is_active}) 
</insert> 

现在插入执行。但是当将数据检索到 DTO 时,整个角色字段被作为 ArrayList 中的单个字符串获取。

如果删除 typeHandler 属性,我会收到错误
Cause: org.postgresql.util.PSQLException: Can't infer the SQL type to use for an instance of java.util.ArrayList. Use setObject() with an explicit Types value to specify the type to use. 

请您参考如下方法:

我找到了解决方案

集合用于获取一对多关系的多方所以它总是从多条记录中返回对象的集合

在我的情况下,我需要来自单个记录单元格的 ArrayList 所以。我必须删除 <collection>标签
只需使用 <result>如下所示的标签代码有效

<result property="role" column="role" javaType="java.util.ArrayList" 
        jdbcType="VARCHAR" typeHandler="com.greenflight.typehandlers.StringArrayListTypeHandler" /> 


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!