1.批处理测试
获取当前时间System.currentTimeMillis();
批处理:
并不是逐条语句进行处理,而是时机成熟后,批量执行成功。
//添加到批处理
stmt.addBatch(sql);
//执行批处理
stmt.executeBatch();
模拟四种情况
事务手动提交,不使用批处理,使用Statement
事务手动提交,不使用批处理,PrepareStatement
事务手动提交,使用批处理,Statement
事务手动提交,使用批处理,PrepareStatement(实际应用最多,效果最明显)
测试,不同方式插入上千条数据,计算实际使用时间。
java.util.Date start = System.currentTimeMillis();
java.util.Date end = System.currentTimeMillis();
syso("运行时间: "+(end-start));
2.Statement和PrepareStatement对比
Statement PrepareStatement
sql在哪里创建 客户端 客户端
sql代码存储到哪 客户端 服务器(预处理预编译)
什么技术编写代码 sql语句 sql
配置性 很高 第一次高,以后固定
可移植性 高 高,数据库得支持预编译
效率 低 高
客户端: 项目源码部分
服务器: 数据库服务器
student表
id name score birthday
1 zs 78 09-9月-17
2 ls 78 09-9月-17
3.DatabaseMetaData数据库元对象
MetaData元数据,描述数据的数据。
可以用来获得数据库的相关信息
获得数据库对象(表、视图、索引)的相关信息
获得数据库中列的信息
获得RusultSet中包含的列信息
4.获得数据库相关信息
metaData.getDatabaseProductName();
数据库名字
metaData.getDatabaseProductName();
数据库版本详细信息
metaData.getDatabaseProductName();
产品的主版本
metaData.getDatabaseProductName();
产品的次版本
//获取数据库 里面 对象信息
ResultSet getTables(
String catalog, //null
String schema, //用户名
String tableName,
String types[]) throws SQLException;
5.获得数据库中表相关信息
catalog:
schema:
tableName: 表名
types: 具体类型,表、视图、索引、同义词
metaData.getTables(catalog,schema,tableName,types);
catalog,schema:在SQL标准下这两个都属于抽象概念,用来解决命名冲突问题。
从概念上说,一个数据库系统包含多个Catalog,每个Catalog包含多个Schema,而每个Schema又包含多个数据库对象(表、视图、索引)。
也可以说一个数据库对象必然属于一个schema,而schema又属于一个catalog。这样我们就可以得到该数据库对象的完全限定名称从而解决命名冲突的问题了
从实现的角度来看,各种数据库系统对Catalog和Schema的支持和实现方式千差万别,针对具体问题需要参考具体的产品说明书常用实现方式是使用【数据库名作为Catalog名】,使用【用户名作为Schema名】。
数据库 Catalog Schema
Oracle 不支持 用户名
MySql 不支持 数据库名
具体应用:
rs = metaData.getTables(null,“TEST”,null,new String[]{“TABLE”});
while(rs.next()) {
String tName = rs.getString(“TABLE_NAME”);
String tType = rs.getString(“TABLE_TYPE”);
}
通过数据字典可以实现相同功能:
select table_name from user_tables;
查询出来的BIN$开头的属于数据库回收站里面的残留信息。
purge recyclebin; 可以【清空回收站】
6.获取数据库中列信息
metaData.getColumns(catalog,schema,tableName,columnName);
rs = metaData.getColumns(null,“TEST”,“STUDENT”,null);
while(rs.next()){
String colName = rs.getString(“COLUMN_NAME”);
String colType = rs.getString(“TYPE_NAME”);
}
7.获取ResultSet中包含的列信息
包含多少列
每列都是什么数据类型
ResultSetMetaData metaData = rs.getMetaData();
//获取列数
int columnNum = metaData.getColumnCount();
for(int i = 1;i <= columnNum;i++){
//获取每一列名称
syso(metaData.getColumnName(i));
//获取每一列类型
syso(metaData.getColumnTypeName(i));
}
同构和异构
同构: sql语句结构相同
String sql = “?,?,?”;
PrepareStatement ps = conn.prepareStatement(sql);
ps.setXXX(1,*);
ps.setXXX(2,*);
…
ps.execute();
异构: sql语句结构不同
Statement
引入: 驱动注册 4种 Class.forName();
new OracleDriver();
System.setProperty(“jdbc.drivers”,OracleDriver全包名);
-Djdbc.drivers=oracle.jdbc.driver.OracleDriver
数据库连接的两种方式
DriverManager.getConnection(url,user,password);
Driver dr = new ;
dr.connect(url,info); info(user,password);
批处理
stmt|ps.addBatch();
…
stmt|ps.executeBatch();
结论: ps 和 批处理结合使用,会大大提高效率。
事务控制
conn.setAutoCommit(false);
conn.commit();
conn.rollback();
理解: 为什么封装,封装的好处,具体研发中,谁来进行封装。
程序员使用起来更简单
架构组的人员|业务组长|主要编程 公共代码
自己
8.封装jdbc操作过程
a.创建一个工厂类,生成数据库连接对象
将数据库连接四要素,放入配置文件
properties文件 xml文件两种情况
b.封装关闭方法
c.封装sql语句的执行
9.进一步封装
在上述基础上,将具体的功能实现,封装到一个接口内部,用户在具体实现功能时,匿名内部类操作即可。
MyBatis 对JDBC的封装。
封装注意事项:
代码相同的,直接封装成公共代码
代码不同的,留给用户来实现