myBatis 中 ArrayList 的类型处理程序

2024-03-13

我正在尝试为 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" />
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

myBatis 中 ArrayList 的类型处理程序 的相关文章

  • FAT32 每个目录的文件数限制

    我目前正在尝试在 Xilinx Kintex 7 卡上用 C 语言编写 FAT 系统 它配备了 MicroBlaze 我已经成功创建了大部分所需的功能 我面临的问题是关于文件夹的总容量 我在网上读到 在 FAT32 中 一个文件夹应该能够包
  • 将 Resharper 测试运行器与 Jasmine 2.0 结合使用

    我正在尝试将 VS2013 中的 Resharper v8 2 测试运行程序与 Jasmine 2 一起使用 但在 beforeEach 调用 全局 时遇到问题 该规范文件有一个对 SpecHelper js 的 脚本引用 该引用调用了 b

随机推荐

  • 从 Kickstarter 项目中抓取文本不会返回任何结果

    我正在尝试从 Kickstarter 项目网页中抓取项目的主要文本 我有以下代码 适用于第一个 URL 但不适用于第二个和第三个 URL 我想知道是否可以轻松修复我的代码而无需使用其他软件包 url https www kickstarte
  • 数组放置新需要缓冲区中未指定的开销?

    5 3 4 expr new C 11 Feb 草案给出了示例 new 2 f T 5 结果调用operator new sizeof T 5 y 2 f 这里 x和y是非负未指定值 表示数组分配开销 的结果新表达将从返回的值中抵消此金额o
  • Flash、Flex、Adobe Air、Java FX 和 Silverlight 到底有什么用?

    Flash Flex Adobe Air Java FX 和 Silverlight 到底有什么用 为什么我会选择其中之一而不是另一个 Java Applet 和 ActiveX 控件发生了什么 哦 AJAX 在哪里适合这一切呢 拉斯洛相关
  • pylint 找不到 QWidget 和 QApplication

    import sys from PyQt5 QtWidgets import QApplication QWidget app QApplication sys argv window QWidget window setGeometry
  • 2D char Array 和 char** 之间的区别(OR、3D char Array 和 char*** 等)

    首先 我已经回顾过这些 多维数组在内存中是如何格式化的 https stackoverflow com questions 2565039 how are multi dimensional arrays formatted in memo
  • Phonegap 屏幕因 AdMob 动画而闪烁

    一位用户报告说 当 admob 广告有动画时 应用程序的 html 视图会 闪烁 这是他录制的一个小视频 http www youtube com watch v gQ7yxzpqfDA http www youtube com watch
  • 从同一类中的另一个构造函数调用构造函数

    我有一个有 2 个构造函数的类 public class Lens public Lens string parameter1 blabla public Lens string parameter1 string parameter2 w
  • 为什么Django的Meta是一个旧式类?

    我注意到在 Django 模型中 有一个class Meta这对模型做了一些额外的定义 我的问题是 为什么这是一个老式的课程 即不子类化object 这是有原因的还是这只是一种习俗 我可以在我的项目中将其作为新式课程吗 我相信没有真正的原因
  • UITableView 延迟图像加载,图像在表格停止滚动后出现

    我使用 NSUrlConnection 为 UITableView 实现了延迟图像加载 这一切都运行得非常好 当我打开桌子时 等待一秒钟 在 3G 上 我会自动获取图像 但是 当我滚动时 表格会加载新单元格 启动 NSURLConnecti
  • Neo4j - 按相关性排序

    我想按 Neo4j 中的相关性对返回的数据进行排序 就我的目的而言 相关性可以简化为 我正在搜索的单词的索引 其中索引越低 相关性越高 Example 我有这三个节点 node Label PROD properties name Bear
  • 使用 java 泛型迭代枚举值

    我试图找到一种在使用泛型时迭代枚举值的方法 不确定如何执行此操作或是否可能 下面的代码说明了我想要做的事情 注意代码T values 在以下代码中无效 public class Filter
  • Javascript:用户完成滚动后执行操作

    我正在想办法做到这一点 我有一个盒子清单 每个盒子都是关于150px高的 我正在使用 javascript 和 jquery 并希望在用户向下滚动页面后 页面将自动滚动 以便框与页面的其余部分对齐 也就是说 如果用户滚动并且 y页面位置不能
  • Spacy - 标记带引号的字符串

    我正在使用 spacy 2 0 并使用带引号的字符串作为输入 示例字符串 The quoted text AA XX should be tokenized 并期望提取 The quoted text AA XX should be tok
  • Aws ecs fargate ResourceInitializationError:无法提取机密或注册表身份验证

    我正在尝试在 aws ecs fargate 1 4 0 平台上运行私有存储库 对于私有存储库身份验证 我遵循了docs https docs aws amazon com AmazonECS latest developerguide p
  • 创建删除线文本?

    我可以在 Android 中创建删除线文本吗 我的意思是在TextView标签可以使这成为可能
  • SQL-Server 中的错误计算

    作为一个例子 我发现了一个简单的计算 例如 select cast 200 00 as float 1908 30 170 00 1150 00 1128 30 作为正常添加 这会导致0 00但 SQL Server 显示结果为2 2737
  • fitz.open() 在 for 循环中不起作用(FITZ、PYTHON、PYMUPDF)

    当我尝试使用 PyMuPDF 中的 fitz 迭代目录 PDFS 中的文件时 我遇到了困难 问题是 当我只是执行 document somepdf pdf 时 代码可以工作 但是一旦我插入 for 循环并尝试访问文件 就会出现此错误 文件名
  • Android 记录来电和去电

    我想了解是否有一种方法可以在 Android 手机 2 2 及更高版本上记录来电和去电 客户希望记录他们给客户拨打的代理电话 以便以后可以用来填写一些材料 他们不想让客户在接听电话时等待 而是希望稍后再做 这可能吗 我需要使用哪些 API
  • 如何配置IntelliJ 11 +远程tomcat 6 + maven导入模块?

    这是我现在所拥有的 将多个maven模块导入到IntelliJ项目中 Maven 目标从 Maven 项目弹出窗口运行正常 创建一个 war 文件 从 Build Make Project 创建项目也可以 但这里没有创建战争 只是创建 cl
  • myBatis 中 ArrayList 的类型处理程序

    我正在尝试为 ArrayList 编写类型处理程序 但这给了我错误任何人都可以帮助我 我想将 ArrayList 作为 VARCHAR 存储在数据库中并将其作为 ArrayList 检索 package com someweb typeha