java中使用mysql批量插入大文本(二进制)数据时出错

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中使用mysql批量插入大文本(二进制)数据时出错相关的知识,希望对你有一定的参考价值。

mysql数据库 insert into tbb (name,bb) values (?,?)
name 类型varchar(100) bb 类型 longblob,批量插入上述语句时,总是报格式错误
check the manual that corresponds to your MySQL server version for the right syntax to use near '?)' at line 1
请教下 这个怎么处理?

参考技术A 初步预计你要插入的大数据类型里面有单引号之类的,将外面的语句中断了

大数据量数据,MySql批量插入时,如何不插入重复的数据?


前言

Mysql插入不重复的数据,当大数据量的数据需要插入值时,要判断插入是否重复,然后再插入,那么如何提高效率?解决的办法有很多种,不同的场景解决方案也不一样,数据量很小的情况下,怎么搞都行,但是数据量很大的时候,这就不是一个简单的问题了。


一、insert ignore into

会忽略数据库中已经存在 的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就跳过当前插入的这条数据。这样就可以保留数据库中已经存在数据,达到在间隙中插入数据的目的。

控制器方法:

/**
 * 插入员工数据
 */
@PostMapping("save")
@ResponseBody
public CommonResult<Employee> save(@RequestBody Employee employee){
    return employeeService.saveEmp(employee);
}
INSERT INTO 插入数据
<!--插入员工数据-->
<insert id="saveEmp" parameterType="com.dt.springbootdemo.entity.Employee">
    INSERT INTO t_employee(id, name, age, salary, department_id)
    VALUES (#{id},#{name},#{age},#{salary},#{departmentId})
</insert>

在这里插入图片描述
我们新增一条主键ID为1的员工记录。

当我再发送一次请求的时候,会报SQL语句执行错误,因为主键唯一,并且ID=1的记录已经存在了。
在这里插入图片描述
加上ignore,再次添加一条ID=1的员工记录

INSERT IGNORE INTO

在这里插入图片描述
并没有报错,但是也没有添加成功,忽略了重复数据的添加。

二、on duplicate key update

当主键或者唯一键重复时,则执行update语句。

 ON DUPLICATE KEY UPDATE id = id

我们任然插入ID=1的员工记录,并且修改一下其他字段(age=25):
在这里插入图片描述
查看数据库记录:
在这里插入图片描述

可以看到并没有改变,数据也只有一条,并且返回了成功的提示。

这种方法有个前提条件,就是,需要插入的约束,需要是主键或者唯一约束(在你的业务中那个要作为唯一的判断就将那个字段设置为唯一约束也就是unique key)。

扩展:这种方式还有其他业务场景的需求->>>定时更新其他字段。

我们在员工表中,再加入一个时间字段:

 private Date updateTime;

在这里插入图片描述

然后我们根据updateTime字段来插入数据:

<insert id="saveEmp" parameterType="com.dt.springbootdemo.entity.Employee">
    INSERT INTO t_employee(id, name, age, salary, department_id,update_time)
    VALUES (#{id},#{name},#{age},#{salary},#{departmentId},now())
    ON DUPLICATE KEY UPDATE update_time = now()
</insert>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果插入的时候需要更新其他字段(比如age),该怎么做呢?

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、replace into

如果存在primary or unique相同的记录,则先删除掉。再插入新记录。

REPLACE INTO
 <!--插入员工数据-->
<insert id="saveEmp" parameterType="com.dt.springbootdemo.entity.Employee">
    REPLACE INTO t_employee(id, name, age, salary, department_id,update_time)
    VALUES (#{id},#{name},#{age},#{salary},#{departmentId},now())
</insert>

在这里插入图片描述
在这里插入图片描述
总结:实际开发中,用得最多的就是第二种方式,进行的批量加。

<!--插入员工数据-->
<insert id="saveEmp" parameterType="java.util.List">
    INSERT INTO t_employee(id, name, age, salary, department_id,update_time)
    VALUES
    <foreach collection="list" item="item" index="index" separator=",">
        (#{item.id},#{item.name},#{item.age},#{item.salary},#{item.departmentId},now())
    </foreach>
    ON DUPLICATE KEY UPDATE id = id
</insert>

控制器:

@PostMapping("save")
@ResponseBody
public CommonResult<Employee> save(@RequestBody List<Employee> employeeList){
    return employeeService.saveEmp(employeeList);
}

在这里插入图片描述
如果存在相同的ID,则不会重复添加。

总结

实际工作中,使用最多的是方法二,根据不同的场景选择不同的方式使用。

技术群:176251012 喜欢是一种态度,坚持才是态度的体现。

以上是关于java中使用mysql批量插入大文本(二进制)数据时出错的主要内容,如果未能解决你的问题,请参考以下文章

增加批量插入方法

java 批量插入mysql 怎么去重

大数据量数据,MySql批量插入时,如何不插入重复的数据?

大数据量数据,MySql批量插入时,如何不插入重复的数据?

java对mysql进行批处理插入数据,如何返回错误的没插入数据

MySQL创建函数和存储过程,批量插入大数据