JDBC原理

JDBC是什么

Java Database Connectivity:Java访问数据库的解决方案。

JDBC是Java应用程序访问数据库的里程碑式解决方案。Java研发者希望用相同的方式访问不同的数据库,以实现与具体数据库无关的Java操作界面。

JDBC定义了一套标准接口,即访问数据库的通用API,不同的数据库厂商根据各自数据库的特点去实现这些接口。

JDBC接口及数据库厂商实现

JDBC中定义了一些接口:
1、 驱动管理:
DriverManager
2、 连接接口
Connection
DatabasemetaData
3、 语句对象接口
Statement
PreparedStatement
CallableStatement
4、 结果集接口
ResultSet
ResultSetMetaData

JDBC工作原理

JDBC只定义接口,具体实现由各个数据库厂商负责。
程序员使用时只需要调用接口,实际调用的是底层数据库厂商的实现部分。

JDBC访问数据库的工作过程:
1.加载驱动,建立连接
2.创建语句对象
3.执行SQL语句
4.处理结果集
5.关闭连接

Driver接口及驱动类加载

要使用JDBC接口,需要先将对应数据库的实现部分(驱动)加载进来。
驱动类加载方式(Oracle):

  1. Class.forName("oracle.jdbc.driver.OracleDriver");

Connection接口

Connection接口负责应用程序对数据库的连接,在加载驱动之后,使用url、username、password三个参数,创建到具体数据库的连接。

  1. Class.forName("oracle.jdbc.OracleDriver")
  2. //根据url连接参数,找到与之匹配的Driver对象,调用其方法获取连接
  3. Connectionconn = DriverManager.getConnection(
  4. "jdbc:oracle:thin:@192.168.0.26:1521:tarena",
  5. "openlab","open123");
需要注意的是:Connection只是接口,真正的实现是由数据库厂商提供的驱动包完成的。

Statement接口

Statement接口用来处理发送到数据库的SQL语句对象,通过Connection对象创建。主要有三个常用方法:

  1. Statementstmt=conn.createStatement();
  2. //1.execute方法,如果执行的sql是查询语句且有结果集则返回true,如果是非查询语句或者没有结果集,返回false
  3. boolean flag= stmt.execute(sql);
  4. //2.执行查询语句,返回结果集
  5. ResultSetrs= stmt.executeQuery(sql);
  6. //3.执行DML语句,返回影响的记录数
  7. int flag= stmt.executeUpdate(sql);

ResultSet接口

执行查询SQL语句后返回的结果集,由ResultSet接口接收。
常用处理方式:遍历 / 判断是否有结果(登录)。

  1. Stringsql = "select * from emp";
  2. ResultSetrs= stmt.executeQuery(sql);
  3. while(rs.next()){
  4.     System.out.println(rs.getInt("empno")+",“
  5. +rs.getString("ename") );
  6. }
查询的结果存放在ResultSet对象的一系列行中,指针的最初位置在行首,使用next()方法用来在行间移动,getXXX()方法用来取得字段的内容。

通过连接工具类获取连接

在工程中,通常编写一个访问数据库的工具类,此后所有访问数据库的操作,都从工具类中获取连接。
实现工具类的两种方式:
直接把数据配置写在工具类。
把数据库配置写在一个properties属性文件里,工具类读入属性文件,逐行获取数据库参数。
建议使用第二种。

通过属性文件维护连接属性

  1. #驱动类名
  2. jdbc.driver=oracle.jdbc.driver.OracleDriver
  3. #连接字符串
  4. jdbc.url=jdbc:oracle:thin:@192.168.0.26:1521:tarena
  5. #访问数据库的用户名
  6. jdbc.user=openlab
  7. #访问数据库的密码
  8. jdbc.password=open123

从类路径中加载属性文件

定义好db.properties之后,需要在Java程序中找到它,可以使用从类路径加载的方式:

  1. //属性文件所在的位置
  2. Stringpath = "com/tarena/dms/daodemo/v2/db.properties";
  3. //获得当前类的路径,加载指定属性文件
  4. properties.load(DBUtility.class.getClassLoader()
  5. .getResourceAsStream(path));

连接的关闭

  1. protectedstaticvoidcloseConnection(Connectioncon){
  2.         if(con!= null){
  3.             try{
  4.                 con.close();
  5.             }catch(SQLExceptione){
  6. e.printStackTrace();
  7.             }
  8.         }
  9.     }

连接池技术

数据库连接的建立及关闭资源消耗巨大。传统数据库访问方式:一次数据库访问对应一个物理连接,每次操作数据库都要打开、关闭该物理连接, 系统性能严重受损。

解决方案:数据库连接池(Connection Pool)。

系统初始运行时,主动建立足够的连接,组成一个池.每次应用程序请求数据库连接时,无需重新打开连接,而是从池中取出已有的连接,使用完后,不再关闭,而是归还。

连接池中连接的释放与使用原则
应用启动时,创建初始化数目的连接
申请时无连接可用或者达到指定的最小连接数,按增量参数值创建新的连接
确保连接池中最小的连接数的策略
动态检查:定时检查连接池,一旦发现数量小于最小连接数,则补充相应的新连接,保证连接池正常运转
静态检查:空闲连接不足时,系统才检测是否达到最小连接数
按需分配,用过归还,超时归还

连接池也只是JDBC中定义的接口,具体实现由厂商实完成。

使用Apache DBCP连接池

使用Apache DBCP需要两个jar包文件:
commons-dbcp-1.4.jar 连接池的实现
commons-pool-1.5.jar 连接池实现的依赖库

通过DataSource获取连接

  1. //创建数据源对象
  2. private static BasicDataSourcedataSource = new BasicDataSource();
  3. //加载参数
  4. dataSource.setDriverClassName(driveClassName);
  5. dataSource.setUrl(url);
  6. dataSource.setUsername(username);
  7. dataSource.setPassword(password);
  8. //获得连接
  9. Connection conn = dataSource.getConnection();

连接池参数

常用参数有:
初始连接数
最大连接数
最小连接数
每次增加的连接数
超时时间
最大空闲连接
最小空闲连接
根据应用需要,设置合适的值。

异常处理

SQLException简介

Java.sql.SQLException是在处理JDBC时常见的exception对象,用来表示JDBC操作过程中发生的具体错误;
一般的SQLException都是因为操作数据库时出错 , 比如Sql语句写错,或者数据库中的表或数据出错。
常见异常:
登录被拒绝
可能原因:程序里取键值对信息时的大小写和属性文件中不匹配
列名无效
可能原因:查找的表和查找的列不匹配
无效字符
可能原因:SQL语句语法有错 , 比如语句结尾时不能有分号
无法转换为内部表示
可能原因:结果集取数据时注意数据类型。
表或者视图不存在
检查SQL中的表名是否正确
不能将空值插入
检查执行insert操作时,是否表有NOT NULL约束,而没有给出数据
缺少表达式
检查SQL语句的语法
SQL 命令未正确结束
检查SQL语句的语法
无效数字:
企图将字符串类型的值填入数字型而造成,检查SQL语句
其他可能出现的异常
文件找不到
可能原因:db.properties文件路径不正确
注意: 新增数据后务必要commit, 否则Java程序运行查询后找不到数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值