- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 Spring JDBC 插入从 Excel 文件(xlsx)读取的信息。首先,我将信息放入 Vector(大小 70 000!!),然后使用 studentJDBCTemplate.insertListStudents(students
方法将所有此 Student 对象插入到 Oracle 数据库中。 我的问题是,当我使用 Oracle SQL Developer 执行此 SQL 请求(StudentJDBCTemplate
类中的 )select count(*) from Student
)时,我只插入了 6041 行,并且当我测试时,Eclipse 控制台中也没有删除任何异常Vector 的大小,我得到了 70 000。 这是我的类(class):
类(class)学生:实体
package com.tutorialspoint;
public class Student {
private Integer age;
private String name;
private Integer id;
public void setAge(Integer age) {
this.age = age;
}
public Integer getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getId() {
return id;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("Student [age=");
builder.append(age);
builder.append(", name=");
builder.append(name);
builder.append("]");
return builder.toString();
}
}
接口(interface)StudentDAO:包含StudentJDBCTemplate将实现的所有方法
package com.tutorialspoint;
import java.util.List;
import javax.sql.DataSource;
public interface StudentDAO {
/**
* This is the method to be used to initialize
* database resources ie. connection.
*/
public void setDataSource(DataSource ds);
/**
* This is the method to be used to create
* a record in the Student table.
*/
public void create(String name, Integer age);
/**
* This is the method to be used to insert
* a list of record in the Student table.
*/
public void insertListStudents(List<Student> listStudent);
}
StudentJDBCTemplate 类:包含所有 CRUD 方法
package com.tutorialspoint;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;
import javax.sql.DataSource;
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.JdbcTemplate;
public class StudentJDBCTemplate implements StudentDAO {
private DataSource dataSource;
private JdbcTemplate jdbcTemplateObject;
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
this.jdbcTemplateObject = new JdbcTemplate(dataSource);
}
public void create(String name, Integer age) {
String SQL = "insert into Student (id,name, age) values (SEQ_STUDENT.nextval,?, ?)";
jdbcTemplateObject.update( SQL, name, age);
System.out.println("Created Record Name = " + name + " Age = " + age);
return;
}
@Override
public void insertListStudents(List<Student> listStudent) {
String sql = "insert into Student (id,name, age) values (SEQ_STUDENT.nextval,?, ?)";
jdbcTemplateObject.batchUpdate(sql, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
Student student = listStudent.get(i);
System.out.println("Student "+ i);
ps.setString(1, student.getName());
ps.setInt(2, student.getAge());
}
@Override
public int getBatchSize() {
return listStudent.size();
}
});
}
}
ExcelUtil 类:从 xls 和 xlsx 文件读取
package com.tutorialspoint;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Iterator;
import java.util.Vector;
import org.apache.poi.POIXMLDocument;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ExcelUtil {
public enum ExtentionFile{
XLS,XLSX,NONE
}
//private Student student = new Student();
public ExtentionFile checkExcelFile(String pathExcelFile) throws FileNotFoundException, IOException {
File file = new File(pathExcelFile);
if(file.isFile() && file.exists()){
if(POIXMLDocument.hasOOXMLHeader(new BufferedInputStream(new FileInputStream(pathExcelFile)))){
return ExtentionFile.XLSX;
}
if(POIFSFileSystem.hasPOIFSHeader(new BufferedInputStream(new FileInputStream(pathExcelFile)))){
return ExtentionFile.XLS;
}
}
return ExtentionFile.NONE;
}
public Vector<Student> readXlsxFile(String pathXlsxFile) throws IOException {
Vector<Student>students = new Vector<Student>();
Student student = new Student();
XSSFWorkbook workbook = new XSSFWorkbook(pathXlsxFile);
XSSFSheet sheet = workbook.getSheetAt(0);
XSSFRow row;
Iterator<Row> rowIterator = sheet.iterator();
while(rowIterator.hasNext()){
row = (XSSFRow) rowIterator.next();
Iterator<Cell>cellIterator = row.cellIterator();
student = new Student();
while(cellIterator.hasNext()){
Cell cell = cellIterator.next();
if(null !=cell && (cell.getCellType() == Cell.CELL_TYPE_STRING || cell.getCellType() == Cell.CELL_TYPE_NUMERIC)){
if(!TestISNumber.isNumber(cell.toString())){
student.setName(cell.toString());
}
else if(TestISNumber.isNumber(cell.toString())){
student.setAge((int)Double.parseDouble(cell.toString()));
}
}
}
//System.out.println(student);
students.add(student);
}
workbook.close();
return students;
}
public Vector<Student> readXlsFile(String pathXlsFile) throws IOException,InvalidFormatException {
Vector<Student> students = new Vector<Student>();
Student student = new Student();
FileInputStream inputStream = new FileInputStream(pathXlsFile);
HSSFWorkbook workbook = new HSSFWorkbook(inputStream);
HSSFSheet sheet = workbook.getSheetAt(0);
HSSFRow row;
Iterator<Row> rowIterator = sheet.iterator();
while(rowIterator.hasNext()){
row = (HSSFRow) rowIterator.next();
Iterator<Cell>cellIterator = row.cellIterator();
student = new Student();
while(cellIterator.hasNext()){
Cell cell = cellIterator.next();
if(null !=cell && (cell.getCellType() == Cell.CELL_TYPE_STRING || cell.getCellType() == Cell.CELL_TYPE_NUMERIC)){
if(!TestISNumber.isNumber(cell.toString())){
student.setName(cell.toString());
}
else if(TestISNumber.isNumber(cell.toString())){
student.setAge((int)Double.parseDouble(cell.toString()));
}
}
}
//System.out.println(student);
students.add(student);
}
workbook.close();
inputStream.close();
return students;
}
public Vector<Student> readFile(String pathFile) throws FileNotFoundException, IOException, InvalidFormatException{
Vector<Student>students = new Vector<Student>();
if(checkExcelFile(pathFile) == ExtentionFile.XLS){
students = readXlsFile(pathFile);
}
if(checkExcelFile(pathFile) == ExtentionFile.XLSX){
students = readXlsxFile(pathFile);
}
return students;
}
public static void main(String[] args) {
ExcelUtil excelUtil = new ExcelUtil();
Vector<Student> students = new Vector<Student>();
try {
students = excelUtil.readFile("students.xlsx");
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Size of Students Vector: "+students.size());
//System.out.println(Arrays.toString(students.toArray()));
//System.out.println(Arrays.toString(new TreeSet<String>(students).toArray()));
}
}
类 TestISNumber :测试从 xlsx 文件中读取的学生年龄是否可以解析为 double
package com.tutorialspoint;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class TestISNumber {
//Test if Cell contain a String that can be parsed to double
public static boolean isNumber (String s){
Pattern pattern = Pattern.compile("(.*^\\d.*)(\\d$)");
Matcher matcher = pattern.matcher(s);
if (matcher.matches()){
return true;
}
return false;
}
public static void main(String[] args) {
System.out.println(isNumber("100"));
}
}
类MainApp:主类
package com.tutorialspoint;
import java.io.IOException;
import java.util.Vector;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("Beans.xml");
StudentJDBCTemplate studentJDBCTemplate =
(StudentJDBCTemplate)context.getBean("studentJDBCTemplate");
ExcelUtil excelUtil = (ExcelUtil) context.getBean("excelUtilStudent");
try {
Vector<Student> students = excelUtil.readXlsxFile("students.xlsx");
/*for(Student student:students){
studentJDBCTemplate.create(student.getName(), student.getAge());
}*/
studentJDBCTemplate.insertListStudents(students);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
SQL 脚本:
--------------------------------------------------------
-- Fichier créé - jeudi-février-26-2015
--------------------------------------------------------
--------------------------------------------------------
-- DDL for Sequence SEQ_STUDENT
--------------------------------------------------------
CREATE SEQUENCE "SPRINGJDBC"."SEQ_STUDENT" MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 12181 CACHE 20 NOORDER NOCYCLE ;
--------------------------------------------------------
-- DDL for Table STUDENT
--------------------------------------------------------
CREATE TABLE "SPRINGJDBC"."STUDENT"
( "ID" NUMBER(*,0),
"NAME" VARCHAR2(20 BYTE),
"AGE" NUMBER(*,0)
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "USERS" ;
--------------------------------------------------------
-- DDL for Index SYS_C004040
--------------------------------------------------------
CREATE UNIQUE INDEX "SPRINGJDBC"."SYS_C004040" ON "SPRINGJDBC"."STUDENT" ("ID");
--------------------------------------------------------
-- Constraints for Table STUDENT
--------------------------------------------------------
ALTER TABLE "SPRINGJDBC"."STUDENT" MODIFY ("ID" NOT NULL ENABLE);
ALTER TABLE "SPRINGJDBC"."STUDENT" MODIFY ("NAME" NOT NULL ENABLE);
ALTER TABLE "SPRINGJDBC"."STUDENT" MODIFY ("AGE" NOT NULL ENABLE);
ALTER TABLE "SPRINGJDBC"."STUDENT" ADD PRIMARY KEY ("ID");
XML Bean 配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd ">
<!-- Initialization for data source -->
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" />
<property name="username" value="SPRINGJDBC" />
<property name="password" value="springjdbc" />
</bean>
<!-- Definition for studentJDBCTemplate bean -->
<bean id="studentJDBCTemplate" class="com.tutorialspoint.StudentJDBCTemplate">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- Definition for ExcelUtil bean -->
<bean id="excelUtilStudent" class="com.tutorialspoint.ExcelUtil" />
</beans>
PS: 我使用Spring-3.2.9.Release,Spring-JDBC-3.2.9.Release,ojdbc14,POI-3.11,oracle数据库10g express,Luna Eclipse和JavaSE 1.8(Oracle JDK)
最佳答案
我怀疑 ExcelUtil
中存在此代码
while(cellIterator.hasNext()){
Cell cell = cellIterator.next();
if(null !=cell && (cell.getCellType() == Cell.CELL_TYPE_STRING || cell.getCellType() == Cell.CELL_TYPE_NUMERIC)){
if(!TestISNumber.isNumber(cell.toString())){
student.setName(cell.toString());
}
else if(TestISNumber.isNumber(cell.toString())){
student.setAge((int)Double.parseDouble(cell.toString()));
}
}
}
//System.out.println(student);
students.add(student);
如果该迭代器到达包含空单元格的行,或者包含两个包含字符串的单元格的行,该怎么办? Student
上的一个或两个属性可能保持为 null,但您无论如何都将其添加到 Vector
中。因此,它的大小将是您所期望的 (70,000),但这并不意味着 Oracle DB 会喜欢所有这些。也许第 6,042 行有问题。在调试器中,您可以添加一个断点,以便在添加 Student
具有空字段时停止。
关于java - 使用 Spring JdbcTemplate 插入数千行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28754176/
应用程序上下文中的一些bean的依赖关系形成一个循环:当我使用时@Autowired私有(private) JdbcTemplate jdbcTemplate;不同类(class) 错误提示: ***
我做一个查询: jdbcTemplate.query(sqlQueryForGetNodes, new Object[]{treeId, versionId}, rs -> { NodeTy
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 3 年前。 Improve this ques
根据 Spring documentation ,Spring JdbcTemplate的使用步骤如下:
我做了这个简单的应用程序来连接到 MySQL 数据库,我收到了这个错误: org.springframework.jdbc.core.JdbcTemplate 在我的配置中 (com.kubamadr
我遵循了SpringBoot框架中的示例,该框架从这里开始,当我尝试添加Spring Bean时得到下一个错误。Pom.xml。我尝试插入到BD中,BD没有改变,应用程序本身可以工作,但没有连接数据库
我遵循了SpringBoot框架中的示例,该框架从这里开始,当我尝试添加Spring Bean时得到下一个错误。Pom.xml。我尝试插入到BD中,BD没有改变,应用程序本身可以工作,但没有连接数据库
我正在学习 Spring Boot 和 jdbcTemplate 的组合以进行一些基本的 crud 操作,并试图更好地理解我应该选择哪种更新方法。 我理解以下两种类方法(改编自 this post)将
如何使用行映射器向表中插入数据? 我正在尝试: Employee user1 = jtemplate.queryForObject("INSERT INTO employee(id, name,sal
我最近切换到 Spring Framework 而不是手动处理 JDBC,这主要是一个很好的过渡。但是,一个程序开始出现奇怪的问题:如果数据库速度很慢,则在调用 getJdbcTemplate().u
命令(Command)模式是指将请求封装成为一个对象,使发出请求和执行请求的责任分割开,方便将命令对象进行存储、传递、调用、增加与管理。 也就是将发送者、接收者和调用命令封装成独立的对象,来供客户端调
我有一个 spring 应用程序,它的主页会触发多个 ajax 调用,这些调用又从数据库中获取数据并返回。数据库已配置连接池,minPoolSize 为 50,maxPoolSize 为 100。 现
有人可以指出我以下 Spring Jdbc 模板代码中的任何错误吗? 当我点击删除时,记录没有被删除,也没有显示错误。 public void delete(String id) { logg
我正在使用 spring JDBCTemplate。 我有一个场景,其中需要传递到查询函数中的参数是条件/可选的。例如,我有以下代码: List result = jdbcTemplate.query
在项目中我在Hibernate和Spring jdbctemplate中是混合使用的。我添加了乐观锁定。 Hibernate 非常适合版本控制,但现在我必须转换所有这些 jdbctemplate 代码
我已经为我的INSERT查询建立了一个DAO。码: DAO public class EmployeeDao { JdbcTemplate template; public void
我有一个sql查询。 String sql = "SELECT ? FROM Users WHERE Lastname=?"; 我使用 JDBCTemplate 中的 queryForList 方法
我正在尝试将嵌套查询与 JdbcTemplate 一起使用,但发现了问题,在我看来,它不支持嵌套查询..我是对的吗?或者我需要改变什么? 所以,我调用 getJdbcTemplate().query
这个问题是几年前提出的,但答案对我来说不起作用。我已将建议的注释添加到配置和 dao 中。我确信模板实际上正在连接到数据库,因为当我的列太小时,我收到了适当的错误。更新调用正在执行单行插入,并且毫无异
JdbcTemplate 对象和 SimpleJdbcTemplate 之间有什么区别? 最佳答案 截至Spring 3.1 SimpleJdbcTemplate已弃用,SimpleJdbcTempl
我是一名优秀的程序员,十分优秀!