JDBC入门的一些操作
Posted 神芝
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDBC入门的一些操作相关的知识,希望对你有一定的参考价值。
一、
jdbc的安装
在mysql官网可以找到这个jar包,Downloads--->Community-->MySQL Connections -->Connector,不过一般网上找一大堆,如果用maven依赖就更简单了,在pom文件中添加依赖就行
二、
jdbc中有2个接口,一个是Driver,一个是DriverManager,DriverManager是Driver的管理者,DriverManager支持多种数据库,包括MySQL,用户使用Class.forname(DriverName)可以向DriverManager注册,MySQL的DriverName是com.mysql.jdbc.Driver。
1、Connection是程序指向数据库的链接通过 DriverManager.getConnection(db_url,user,password)获得
db_url是jdbc:mysql://localhost/shen_db,shen_db是我的数据库名,user和password就是用户和密码了
2、Statement是SQL容器,用于存放SQL语句,通过connection.createStatement()创建Statement,使用excuteQuery()或 excuteUpdata()执行SQL语句
3、ResultSet是服务器执行完sql语句后返回的结果集。
ResultSet有几个api
next()光标指向下一行,第一次执行就是指向第一行
previous()光标指向上一行
absolute()指向某一行
beforeFirst()指向第一行的前面
afterLast()指向最后一行的后面
指定某一行后指定某一列使用getObject(列名/index),可以直接指定列名,也可以指定序号,第一列的序号是0
4、SQLException是操作数据库可能会抛出的异常,所以要捕获他
Class.forname(com.mysql.jdbc.Driver); Connection conn=DriverManager.getConnection(DB_url,user,password); Statement stmt=conn.createStatement(); ResultSet rs=stmt.excuteQuery("SQL语句"); while(rs.next()){ rs.getString(""); }
在finally中,要把connection,Statement,ResultSet都close掉,在关闭之前要先判断是否存在再关闭,否则可能会抛异常
三、数据库连接池
为什么需要使用连接池,是因为每次创建链接时间开销大,不断创建连接销毁连接用户响应慢,还有如果不使用连接池管理链接,在连接过多的时候可能会导致服务器宕机或者抛异常,连接池能起到限流保护服务器的作用
DBCP连接池需要导入三个jar包,分别是commons-dbcp.jar,commons-pool.jar,commons-logging.jar,可以在Apache Commons下载
1、创建连接池
BasicDataSource ds=new BasicDataSource();
ds.setUrl(x);
ds.setDriverClassName(x);
ds.setUsername(x);
ds.setPassword(x);
x参数跟设置jdbc的参数都是一样的
2、获得链接
Connection conn=ds.getConnection();
Statement stmt =conn.createStatement();
ResultSet rs=stmt.excuteQuery(SQL);
3.关闭连接
conn.close;//在jdbc中,close是断开连接,而在DBCP中,close方法被重写了,变成归还连接给连接池了,close仍然需要判断是否为空
4、参数配置
ds.setInitialSize();//预置连接,加快第一次访问速度
.setMaxTotal();//设置最大连接数
.setMaxWaitMillis();//设置最大等待时间超时就会抛出异常
.setMaxIdel();//设置最大空闲连接,当空闲连接超出这个数就会销毁连接
.setMinIdel();//设置最小空闲连接,当空闲连接不足这个数就会创建连接
//一般最大空闲和最小空闲设置为相等,防止不断的创建销毁连接
5、定期检查
数据库为了释放空间等待资源,默认关闭等待时间过长的连接,MySQL默认时间是8小时,如果MySQL关闭了连接,但jdbc不知道,就会抛异常
ds.setTestWhileIdle(true);//开启定期检查
ds.setMinEvictableIdleTimeMillis();//如果连接空闲时间超过该时间,连接会被销毁,一般这个时间设置为比8小时稍短
ds.setTimeBetweenEvictionRunsMillis();//检查间隔时间
四、
1、游标
一次性读取海量条数据库记录可能会造成jvm内存溢出,游标提供一种客户端读取部分服务端结果集的机制,比如一次性读2条记录,那么称FetchSize为2
使用游标先在DB_URL的最后面加上useCursorFetch=true参数,开启游标,游标需要使用ParparedStatement,ParparedStatement
是Statement的子类
ParparedStatement ptmt=conn.parparedStatement("SQL语句");
ptmt.setFetchSize(10);//设置一次性读10条
2、流方式
读取大字段可能只读取一条记录内存就溢出了,所以可以采取流方式,以二进制流的方式分段读取大字段
InputStream in= rs.getBinaryStream("x");
File f=new File(FILE_URL);
OutputStream out =new FileOutputStream(f);
while((int temp=in.read())!=-1){
out.write(temp);
}
3、批处理
如果有大量的sql语句等待执行,这时候需要等待很久的时间,所以需要使用批处理方式
statement.addBatch();//把sql打包放进一个Batch,Batch就是sql执行的一个单元
statement.excuteBatch();//执行,插入/更新使用excuteUpdata()
statement.clearBatch();//清空batch
4、
如果数据库字符集和应用程序字符集不同,在使用中文时就会产生乱码,在DB_URL加一个参数characterEncoding=utf8就可以了
以上是关于JDBC入门的一些操作的主要内容,如果未能解决你的问题,请参考以下文章
Hibernate学习一:Hebinate入门以及一些小问题