mybatis中,当需要将复杂类型,如数组、List等数据保存至数据库时,是无法直接存取的。必须定义自己的类型转换器。即继承BaseTypeHandler类。
在下面的实例中,实现了java中的Integer数组和数据库中BLOB类型字段互相转换的功能。
首先看使用方法:
insert into user (name, families) values (#{user}, #{familied, jdbcType=BLOB, typeHandler=com.exmple.handler.IntegerArrayHandler})
Handler类的定义
package com.example;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import javax.sql.rowset.serial.SerialBlob;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
* Integer数组TypeHandler
* 在数据库和java之间将Integer[]与BLOB类型字段互相转换
* @author amdin
* @since WebComment1.0
public class IntegerArrayTypeHandler extends BaseTypeHandler<Integer[]> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Integer[] parameter, JdbcType jdbcType) throws SQLException {
String str = "";
for (Integer s : parameter){
str = str + "***" + s;
Blob blob = new SerialBlob(str.getBytes());
ps.setBlob(i, blob);
@Override
public Integer[] getNullableResult(ResultSet rs, String columnName) throws SQLException {
Blob blob = rs.getBlob(columnName);
String str = new String(blob.getBytes(1, (int)blob.length()));
String[] strArray = str.split("\\*\\*\\*");
List<Integer> list = new ArrayList<>();
for (String s : strArray){
if (!s.equals("") && !s.equals(null)) {
list.add(Integer.parseInt(s));
Integer[] resultArray = new Integer[list.size()];
return list.toArray(resultArray);
@Override
public Integer[] getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return new Integer[0];
@Override
public Integer[] getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return new Integer[0];
总结:从上面的代码看,使用了***
作为分隔符,以此来区分数组的不同项。这当然不是一种好方法,不过确实能解决问题。
更好的方法当然也有,下一节将会介绍任意类型数组与BLOB类型数据的互相映射。
mybatis中,当需要将复杂类型,如数组、List等数据保存至数据库时,是无法直接存取的。必须定义自己的类型转换器。即继承BaseTypeHandler类。在下面的实例中,实现了java中的Integer数组和数据库中BLOB类型字段互相转换的功能。首先看使用方法:insert into user (name, families) values (#{user}, #{fami...
<resultMap type="返回实体类" id="result" >
<result property="实体类字段名" column="mysql字段名" typeHandler="处理数据的文件"/>
</resultMap>
<select id="Mapper.java的方法名" parameterType="传参类型" r
testpublic void test() {}欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦:
Markdown和扩展Markdown简洁的语法
代码块高亮
图片链接和图片上传
LaTex数学公式
UML序列图和流程图
离线写博客
导入导出Markdown文件
丰富的快捷键
加粗 Ctrl + B
java.lang.IllegalArgumentException: argument type mismatch
产生问题的问题:
在使用byte[]形式将数据库中的图片(blob)取出时,mybatis无法正常转化类型
解决方式:
在mapper文件中,将返回类型(resultType)设定为“java.util.Map”,并且在sql语句中,将查找到的列进行重命名,重命名后的列名对应map中的key
在dao类中声明返回值为Map的函数用于接收Map。
在service中通过
byte[
1.实体类对象里面用于存储文件的字段类型必须为Object,因为存入表的时候
数据类型时
blob类型,读取出来的
数据类型时
byte[]
数组
2.表里面
数据类型设置为
Blob 或者long
blob
3.设置上传文件大小必须小于4M(
byte.length < 4* 1024*1024...
MultipartFile 通过 MultipartFile .transferTo( new File()), 仅需要这步骤,就可以把图片存到服务器所在的电脑的任意一个盘或者路径里面。
这里需要注意的一点:
new File("d:/stair/second...
环境:maven+SpringMVC + Spring + MyBatis + MySql
本文主要说明如何使用input上传文件到服务器指定目录,或保存到数据库中;如何从数据库下载文件,和显示图像文件并实现缩放。
将文件存储在数据库中,一般是存文件的byte数组,对应的数据库数据类型为blob。
首先要创建数据库,此处使用MyS
MyBatis是一个开源的持久层框架,它可以与关系数据库进行交互。在MyBatis中,可以使用BLOB(Binary Large Object)来存储和获取大量的二进制数据。
当我们需要将二进制数据存储到数据库中时,可以使用MyBatis的BLOB类型来声明相应的属性。在数据库表中,我们可以使用BLOB、BINARY或VARBINARY类型来存储二进制数据。在MyBatis的映射文件中,我们可以使用BLOB类型来和数据库对应的字段进行映射。
在存储二进制数据之前,我们需要将其转换成字节数组。可以使用InputStream或File对象来获取二进制数据,然后将其转换成字节数组,再使用MyBatis的BLOB对象进行存储。
在映射文件的insert语句中,我们可以使用#{blobProperty,jdbcType=BLOB}来指定BLOB类型的属性,并通过#{blobProperty}来引用该属性。当执行插入操作时,MyBatis会将字节数组转换为二进制数据,并存储到数据库中的BLOB字段中。
在查询二进制数据时,可以使用select语句查询到对应的BLOB字段。在映射文件中,我们可以使用#{blobProperty,jdbcType=BLOB}来接收查询结果,并通过#{blobProperty}来引用该属性。当执行查询操作时,MyBatis会将数据库中的BLOB字段转换为字节数组,并赋值给相应的属性。
总而言之,使用MyBatis存取BLOB数据需要将其转换成字节数组进行存储,然后在查询时将字节数组转换为对应的二进制数据。使用BLOB类型来声明属性,可以方便地进行数据库交互,实现对二进制数据的存储和获取。