摘要 写道
在上一篇《我和JAVA数据库操作的那些事儿(1)
》中,采用纯JDBC编程我经历过的一些问题,主要有:
- 连接重复创建
- 资源需要注意释放
- sql和代码在一起
- 重复性的创建Statement, ResultSet代码多
根据以前的做法,基本上都有一些解决方法
- 把连接放在一个对象里,并不每次都重复创建
- 用try{}finally{}调用写的工具类方法来关闭资源并释放
- 把sql移到配置文件中,并通过PreparedStatement来setString, setInt等方法来给sql传参
- 写一些函数来封装重复的代码
上次已经写过了部门表的增删除改查并进行了对上面几个问题的解决,如下:
package cn.lettoo.jdbc;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class DepartmentDB {
// 增
public void addDepartment(Connection conn, Department dept)
throws SQLException {
PreparedStatement stmt = null;
try {
// SqlParser读取sql.xml文件
String sql = SqlParser.getInstance().getSql("Department.insert");
stmt = conn.prepareStatement(sql);
stmt.setInt(1, dept.getId());
stmt.setString(2, dept.getName());
stmt.setString(3, dept.getDescription());
stmt.execute();
} finally {
DBUtil.close(stmt);
DBUtil.close(conn);
}
}
// 删
public void deleteDepartment(Connection conn, Department dept)
throws SQLException {
PreparedStatement stmt = null;
try {
String sql = SqlParser.getInstance().getSql("Department.delete");
stmt = conn.prepareStatement(sql);
stmt.setInt(1, dept.getId());
stmt.execute();
} finally {
DBUtil.close(stmt);
DBUtil.close(conn);
}
}
// 改
public void updateDepartment(Connection conn, Department dept)
throws SQLException {
PreparedStatement stmt = null;
try {
String sql = SqlParser.getInstance().getSql("Department.update");
stmt = conn.prepareStatement(sql);
stmt.setString(1, dept.getName());
stmt.setString(2, dept.getDescription());
stmt.setInt(3, dept.getId());
stmt.execute();
} finally {
DBUtil.close(stmt);
DBUtil.close(conn);
}
}
// 查
public List<Department> selectDepartment(Connection conn, int id)
throws SQLException {
PreparedStatement stmt = null;
ResultSet rs = null;
try {
String sql = SqlParser.getInstance().getSql("Department.select");
stmt = conn.prepareStatement(sql);
stmt.setInt(1, id);
rs = stmt.executeQuery();
List<Department> deptList = new ArrayList<Department>();
while (rs.next()) {
Department dept = new Department();
dept.setId(rs.getInt("ID"));
dept.setName(rs.getString("NAME"));
dept.setDescription(rs.getString("DESCRIPTION"));
deptList.add(dept);
}
return deptList;
} finally {
DBUtil.close(rs);
DBUtil.close(stmt);
DBUtil.close(conn);
}
}
}
sql语句放在sql.xml里,定义如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE sql_template>
<sqltemplate xmlns="cn.lettoo">
<sql name="Department.insert">
<content><![CDATA[
INSERT INTO DEPARTMENT(ID, NAME, DESCRIPTION) VALUES (?, ?, ?)
]]></content>
</sql>
<sql name="Department.delete">
<content><![CDATA[
DELETE FROM DEPARTMENT WHERE ID = ?
]]></content>
</sql>
<sql name="Department.update">
<content><![CDATA[
UPDATE DEPARTMENT SET NAME = ?, DESCRIPTION = ? WHERE ID = ?
]]></content>
</sql>
<sql name="Department.select">
<content><![CDATA[
SELECT ID, NAME, DESCRIPTION FROM DEPARTMENT WHERE ID = ?
]]></content>
</sql>
</sqltemplate>
时间一长,基本上就顺手了,也不觉得有什么。接下来,我们还需要实现
接下来,我们看看批处理。假如我有很多的Employee需要提交到数据库,如果一条条的提交,性能肯定是比较差的,这时就需要批处理。
package cn.lettoo.jdbc;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;
public class EmployeeDB {
public void addEmployees(Connection conn, List<Employee> empList, int batchSize)
throws SQLException {
long bt = System.currentTimeMillis();
PreparedStatement stmt = null;
try {
String sql = SqlParser.getInstance().getSql("Employee.insert");
stmt = conn.prepareStatement(sql);
int count = 0;
for (Employee emp : empList) {
stmt.setInt(1, emp.getId());
stmt.setString(2, emp.getName());
stmt.setInt(3, emp.getDepartment().getId());
stmt.setString(4, emp.getDescription());
stmt.addBatch();
count++;
if (count % batchSize == 0) {
stmt.executeBatch();
}
}
stmt.executeBatch();
} finally {
long et = System.currentTimeMillis();
System.out.println(String.format("用时%dms", et-bt));
DBUtil.close(stmt);
DBUtil.close(conn);
}
}
}
通过stmt.addBatch()和stmt.executeBatch()来往批处理增加和提交一批。我做个测试,针对1000个
Employee数据,分别使用5条,10条,50条,100条来批处理一次,查看时间如下:
运行时间
5条:用时22740ms
10条:用时16109ms
50条:用时9314ms
100条:用时8723ms
可以看到,不同的batchCount对于性能是不一样的。一般来说,批处理的性能和不同的数据库相关,和批处理的条数也相关,并不是batchSize
越大越好。batchSize的设置一般要靠经验和测试结果来决定。
分享到:
相关推荐
Java程序员在IT行业中占据着重要的地位,他们负责...总的来说,"java程序员的那些事儿"涉及了广泛的知识领域,从编程语言本身到与之相关的框架、工具和最佳实践。不断学习和适应新技术,是Java程序员保持竞争力的关键。
"Java编程那些事儿"无疑是对这个强大语言的深入探讨,旨在帮助开发人员提升技能,拓宽视野。这份资料可能是由一系列章节或主题组成的文档,比如基础语法、面向对象编程、异常处理、集合框架、多线程、IO流、网络编程...
在这个压缩包中,包含的文件名为“java那些事儿.chm”。 Java,作为世界上最流行的编程语言之一,拥有广泛的应用领域,从企业级应用到移动开发,无处不在。这个CHM文档很可能是对Java基础知识、进阶概念、实战技巧...
在这个压缩包中,我们有两份重要的文件:《Java编程那些事儿》的PDF文档以及两个与软件下载相关的文本和URL。 首先,让我们聚焦于核心的《Java编程那些事儿》PDF文档。这份资料可能包含了Java语言的基础概念,如...
本篇文章将深入探讨如何使用Java实现一个数据库连接池,并分析其中的关键技术和步骤。 首先,我们需要理解数据库连接池的基本工作原理。数据库连接池在初始化时会创建一定数量的数据库连接,这些连接在空闲时会被池...
- **具体的技能要求**:例如,某企业招聘Java软件工程师时,明确提出了具体的要求:2年以上的Java编程经验、熟悉MySQL数据库、了解Linux操作系统等。这些要求相对集中且具体,与求职者简历上的“高大全”形成鲜明...
本压缩包文件“关于Java和Python爬虫那些事儿.zip”可能包含与使用Java和Python这两种语言进行网络爬虫相关的教程、代码示例或资源。尽管描述中只提到了“python”,但标题暗示了内容可能涵盖两种语言。 首先,让...
- **掌握数据库操作**:需了解如何使用ADO对Access或SQL Server进行操作,并能编写SQL语句。 - **图形界面开发能力**:对于OpenGL或DirectX有一定的了解。 - **Java及Java平台知识**:熟悉J2EE和J2ME等技术框架。 - ...
- **操作系统管理**:具备Linux系统操作能力,同时对Solaris等其他操作系统有一定了解。 - **网络通信**:掌握网络基础知识,能够进行基本的网络调试与维护工作。 - **图形处理与多媒体**:了解OpenGL、DirectX等...
- **企业需求特点**:企业的招聘要求相对集中,如Java编程经验、MySQL数据库使用、Linux操作系统熟练等。这反映了企业在招聘时更加注重特定领域的深度而不是广度。 **求职者的自我认知与定位** - **明确职业定位**...
12. **数据库操作**:了解SQL语言,熟悉常用的数据库如MySQL、Oracle,以及JDBC(Java数据库连接)API,能够进行数据的增删改查操作。 13. **网络编程**:理解TCP/IP协议,能够使用Socket进行网络通信,为构建...
根据给定的信息,“Java程序员上班那点事儿”这一标题与描述指向了关于Java程序员日常工作的一些常见情况、挑战或趣事等内容。尽管提供的具体内容部分没有直接给出相关知识点,但结合标题和描述,我们可以围绕Java...
这是一个很好的起点,适合那些希望深入理解Java Swing库和数据库操作的初学者。 首先,让我们详细了解Java GUI。Java Swing库提供了大量的组件,用于构建用户界面,如按钮(JButton)、文本框(JTextField)、表格...