JDBC及操作数据库步骤

概念


  JDBC-数据库连接,是由一些类和接口构成的API,是J2SE的一部分,有java.sql、javax.sql包组成。下面看一下JDBC API与应用程序和数据库驱动及数据库之间的关系:

  JDBC及操作数据库步骤_第1张图片

  可以看出JDBC是Sun公司为应用程序与数据库驱动之间提供的一组接口(规范)。数据库驱动是实现数据库操作的类,它并不由sun公司来实现,而是由具体的公司来根据sun提供的规范(JDBC)来制作。


操作数据库的步骤(以mySql为例)


 与ODBC类似,分为以下几步(2层JDBC体系结构为例):

  1.      注册驱动

  2.      建立连接

  3.      创建执行sql语句的对象

  4.      执行语句

  5.      处理执行结果

  6.      释放资源


 下面进行详解:

  1. 注册驱动

   常用的有3种方式:

   1)      直接注册驱动:

   DriverManager.registerDriver(com.mysql.jdbc.Driver);这种方式要求程序首先要引入驱动包,否则无法通过编译。而且它可能会造成DriverManager中产生两个一样的驱动,并对具体的驱动类产生依赖,所以不推荐使用。

   2)      键值对方式:

   System.setProperty(“jdbc.drivers”,”com.mysql.jdbc.Driver”);同时注册多个驱动则用冒号隔开。这种方式如果事先不引入驱动包的情况下能通过编译(因为操作的都为字符串,运行时肯定不行啦),所以虽然不会对具体的驱动类产生依赖,但注册不太方便,所以很少使用。

   3)      Class.forName方式(类似反射):

   Class.forName(“com.mysql.jdbc.Driver”); Class.forName函数的作用是根据类的名字将类装载到虚拟机中(并未实例化);这种方式也不会对具体的驱动类产生依赖,而且使用很方便,所以推荐使用

  2. 建立连接

   Connection conn=DriverManager.getConnection(url,uid,pwd);

   url格式:JDBC:子协议:子名称//主机名:端口/数据库名?key=value&…

       例如:jdbc:mysql://localhost:8086/jdbc;uid和pwd也可以用key=value的方式告诉数据库。

            其它参数:如,userUnicode=true&characterEncoding=gbk

  3. 创建执行sql语句的对象

   这里有两个对象可以使用:Statement、PreparedStatement对象

   一般来说有参数的sql操作都用PreparedStatement对象,因为它有防止sql注入等优点。两者的区别这里不多介绍,创建语句:(假设conn为数据库连接对象)

   Statement st=conn.createStatement();

   PreparedStatement ps=conn.prepareStatement(strSql);

   可以看出在创建PreparedStatement对象时即需要指明要执行的sql语句,因为它会对sql语句进行预处理,例如进行一些防止sql注入的字符过滤等;而Statement则在执行sql动作时才指明sql语句。

  4. 执行语句(CURD)

   查询:st.executeQuery(strSql);或者ps. executeQuery();

   非查询(增、删、改):st.executeUpdate(strSql);或ps.executeUpdate();

  5. 处理执行结果

   查询:返回值用ResultSet接收,例:ResultSet rs=st.executeQuery(strsql)

   非查询(增、删、改):返回值为int

  6. 释放资源

   依次释放ResultSet、Statement(或PreparedStatement)、Connection对象,释放顺序与创建顺序相反(类似“栈”结构)。

   注意,Connection是非常稀有的资源,用完必须马上释放,它的使用原则是尽量晚的创建,尽量早的释放,以减少占用资源的时间。


 下面看一个最普通的操作代码: 

	//以mysql为例
	public static void test() throws ClassNotFoundException, SQLException{
		/*1.注册驱动(3种方法),依赖于驱动jar包的存在,否则无法通过编译
		DriverManager.registerDriver(new com.mysql.jdbc.Driver());*/
		//方法2:System.setProperties("jdbc.drivers","com.mysql.jdbc.Driver");
		//方法3:*****推荐使用******
		Class.forName("com.mysql.jdbc.Driver");	
		//2.建立连接
		Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:8086/jdbc","zhipeng","123456");
		//3.创建语句执行对象
		java.sql.Statement st=conn.createStatement();//使用Statement对象	
		//4.执行语句
		ResultSet rs=st.executeQuery("select * from T_User");
		//5.处理结果
		while(rs.next()){
			System.out.print(rs.getObject(1)+"\t"+rs.getObject(2)+"\t"+rs.getObject(3)+"\t");
		}
		//6.释放资源,资源rs、st、conn的释放顺序与创建顺序相反
		rs.close();
		st.close();
		conn.close();
	}
}

   当然真正使用时要对上面的代码进行优化封装等,比如需要将注册驱动、建立连接、释放资源的操作封装到一个工具类中,然后用单例模式为该类加锁(synchronized)以限制多线程冲突问题。


扩展


 JDBC 访问DB的体系结构分为两类(Driver是实现数据库操作的类)

   1)      2层:客户-数据库

   2)      3层:客户-中间层(WebLogicServer)-数据库


   JDBC及操作数据库步骤_第2张图片


   上面6步操作使用JDBC直接访问数据库的方式一看就知道是2层的体系结构。下面简单介绍3层的JDBC体系结构:

   使用3层的JDBC体系结构访问数据,首先要安装WebLogicServer,然后在它上面配置一个连接池(Connection Pool)和一个数据源(Data Source)。


 连接池作用:

   1)      消除频繁建立连接所需的负载

   2)      是用于管理数据库连接的管理对象

   3)      提供可共享,安全的连接


   JDBC及操作数据库步骤_第3张图片


 数据源作用:

   1)      从连接池中提供连接的被管理的工厂对象

   2)      绑定到JNDI(便于在不同的数据源操作即分布式操作)并使用管理控制台配置


   JDBC及操作数据库步骤_第4张图片


    这样就可以从JNDI中获取驱动,然后包装为DataSource对象,然后用DataSource对象来建立Connection对象了: 


   JDBC及操作数据库步骤_第5张图片    

                       

              代码实例:  

package testJDBC;

import java.beans.Statement;
import java.sql.Connection;
import java.sql.ResultSet;

import javax.activation.DataSource;
import javax.naming.Context;
import javax.naming.InitialContext;

public class TestThree {
	public void test(){
		//实例化Context对象
		Context ctx=new InitialContext();
		//从JNDI中查找驱动,并包装为DataSource对象
		DataSource ds=(DataSource)ctx.lookup("TestDataSource");
		//用DataSource对象来创建Connection对象
		Connection conn=ds.getConnection();
		//其它的与2层体系的JDBC类似
		java.sql.Statement st=conn.createStatement();
		String sqlString="select * from T_User";
		ResultSet res=st.executeQuery(sqlString);
		while(res.next()){
			System.out.println(res.getObject(1));
		}
	}
}


        总之就是加了一个应用服务器(WLS)来管理Connection对象,使得这种宝贵的资源使用更合理。


你可能感兴趣的:(【Java综合】)