在项目中我们偶尔可能会遇到批量向数据库中导入数据,如果批处理的情况较多的情况下可以使用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批处理数据的添加的更多相关文章

  1. java中,字符串类型的时间数据怎样转换成date类型。

    将字符串类型的时间转换成date类型可以使用SimpleDateFormat来转换,具体方法如下:1.定义一个字符串类型的时间:2.创建一个SimpleDateFormat对象并设置格式:3.最后使用 ...

  2. 第67节:Java中的JDBC运用

    第67节:Java中的JDBC运用 https://www.jianshu.com/p/628a9ba1b205

  3. java中使用poi导出excel表格数据并且可以手动修改导出路径

    在我们开发项目中,很多时候会提出这样的需求:将前端的某某数据以excel表格导出,今天就给大家写一个简单的模板. 这里我们选择使用poi导出excel: 第一步:导入需要的jar包到 lib 文件夹下

  4. java中使用jdbc配置连接串时mysql 5.6与5.7版本“编码”参数有区别!

    在mysql5.6中 java程序使用jdbc时链接字符串应该使用?characterEncoding=utf-8,而5.7版本可以省略,否则可能会有相关的语句执行结果出错! String drive ...

  5. Java中的JDBC是什么?

    JDBC(Java Data Base Connectivity, Java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它有一组用Java语言编写的类和接 ...

  6. java中的JDBC

    Java 是通过 JDBC 技术实现对各种数据库访问的,换句话说,JDBC 充当了 Java 应用程 序与各种不同数据库之间进行对话的媒介. JDBC 是 Java 数据库连接(Java DataBa ...

  7. Java中float、double、long类型变量赋值添加f、d、L尾缀问题

    展开1. 添加尾缀说明 我们知道Java在变量赋值的时候,其中float.double.long数据类型变量,需要在赋值直接量后面分别添加f或F.d或D.l或L尾缀来说明.  其中,long类型最好以 ...

  8. Java学习笔记——JDBC之PreparedStatement类中“预编译”的综合应用

    预编译 SQL 语句被预编译并存储在 PreparedStatement 对象中.然后可以使用此对象多次高效地执行该语句. 预编译的优点 1.PreparedStatement是预编译的,对于批量处理 ...

  9. Java中通过JDBC远程连接Oracle数据库

    通过jdbc连接数据库,拢共分三步: 第一步:下载一个JDBC的驱动,然后把jar包扔到项目里并add to build path: 第二步:去本地oracle文件夹下找到“TNSNAMES.ORA” ...

随机推荐

  1. sublime的插件

    记录一下常用的插件: 1. htmlpretty 用于HTML.CSS.JS的格式化,以方便阅读代码.插件全名是HTML-CSS-JS Pretty.安装后使用方法是: 打开一个HTML/CSS/JS ...

  2. 2018秋季C语言学习总结

    2018秋季开始学习c语言 1.printf格式化输出函数 2.基本数据类型,int整型,float浮点型,double双精度浮点型,char字符型 3.算数运算符 +加法,-减法,*乘法,/除法,% ...

  3. python设计模式---创建型之单例模式

    数据结构和算法是基本功, 设计模式是最佳实现. 作为程序员,必须有空了就练一练哈. # coding = utf-8 """ # 经典单例 class Singleton ...

  4. node爬取html乱码

    var http = require('http'), iconv = require('iconv-lite'); http.get("http://website.com/", ...

  5. .net 本地日志的添加

    /// <summary> /// 写入日志到文本文件 /// </summary> /// <param name="userName">用户 ...

  6. (三)ajax请求不同源之cors跨域

    一.基本原理 CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)它允许浏览器向跨源服务器,发出 XMLHttpReque ...

  7. centos下安装python3.7.0以上版本时报错ModuleNotFoundError: No module named '_ctypes'

    centos下安装python3.7.0以上版本时报错ModuleNotFoundError: No module named '_ctypes'的解决办法 3.7版本需要一个新的包libffi-de ...

  8. 2019-2-25SqlServer 中所有表、列、视图、索引、主键、外键等常用sql

    sp_help Accounts_Users     其中Accounts_Users 表示表名 sp_columns Accounts_Users exec  sp_helpconstraint   ...

  9. [R]dplyr及ggplot2中的变量引用列的问题

    问题描述: 存在这么一个场景,当需要动态选择列作为dplyr或ggplot2的输入时,列名的指定会出现问题. 以iris举例: # 以iris dataset为例 colnames <- c(& ...

  10. Python基础——切片实例

    切片实例 L = list(range(100)) print(L, end=' ') [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 1 ...