数据库的批处理和MySql元数据
Posted 四条鱼的屋子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库的批处理和MySql元数据相关的知识,希望对你有一定的参考价值。
什么是批处理
批处理操作数据库
批处理指的是一次操作中执行多条SQL语句,批处理相比于一次一次执行效率会提高很多。
当想数据库中添加大量数据时,需要用到批处理。
实现批处理
Statement和preparedStatement都支持批处理操作,这里我们介绍一下PreparedStatement的批处理方式:
1)要用到的方法
方法 |
说明 |
void addBatch() |
将给定的SQL命令添加到此Statement对象的当前命令列表中。 通过调用方法executeBatch 可以批量执行此列表中的命令。 |
int[] executeBatch | 每次提交一批命令到数据库中执行,如果所有的命令都成功执行了,那么返回一个数组,这个数组是说明每条命令所影响的行数 |
2)mysql批处理是默认关闭的,所以需要加一个参数才打开mysql数据库批处理,在url中添加
rewriteBatchedBatchedStatements = true
例如:url=jdbc:mysql://127.0.0.1:3306/db5?characterEncoding=UTF-8&rewriteBatchedStatements=true
3)创建一张表
create table testBatch(
id int primary key auto_Increment,
uname varchar(50)
)
4)测试向表中插入1万条数据
核心代码
Connection con = DruidUtils.getConnection();
String sql = "insert into testBatch(uname)values(?)";
PreparedStatement ps = con.preparedStatement(sql);
for(int i = 0; i < 10000; i++){
ps.setString(1,"小强"+i);
ps.addBatch();
}
ps.executeBatch();
MySql元数据
什么是元数据
除了表之外的数据都是元数据,可以分为三类
查询结果信息:update或delete语句 受影响的记录数。
数据库和数据表的信息:包含了数据及数据表的结构信息。
MySql服务器信息:包含了数据库的当前状态,版本号等。
常用命令
select version();获取mysql服务器的版本信息
show status 查询服务器的状态信息
show columns from table_name; 显示表的字段信息等;和desc table_name 一样
show index from table_name; 显示数据表的详细索引信息,包括primary key(主键)
show databases; 列出所有的数据库
show tables; 显示当前数据库的所有表
select database();获取当前的数据库名
使用JDBC获取元数据
通过JDBC也可以获取到元数据,比如数据库的相关信息,或者我们使用程序查询一个不熟悉对的表时,我们可以通过获取元素信息,了解表中有多少个字段 字段的名称和字段的类型
常见类介绍
JDBC中描述元数据的类
元数据类 |
作用 |
DatabaseMetaData | 描述数据库的元数据对象 |
ResultSetData | 描述结果集的元数据对象 |
获取元数据对象的方法:getMetaData()
connection连接对象,调用getMetaData()方法,获取的是DatabaseMetaData数据库元数据对象
PreparedStatement预处理对象调用getMetaData(),获取的是ResultMetaData,结果集元数据对象
DatabaseData的常见方法
方法说明 |
getURL();获取数据库的URL |
getUserName();获取当前数据库的用户名 |
getDatabaseProductName();获取数据库的产品名称 |
getDatabaseProductVersion(); 获取数据的版本号 |
getDriverName();返回驱动程序的名称 |
isReadOnly(); 判断数据库是否值允许只读true代表只读 |
ResultSetMetaData的常见方法
方法说明 |
getColumnCount(); 当前结果集共有多少列 |
getColumnName(int i);当前指定列号的列名,参数是整数 从1开始 |
getColumnTypeName(int i);获取指定列名的类型,参数是整数 从1开始 |
代码实例
package jdbc_task02.testmetadata;
import jdbc_task02.com.wwjie.Utils.DruidUtils;
import org.junit.Test;
import java.sql.*;
public class TestMetaData {
//1.get sql mataData use DatabaseMetaData
@Test
public void testDataMetaData()throws SQLException {
Connection connection = DruidUtils.getConnection();
DatabaseMetaData databaseMetaData = connection.getMetaData();
String url = databaseMetaData.getURL();
System.out.println(url);
String userName = databaseMetaData.getUserName();
System.out.println(userName);
String productName = databaseMetaData.getDatabaseProductName();
System.out.println(productName);
System.out.println(databaseMetaData.getDatabaseMinorVersion());
//read only?
boolean b = databaseMetaData.isReadOnly();
if (b){
System.out.println("only read");
}else{
System.out.println(" not only read");
}
connection.close();
}
//get result data
@Test
public void testResultSetMetaData()throws SQLException{
Connection connection = DruidUtils.getConnection();
PreparedStatement ps = connection.prepareStatement("select * from employee");
ResultSet resultSet = ps.executeQuery();
ResultSetMetaData resultSetMetaData = ps.getMetaData();
//获取当前结果集中 共有多少列
int count = resultSetMetaData.getColumnCount();
System.out.println(count);
for (int i = 1;i<=count;i++){
//获取当前结果集中 列的名称和类型
String columnName = resultSetMetaData.getColumnName(i);
System.out.println(columnName);
String columnTypeName= resultSetMetaData.getColumnTypeName(i);
System.out.println(columnName);
}
DruidUtils.close(connection,ps,resultSet);
}
}
篇末:
立个flag: 最近要把上学期没学好的的东西都给肝出来。。。
以上是关于数据库的批处理和MySql元数据的主要内容,如果未能解决你的问题,请参考以下文章
Spring Batch - 无法在 Postgres 上创建元数据表并将实际数据加载到 mysql