OrmLite中如何映射Blob数据类型?关联查询结果映射求助
嘿,我来帮你搞定这两个OrmLite的问题!
OrmLite中Blob数据类型的映射方法
OrmLite对Blob类型的映射其实挺直观的,主要分两种场景,看你的二进制数据大小来选:
小体积二进制数据(比如图标、小文件):直接用
byte[]类型定义实体字段,配合@DatabaseField注解指定dataType为DataType.BYTE_ARRAY。OrmLite会自动把这个字段映射到数据库的Blob类型,读写时自动转换:public class Equipo { // 其他字段... @DatabaseField(dataType = DataType.BYTE_ARRAY) private byte[] blobField; // 对应数据库的Blob字段 // getter和setter... }大体积二进制数据(比如大文件):如果数据量很大,用
byte[]容易占满内存,可以用InputStream类型,注解指定dataType为DataType.BLOB,这样可以流式处理数据,避免内存过载:public class Equipo { // 其他字段... @DatabaseField(dataType = DataType.BLOB) private InputStream blobStream; // getter和setter... }
关联查询的结果映射修正
你现在的代码有两个明显的问题:一是mapRow里的return语句语法完全错误,二是直接拼接idUsuario会有SQL注入风险,另外Blob字段的转换也需要处理。我给你修正后的版本:
GenericRawResults<Equipo> rawResults = dao.queryRaw( // 用占位符?代替直接拼接参数,避免SQL注入 "SELECT e.* from equipo e " + "INNER JOIN equipousuario eu " + "ON eu.id_equipo = e.id " + "WHERE eu.id_usuario = ? ", new RawRowMapper<Equipo>() { @Override public Equipo mapRow(String[] columnNames, String[] resultColumns) { // 创建Equipo实例,逐个赋值字段 Equipo equipo = new Equipo(); // 这里的索引要和你SELECT语句返回的列顺序完全对应 // 假设equipo表的列顺序是:id, col1, col2, blob_field, col4, col5... equipo.setId(Integer.parseInt(resultColumns[0])); equipo.setCol1(resultColumns[1]); equipo.setCol2(resultColumns[2]); // 处理Blob字段:queryRaw返回的Blob是Base64编码的字符串,需要解码成byte[] if (resultColumns[3] != null) { byte[] blobData = Base64.getDecoder().decode(resultColumns[3]); equipo.setBlobField(blobData); } // 其他字段继续赋值,比如你原来代码里的resultColumns[4]、[5] equipo.setCol4(Integer.parseInt(resultColumns[4])); equipo.setCol5(resultColumns[5]); return equipo; } }, idUsuario // 把参数传递给占位符,安全又规范 );
几个关键提醒:
- 一定要用占位符
?传递参数,别直接拼接字符串,不然很容易被SQL注入攻击; resultColumns的索引必须和SELECT语句返回的列顺序完全匹配,你要根据自己的表结构调整索引位置;- Blob字段在
queryRaw的结果中是Base64编码的字符串,所以需要用Base64工具类解码成byte[](Java 8+自带java.util.Base64)。
内容的提问来源于stack exchange,提问作者mrv
相关产品推荐
相关产品推荐

