JDBC数据批处理
JDBC(Java Data Base Connectivity):SUN公司为统一对数据库的操作定义的一套Java操作规范(接口),成为JDBC;
API中组成JDBC的两个包:java.sql | javax.sql
JDBC过程(以MySQL、Oracle数据库为例)
mysql数据库默认端口:3306
oracle数据库默认端口:1521
services.msc:查看系统中所有的服务
mysql数据库中最重要的配置文件
C:\Program Files (x86)\MySQL\MySQL Server 5.0\my.ini
port=3306 端口号
default-character-set=utf8 mysql数据库编码
C:/Program Files (x86)/MySQL/MySQL Server 5.0/ mysql安装路径
C:/Program Files (x86)/MySQL/MySQL Server 5.0/Data/ 数据库文件存放路径
default-storage-engine=INNODB mysql数据库引擎
1、加入驱动包,注册Driver(除jar包,还需要导入相应JDBC的数据库实现(即数据库驱动))
//加载数据库驱动
a、 Class.forName("com.mysql.jdbc.Driver");//MySQL两种方式,采用此种方式,程序仅仅只需要一个字符串,不需要import驱动的API,这样可使程序不依赖具体的驱 动,使程序的灵活性更高。
b、DriverManager. registerDriver(Driver driver)
//Oracle
Driver driver = new oracle.jdbc.driver.OracleDriver();
Properties info = new Properties();
//Oracle指定数据用户名以及密码
info.setProperty("user", "scott");
info.setProperty("password", "tiger")
2、获取连接
//MySQL获取连接 //协议:子协议 主机 端口 数据库
Connection con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test", "root", "root");
//Oracle获取连接
Connection con = driver.connect("jdbc:oracle:thin:@127.0.0.1:1521:orcl", info);
3、获取statement
//准备sql语句
String sql = "insert into tb_user(loginname,username,password) values(?,?,?)";
//获取集装箱
PreparedStatement pstm = null;
4、发送sql
5、处理返回的结果集ResultSet
6、关闭资源
try {
pstm = con.prepareStatement(sql);
for(int i=0;i<list.size();i++){
pstm.setString(1, list.get(i).getLoginname());
pstm.setString(2, list.get(i).getUsername());
pstm.setString(3, list.get(i).getPassword());
//将sql语句添加至批处理命令中
pstm.addBatch();
}
//执行批处理
int[] flag = pstm.executeBatch();
System.out.println("影响的行数:"+flag.length);
//清空批处理命令
pstm.clearBatch();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
//关闭数据库连接
ConnectionFactory.close(con, pstm, null);
}
Statement 与PrepareStatement
PrepareStatement是Statement子类 支持占位符?
批量插入时 性能更好 效率更高
防止SQL注入,更安全
代码不同:
Statement:
//将sql语句添加至批处理命令中
a、 statement.addBatch(sql);
//执行批处理
b、statement.executeBatch();
//清空批处理命令
c、statement.clearBatch();
PreparedStatement:
//将sql语句添加至批处理
a、pstm.addBacth(); 注意此处不需要传入sql语句,因为在获取集装箱(PreparedStatement)的时候已将sql
语句传入
//执行批处理
b、 pstm.executeBatch();
//清空批处理命令
c、pstm.clearBatch();
数据库连接池:优化项目的性能
现在很多Web服务器(Weblogic, WebSphere, Tomcat)都提供了DataSoruce的实现,即连接池的实现。
通常我们把DataSource的实现,按其英文含义称之为数据源,数据源中都包含了数据库连接池的实现。
也有一些开源组织提供了数据源的独立实现:
DBCP 数据库连接池(tomcat)
C3P0 数据库连接池(hibernate)
//获取数据源
BasicDataSource basicDataSource = new BasicDataSource();
//设置连接地址
basicDataSource.setUrl("jdbc:mysql://127.0.0.1:3306/bookapp");
//最大活动数
basicDataSource.setMaxActive(3);
//设置最大保存数
basicDataSource.setMaxIdle(3);
//超时等待时间 单位毫秒
basicDataSource.setMaxWait(5000);
//设置用户名
basicDataSource.setUsername("root");
//设置密码
basicDataSource.setPassword("root");
//获取连接
Connection con = basicDataSource.getConnection();
实际开发中我们可以web服务器来配置数据源
找到server中的context.xml文件
<Resource name="jdbc/shop_app" auth="Container" type="javax.sql.DataSource"
maxTotal="100" maxIdle="30" maxWaitMillis="10000"
username="root" password="root" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/bank"/>
代码初始化数据源
static{
try {
InitialContext context = new InitialContext();
//通过context的lookup方法来检索JNDI容器中的DataSource资源名来进行检索 注意:在检索的时候需要加上web容器的对应的资源前缀 tomcat容器的前缀:java:/comp/env
dataSource = (DataSource)context.lookup("java:/comp/env/jdbc/bookapp");
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
元数据
try {
con = ConnectionFactory.getConnection();
String sql = "select * from tb_user";
//获取集装箱
pstm = con.prepareStatement(sql);
rs = pstm.executeQuery();
//获取元数据(该数据中包含,表中列的数量,列类型、列名称)
ResultSetMetaData metaData = rs.getMetaData();
//获取列的数量
int column = metaData.getColumnCount();
System.out.println("得到列的数量:"+column);
//遍历结果集
rs.next();
for(int i=1;i<=column;i++){
//获取列名
String name = metaData.getColumnName(i);
//获取数据类型
String type = metaData.getColumnTypeName(i);
//根据列名获取数据
Object object = rs.getObject(name);
System.out.println("列名:"+name+"类的类型:"+type+" 得到的数据:"+object);
}
}