java中使用JDBC的preparedStatement批处理数据的添加
在项目中我们偶尔可能会遇到批量向数据库中导入数据,如果批处理的情况较多的情况下可以使用spring batch,如果只是一个导入功能的话可以考虑使用jdbc的preparedStatement处理。
1.使用逻辑,首先根据导入的文件,将数据转换成我们的对象放进list集合中。
2.创建preparedStatement对象,处理数据。
下面是具体的示例:
1.创建表:
CREATE TABLE TEST
(
ID VARCHAR2(50) NOT NULL,
NAME VARCHAR2(50) NOT NULL,
HOME VARCHAR2(50) NOT NULL,
TEL VARCHAR2(50) NOT NULL,
PATH VARCHAR2(50)
)
2.实体类:
@Getter
@Setter
@ToString
public class TestModel { private String id;
private String name;
private String home;
private String tel;
private String path; }
3.Dao层:
@Mapper
public interface TestDao { public List<TestModel> selectList(); public void addData(List<TestModel> list);
}
4.mapper.xml:
<mapper namespace="com.jason.springboot.demo.web.dao.TestDao"> <select id="selectList" resultType="com.jason.springboot.demo.web.pojo.TestModel">
select
id id,
name name,
home home,
tel tel,
path path
from
test
</select> <insert id="addData" parameterType="com.jason.springboot.demo.web.pojo.TestModel">
INSERT INTO
TEST
VALUES(#{id},#{name},#{home},#{tel},#{path})
</insert> </mapper>
5.批处理类:
/**
* 使用JDBC preparedStatement批处理数据
*
*/
@Service
public class SqlBatch {
@Autowired
private SqlSessionFactory sqlSessionFactory; public static final String MAPPER_01 = "com.jason.springboot.demo.web.dao.TestDao.addData";
public static final String SQL_ADD = "INSERT INTO TEST VALUES(?,?,?,?,?)"; public void batchSelect(List<TestModel> list) {
String sql = "";
SqlSession session = null;
PreparedStatement prepareStatement = null;
try {
if (list == null || list.isEmpty()) {
return;
}
Map<String, Object> map = new HashMap<String, Object>();
map.put("id", list.get(0).getId());
map.put("name", list.get(0).getName());
map.put("home", list.get(0).getHome());
map.put("tel", list.get(0).getTel());
map.put("path", list.get(0).getPath()); sql = getSql(MAPPER_01, map);
// 或者
// sql=SQL_ADD ;
session = sqlSessionFactory.openSession(ExecutorType.BATCH, true);
prepareStatement = session.getConnection().prepareStatement(sql); for (TestModel model : list) {
prepareStatement.setString(1, model.getId());
prepareStatement.setString(2, model.getName());
prepareStatement.setString(3, model.getHome());
prepareStatement.setString(4, model.getTel());
prepareStatement.setString(5, model.getPath()); prepareStatement.addBatch();
} int[] executeBatch = prepareStatement.executeBatch();
System.out.println(executeBatch); } catch (SQLException e) {
System.out.println("批量处理SQL异常:" + e);
} catch (Exception e) {
System.out.println("批处理添加数据异常:" + e);
} finally {
try {
prepareStatement.close();
} catch (SQLException e) {
System.out.println("关闭批处理异常:" + e);
}
} } // 根据参数从MyBatis中获取对应的sql
private String getSql(String mapper, Map<String, Object> param) {
return sqlSessionFactory.getConfiguration().getMappedStatement(mapper).getBoundSql(param).getSql();
} }
6.Controller类,测试添加数据:
@RestController
public class DemoController {
@Autowired
private TestService testService;
@Autowired
private SqlBatch sqlBatch;
private static final Logger LOGGER = LoggerFactory.getLogger(DemoController.class); @RequestMapping("/test")
public String test1() {
addData();
List<TestModel> selectList = testService.selectList();
List<TestModel> newList = new ArrayList<>();
newList.addAll(selectList.subList(0, 20));
for (TestModel testModel : newList) {
LOGGER.info("数据:{}", testModel.toString());
}
newList.clear();return " spring boot is starting ....";
} private void addData() {
long start = System.currentTimeMillis();
// 造数据
List<TestModel> list = new ArrayList<TestModel>();
for (int i = 0; i < 50000; i++) {
TestModel model = new TestModel();
model.setId(UUID.randomUUID().toString().replace("-", ""));
model.setName("姓名" + i);
model.setHome("家庭地址" + i);
model.setTel("联系电话" + i);
model.setPath("URL:" + i);
list.add(model);
}
// 批量添加
sqlBatch.batchSelect(list); long end = System.currentTimeMillis(); LOGGER.info("总共耗时:[{}]", (end - start));
}
}
java中使用JDBC的preparedStatement批处理数据的添加的更多相关文章
- java中,字符串类型的时间数据怎样转换成date类型。
将字符串类型的时间转换成date类型可以使用SimpleDateFormat来转换,具体方法如下:1.定义一个字符串类型的时间:2.创建一个SimpleDateFormat对象并设置格式:3.最后使用 ...
- 第67节:Java中的JDBC运用
第67节:Java中的JDBC运用 https://www.jianshu.com/p/628a9ba1b205
- java中使用poi导出excel表格数据并且可以手动修改导出路径
在我们开发项目中,很多时候会提出这样的需求:将前端的某某数据以excel表格导出,今天就给大家写一个简单的模板. 这里我们选择使用poi导出excel: 第一步:导入需要的jar包到 lib 文件夹下
- java中使用jdbc配置连接串时mysql 5.6与5.7版本“编码”参数有区别!
在mysql5.6中 java程序使用jdbc时链接字符串应该使用?characterEncoding=utf-8,而5.7版本可以省略,否则可能会有相关的语句执行结果出错! String drive ...
- Java中的JDBC是什么?
JDBC(Java Data Base Connectivity, Java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它有一组用Java语言编写的类和接 ...
- java中的JDBC
Java 是通过 JDBC 技术实现对各种数据库访问的,换句话说,JDBC 充当了 Java 应用程 序与各种不同数据库之间进行对话的媒介. JDBC 是 Java 数据库连接(Java DataBa ...
- Java中float、double、long类型变量赋值添加f、d、L尾缀问题
展开1. 添加尾缀说明 我们知道Java在变量赋值的时候,其中float.double.long数据类型变量,需要在赋值直接量后面分别添加f或F.d或D.l或L尾缀来说明. 其中,long类型最好以 ...
- Java学习笔记——JDBC之PreparedStatement类中“预编译”的综合应用
预编译 SQL 语句被预编译并存储在 PreparedStatement 对象中.然后可以使用此对象多次高效地执行该语句. 预编译的优点 1.PreparedStatement是预编译的,对于批量处理 ...
- Java中通过JDBC远程连接Oracle数据库
通过jdbc连接数据库,拢共分三步: 第一步:下载一个JDBC的驱动,然后把jar包扔到项目里并add to build path: 第二步:去本地oracle文件夹下找到“TNSNAMES.ORA” ...
随机推荐
- 03-django模型(1)
一.内容回顾 1.路由层 a.简单使用 b.有名分组 c.路由分发 d.反向解析 2.视图层 a.HttpRequest对象 常用的属性 常用方法 b.HttpResponse对象 响应三剑客 3.模 ...
- C++ const用法
C++ const 允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不变的.如果在编程中确实有某个值保持不变,就应该明确使用const,这样可以获得编译器的帮助. 1.c ...
- 论文阅读笔记四十三:DeeperLab: Single-Shot Image Parser(CVPR2019)
论文原址:https://arxiv.org/abs/1902.05093 github:https://github.com/lingtengqiu/Deeperlab-pytorch 摘要 本文提 ...
- ssh项目问题01,为创建数据库抛出的异常
框架什么都搭建好了,但是一直抛出如图问题,网上资料很多让你设置时间之类的,也设置了还是继续抛异常,最后带我的师傅说没有创建数据库,我都要郁闷死了,网上那么多,很多写的都不能解决问题,还乱写,浪费别人时 ...
- (五)Knockout template模版渲染
基础 template绑定通过模板将数据render到页面.模板绑定对于构建嵌套结构的页面非常方便.默认情况, Knockout用的是流行的jquery.tmpl模板引擎.使用它的话,需要在安装页面下 ...
- [转]Windows下Python多版本共存
https://blog.csdn.net/dream_an/article/details/51248736 Windows下Python多版本共存 Python数据科学安装Numby,pandas ...
- 用webpack4从零开始构建react脚手架
用webpack4从零开始构建react脚手架 使用脚手架 git clone git@github.com:xiehaitao0229/react-wepack4-xht.git` `cd reac ...
- Codeforces 700E. Cool Slogans 字符串,SAM,线段树合并,动态规划
原文链接https://www.cnblogs.com/zhouzhendong/p/CF700E.html 题解 首先建个SAM. 一个结论:对于parent树上任意一个点x,以及它所代表的子树内任 ...
- JS简单实现分页显示
完整代码源码可以在这里下载 1.在 HTML文件建立列表目标节点和翻页器目标节点 <body> <!--页面控制器 --> <div id="nav" ...
- VS2008,System.Runtime.InteropServices.COMException (0x800401F3): Invalid class string (Exception from HRESULT: 0x800401F3 (CO_E_CLASSSTRING))
在VS2008环境中编译调试运行不报错,但在发布的exe文件运行就报错 System.Runtime.InteropServices.COMException (0x800401F3): Invali ...