day_32Java JDBC

还未好好整理....

星期三, 十二月 02, 2015 22:52:53

 

在已沟通有的Java函数库中,有一组专门处理数据库连接的API:

    JDBC(Java DataBase Connective)。

 本节重点讲解来自Java的数据精华---JDBC。

 熟练地使用这个数组API能使我们同数据库的沟通更加密切。

 

本节要点:

        掌握Java数据库连接的基本概念

        掌握Java数据库的连接方法

        熟悉Java数据库连接的相关方法

        了解批处理的相关概念

        了解事务处理的相关概念

         熟悉MySQL数据库的使用

 

一、数据库连接的基本概念

 

      JDBC(Java DataBase Connective),即Java数据库连接,是一组专门负责连接并操作数据库的标准。

      JDBC的出现,给使用Java的程序设计师提供了单一的数据访问方式,同时也使得程序设计师利用这组API,

能有效地访问各种形式的数据,包括关系型数据库、表格到一半的文本文件。

    另一方面,在整个JDBC中大量提供的实际上是接口,通过接口,JDBC规范了不同数据来源的相同访问方式,

并针对各个不同的数据库供应商,凡是想要使用Java进行数据库的开发,则肯定要对JDBC标准有所支持。

 

 

JDBC作用:

      1.完成数据库的连接创建

      2.传送sql命令给数据库,完成数据库操作及数据表

      3.接受和处理数据库所执行的结果。

 

JDBC在使用中常见的有以下3类:

 

1.JDBC--ODBC桥连接

 

        本套连接时SUN在JDK的开发包中提供的最标准的一套JDBC操作类库。

要将JDBC与数据库之间进行有效地连接访问,中间要经过一个ODBC的连接,但这意味着整体的 性能将会降低,

当接触的项目很大或者是用户很多的时候,维护ODBC所需要的工作量庞大而复杂,需要在JDBC于ODBC之间做数据之间的传递与转换,

容易造成性能的丢失或遗漏。

 

      所以在开发中绝不会去使用JDBC--ODBC的连接方式的。

      但ODBC连接简单而易学,在ODBC--JDBC,并且有些公司在用户计算机上都设置有ODBC连接,所以不需要再做此类设置。

 

2.JDBC连接

 

       使用各个数据库提供商给定的数据库驱动程序,完成JDBC的开发,这个时候需要在classpath中配置数据库的驱动程序。

此种数据连接方式在性能上比JDBC--ODBC桥连接要好很多。

 

         Java是利用本地的函数库与数据库驱动程序的函数库沟通,在效率上能够大大提升。

但同样,在进行数据库的连接时,用户必须掌握有JDBC的驱动程序以及数据库驱动程序的函数库,而且不同数据库拥有多个不同的驱动程序。

在进行数据库维护时,工作量是很大的。

 

3.JDBC网络连接

 

        此种连接方式主要使用网络连接数据库,这就要求驱动程序必须有一个中间层服务器(middleware server)。

        用户与数据库沟通时会通过此中间层服务器与数据库连接。

        而且这种连接方式只需要同中间层服务器做出有效连接,便可以连接上数据库,所以在更新维护时会大大地减少工作量。

 

 

二、使用数据库的准备工作

  JDBC的准备工作非常重要,首先要完成一般的数据库安装工作,先安装oracle。

 

  2.1已完成-->详情见oracle10g 安装与配置的使用

 

[提前配置好oracle的数据库环境, 不管是服务器, 还是客户端.]

 

   2.2数据库连接驱动程序设置

 

   接下来完成对数据库连接的驱动程序的设置。

   不同的数据库供应商拥不同数据库的驱动程序。

   对于oracle这种大型数据库软件,都会提供java环境下的数据库驱动程序。

   提供给java的驱动程序包jdbc,比如在:E:\oracle\product\10.2.0\db_1\jdbc\lib下的classes12.jar就是我们需要的驱动程序。

 

   如果现在是直接使用命令行方式进行开发的话,则需要在属性中增加classpath。

   将这个路径加入到用户变量classpath下:

                E:\oracle\product\10.2.0\db_1\jdbc\lib\classes12.jar

 

    而如果使用myeclipse的话,则直接在项目的属性中增加需要的类库文件即可。

    在java buildpath-->libraries-->add external jars-->加入

 

三、数据库表的准备

   1.完成了对于Oracle数据库的安装,并且为了能够说清JDBC的基本操作,应使用一下数据库表完成操作。

 

    2.在myeclipse中新建一个名称为JDBCproject1.0的包,接下来完成编写数据库的创建脚本

 

   3.打开Oracle数据库的监听服务和项目服务“OracleJobSchedulerORCL”;默认是打开的   

   启动oracle方法: cmd--->services.msc

                  启动OracleOraDb10g_home1TNSListener   和  OracleServiceORCL

 

    4.在SQLPLUS中执行sql

     

      CREATE SEQUENCE perseq;

      CREATE TABLE person(

      pid NUMBER PRIMARY KEY NOT NULL,

     name VARCHAR2(50) NOT NULL,

     age NUMBER NOT NULL,

     birthday DATE NOT NULL,

     salary NUMBER(10,2) NOT NULL

     );

    参考链接:

     http://jingyan.baidu.com/article/3aed632e7a638b70108091dd.html

 

四、连接数据库的步骤

 

    在进行JDBC操作的时候,应按照以下的步骤完成

           4.1 加载数据库驱动程序,加载的时候需要将驱动程序配置到classpath之中。

                classpath是在设置数据库驱动时的一个变量。

          4.2连接数据库,可通过Connecttion接口和DriverManager类完成。

                 具有操作连接数据库和控制数据源的作用。

          4.3 操作数据库,主要是通过Statement、PreparedStatement、ResultSet等3个接口完成。

          4.4关闭数据库。在实际开发中数据库资源非常有限,操作完成之后必须关闭,否则会造成数据的泄露或丢失,为用户或者开发人员造成不可挽       回的损失。

 

五.数据库连接的详细步骤

   

        完成了数据库的创建之后-->需要在JDBC中建立与数据库之间的关联操作==完成Java数据库的连接操作,

主要是通过包含JavaAPI包下的Class类中的方法进行。

 

  在JDBC的操作过程中,进行数据库连接的主要步骤:

 

     5.1 通过Class.forName()加载数据库的驱动程序。

           首先需要利用来自Class类中的静态方法forName(),加载需要使用的Driver类。

     作用:

       

          注册一个驱动程序中最常用的方法是使用Java的Class.forName()方法来动态加载驱动程序的类文件到内存中,它会自动将其注册。

          这种方法是可取的,因为它允许使驱动注册配置,便于携带。

 

    5.2 通过DriverManager类进行数据库的连接。

     java.lang.Object java.sql.DriverManager

 

     成功加载Driver类以后,Class.forName()会向DriverManager注册该类,

     此时则可通过DriverManager中的静态方法getConnection进行数据库的创建连接。

     同时,连接的时候需要输入数据库的链接地址、用户名、密码。

         getConnection(String url, String user, String password)  试图建立到给定数据库 URL 的连接。

 

     5.3 通过Connnection接口接收连接。

         当成功进行了数据库的连接之后,getConnection方法会返回一个Connection对象,

    而JDBC主要就是利用这个Connection对象与数据库进行沟通。

  5.4 此时输出的是一个对象,表示数据库已经连接上了。

 

不错的http://www.yiibai.com/jdbc/jdbc_driver_types.html

 

六、代码案例

      通过Java指令进行实际数据库的连接。本例是在用户建立过Oracle数据表之后,通过Java程序进行数据库的连接。

 

CREATE SEQUENCE perseq;
CREATE TABLE person(
    pid NUMBER PRIMARY KEY NOT NULL,
    name VARCHAR2(50) NOT NULL,
    age NUMBER NOT NULL,
    birthday DATE NOT NULL,
    salary NUMBER(10,2) NOT NULL
);

 

代码案例:

package day32;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class ConnectJDBC {

	//驱动程序就是之前在classpath中配置的jdbc的驱动程序的jar包中
	public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver";
	//连接地址是由各个数据库生产商单独提供的,所以需要单独记住
	public static final String DBURL = "jdbc:oracle:thin:@10.32.157.42:1521:orcl";
	public static final String DBUSER = "scott";
	public static final String DBPASS = "tiger";
	/*本例是在用户建立过Oracle数据表之后,通过Java程序进行数据库的连接。*/
	public static void main(String[] args) throws SQLException, ClassNotFoundException {
		//表示连接数据库的对象
		Connection conn = null;
		/*首先需要利用来自Class类中的静态方法forName(),加载需要使用的Driver类。*/
		Class.forName(DBDRIVER);
		/*通过DriverManager类进行数据库的连接。
		 * getConnection(String url, String user, String password) 
		 * 试图建立到给定数据库 URL 的连接。
		 * 返回:到 URL 的连接 */
		conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS);
		System.out.println(conn);
		//关闭数据库
		conn.close();
	}
}
运行结果:
oracle.jdbc.driver.T4CConnection@385715

 

 

运行结果:

oracle.jdbc.driver.T4CConnection@13a317a

 

 

星期三, 十二月 02, 2015 23:55:15

明天再进行补充

 

注意:

DBURL = "jdbc:oracle:thin:@10.32.157.42:1521:orcl";

     jdbc:oracle:thin:@这行代码为地址头,一般的Oracle数据库地址均由此开始。

    @之后的localhost为本机的IP地址,

     如果访问其他服务器的地址,则需要键入第三方服务器的IP地址进行连接。

    1521为端口号,Oracle默认的端口号为1521,也可登录Oracle目录下的NetManage查看。

    最后是orcl为数据库服务器名称。

 

七、数据维护

     如果想要进行数据库的维护操作,则可使用Statement接口,数据库维护主要是进行增加、修改和删除等操作。

 

7.1增加数据

    增加操作时编写增加的sql语句: insert

 

    因为涉及到了序列的概念,所以在使用时候需要编写sql语句进行增加操作,在sql语句中直接写上序列的nextVal即可。

形成为:序列名.nextVal。

  序列化:

  https://www.ibm.com/developerworks/cn/java/j-lo-serial/

 

7.2代码案例

为数据表增加数据。这里使用Statement接口为数据库中新建立的表进行增加数据操作。

 

 

参考API:

java.sql接口 Driver

java.sql类 DriverManager

java.sql接口 Connection

java.sql接口 Statement

 

简单理解就是:

      序列化:把内存数据保存到文件、数据库等

      反序列化:把数据读到内存

package day32;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class ConnectJDBC {

	//驱动程序就是之前在classpath中配置的jdbc的驱动程序的jar包中
	public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver";
	//连接地址是由各个数据库生产商单独提供的,所以需要单独记住
	public static final String DBURL = "jdbc:oracle:thin:@10.32.157.42:1521:orcl";
	public static final String DBUSER = "scott";
	public static final String DBPASS = "tiger";
	/*本例是在用户建立过Oracle数据表之后,通过Java程序进行数据库的连接。*/
	public static void main(String[] args) throws SQLException, ClassNotFoundException {
		//表示连接数据库的对象
		Connection conn = null;
		//表示数据库的操作
		Statement stt = null;
		
		/*首先需要利用来自Class类中的静态方法forName(),加载需要使用的Driver类。*/
		Class.forName(DBDRIVER);
		/*通过DriverManager类进行数据库的连接。
		 * getConnection(String url, String user, String password) 
		 * 试图建立到给定数据库 URL 的连接。
		 * 返回:到 URL 的连接 */
		conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS);
		System.out.println(conn);
		
		/*Statement createStatement()throws SQLException
		 * 创建一个 Statement 对象来将 SQL 语句发送到数据库。
		 * 不带参数的 SQL 语句通常使用 Statement 对象执行。
		 * 返回:一个新的默认 Statement 对象 */
		stt = conn.createStatement();
		/*executeUpdate(String sql) 执行给定 SQL 语句,该语句可能为 INSERT、UPDATE 或 DELETE 语句,
		 * 或者不返回任何内容的 SQL 语句(如 SQL DDL 语句)。*/
		String sql = "INSERT INTO person(pid,name,age,birthday,salary) VALUES (perseq.nextval,'宇宙',30,TO_DATE('1992-02-14','yyyy-mm-dd'),9999.0)";
		stt.executeUpdate(sql);
		
		//关闭数据库
		conn.close();
	}
}

运行结果:
oracle.jdbc.driver.T4CConnection@717ef5

在sqlplus中查询表中增加的数据,添加信息成功。

 注意:

    1.Statement接口,设置此接口对象为空,表示数据库的更新操作。

sql语句一般写在Statement接口下的executeUpdate()方法里。

       2.需要注意的是日期格式的数据,由于Oracle的局限性,这里需要增加TO_DATE语句即DATE格式数据。

 

7.3更新数据

    数据库的更新操作和增加数据的操作相同,直接编写update语句即可。

 

数据的连接配置信息都不变,只要执行的sql变下,方法变为executeUpdate()方法即可。

stt.executeUpdate(sql)

 

UPDATE person SET name = 'waxun',age=11,birthday=sysdate,salary=100000.0 where pid = 1

 

 

改变代码部分:

/*executeUpdate(String sql) 
		 * 执行给定 SQL 语句,该语句可能为 INSERT、UPDATE 或 DELETE 语句,
		 * 或者不返回任何内容的 SQL 语句(如 SQL DDL 语句。*/
		String sql = "UPDATE person SET name = 'waxun',age=11,birthday=sysdate,salary=100000.0 where pid = 1";
		stt.executeUpdate(sql);

 在sqlplus中进行查看数据

pid=1,信息已修改。

 

注意:

    sql语句是进行数据库必不可少的语句,准确而有效地运行sql语句是学好Java连接数据库,包括数据库系统的首要操作。

 

 

7.4删除数据

    数据的增加、更新、删除等都是通过sql语句完成的,所以在修改数据的时候,只需要更改程序下的sql语句即可实现目的。

使用delete语句可以进行删除数据的操作。

    删除数据的时候一般都是按照id删除。

 

执行SQL语句,更新数据库

  String sql = "delete from person where pid = 1"

代码案例:
/*executeUpdate(String sql) 
		 * 执行给定 SQL 语句,该语句可能为 INSERT、UPDATE 或 DELETE 语句,
		 * 或者不返回任何内容的 SQL 语句(如 SQL DDL 语句。*/
		String sql = "delete from person where pid = 1";
		stt.executeUpdate(sql);

 注意:

     通过执行sql语句进行删除操作,在新建表的同时,规定有id号,也就是所存储的位置号码pid。

由于pid具有唯一性,在做删除操作时需要引用pid号码,也就是调用其位置进行删除。

 

7.5查询数据库中的内容

   在oracle中,可以通过select语句查询数据库中的内容。

而对于程序的操作也是一样,所有的查询结果返回到程序处输出查看,那么程序就可以通过ResultSet接口保存全部的查询结果,通过Statement接口中的executeQuery()方法查询。

     查询之后的数据需要分别取出。

     通过next()方法得到返回的每一行数据,每一行中各个列的数据需要通过以下方法取得。

    例如:

      getInt() getString() getDate() getFloat()

 

 

 

7.5.1 代码案例

String sql = "select pid,name,age,birthday,salary from person";
		rs = stt.executeQuery(sql);
		while(rs.next()) {
			int pid = rs.getInt("pid");
			String name = rs.getString("name");
			int age = rs.getInt("age");
			Date birthday = rs.getDate("birthday");
			float salary = rs.getFloat("salary"); 
			System.out.print("pid :"+pid+"\t");
			System.out.print("name :"+name+"\t");
			System.out.print("age :"+age+"\t");
			System.out.print("birthday :"+birthday+"\t");
			System.out.print("salary :"+salary+"\t");
		}

运行结果:
oracle.jdbc.driver.T4CConnection@119ca2c
pid :2	name :宇宙	age :30	birthday :1992-02-14	salary :9999.0	

 注意:

    1.在select语句之后出现的是需要查询明确字段。

    2.rs.next()方法用来判断在查询的结果是否有下一个数据,表示查询信息是否传入到result。

    3.由于java从数据库中将查询信息调入到result内部,所以在使用java程序调出时需要从result中调出。

      此时调出的方法是getXXX()。也就是说,如果想得到整数,则为getInt()。

  

7.5.2观察ResultSet接口的API文档。

java.sql 接口 ResultSet

 

查询取得的结果的时候可以通过索引号的方式完成去取数据的操作。

 

 

 

在查询内容里写入直接输入索引号,不一定必须要用该内容的字段名称。

在查询数据的时候,可以通过数据所在的索引号查询。

 

代码案例:

/*
		在查询内容里写入直接输入索引号,不一定必须要用该内容的字段名称。
		在查询数据的时候,可以通过数据所在的索引号查询。*/
		String sql = "select pid,name,age,birthday,salary from person";
		rs = stt.executeQuery(sql);
		while(rs.next()) {
			int pid = rs.getInt(1);
			String name = rs.getString(2);
			int age = rs.getInt(3);
			Date birthday = rs.getDate(4);
			float salary = rs.getFloat(5);
			
			System.out.print("pid :"+pid+"\t");
			System.out.print("name :"+name+"\t");
			System.out.print("age :"+age+"\t");
			System.out.print("birthday :"+birthday+"\t");
			System.out.print("salary :"+salary+"\t");
		}


运行结果:
oracle.jdbc.driver.T4CConnection@119ca2c
pid :2	name :宇宙	age :30	birthday :1992-02-14	salary :9999.0	

 

 

 

增删改查

package day32;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;

public class ConnectJDBC {

	//驱动程序就是之前在classpath中配置的jdbc的驱动程序的jar包中
	public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver";
	//连接地址是由各个数据库生产商单独提供的,所以需要单独记住
	public static final String DBURL = "jdbc:oracle:thin:@10.32.157.42:1521:orcl";
	public static final String DBUSER = "scott";
	public static final String DBPASS = "tiger";
	/*本例是在用户建立过Oracle数据表之后,通过Java程序进行数据库的连接。*/
	public static void main(String[] args) throws SQLException, ClassNotFoundException {
		//表示连接数据库的对象
		Connection conn = null;
		//表示数据库的操作
		Statement stt = null;
		//接收数据库的查询结果
		ResultSet rs = null;
		
		/*首先需要利用来自Class类中的静态方法forName(),加载需要使用的Driver类。*/
		Class.forName(DBDRIVER);
		/*通过DriverManager类进行数据库的连接。
		 * getConnection(String url, String user, String password) 
		 * 试图建立到给定数据库 URL 的连接。
		 * 返回:到 URL 的连接 */
		conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS);
		System.out.println(conn);
		
		/*Statement createStatement()throws SQLException
		 * 创建一个 Statement 对象来将 SQL 语句发送到数据库。
		 * 不带参数的 SQL 语句通常使用 Statement 对象执行。
		 * 返回:一个新的默认 Statement 对象 */
		stt = conn.createStatement();
		/*executeUpdate(String sql) 执行给定 SQL 语句,该语句可能为 INSERT、UPDATE 或 DELETE 语句,
		 * 或者不返回任何内容的 SQL 语句(如 SQL DDL 语句)。*/
		/*String sql = "INSERT INTO person(pid,name,age,birthday,salary) VALUES (perseq.nextval,'宇宙',30,TO_DATE('1992-02-14','yyyy-mm-dd'),9999.0)";
		stt.executeUpdate(sql);*/
		
		/*executeUpdate(String sql) 
		 * 执行给定 SQL 语句,该语句可能为 INSERT、UPDATE 或 DELETE 语句,
		 * 或者不返回任何内容的 SQL 语句(如 SQL DDL 语句)。
		String sql = "UPDATE person SET name = 'waxun',age=11,birthday=sysdate,salary=100000.0 where pid = 1";
		stt.executeUpdate(sql);*/
		
		
		/*executeUpdate(String sql) 
		 * 执行给定 SQL 语句,该语句可能为 INSERT、UPDATE 或 DELETE 语句,
		 * 或者不返回任何内容的 SQL 语句(如 SQL DDL 语句)。
		String sql = "delete from person where pid = 1";
		stt.executeUpdate(sql);*/
		
		/*ResultSet executeQuery(String sql)
        throws SQLException执行给定的 SQL 语句,该语句返回单个 ResultSet 对象。 
		String sql = "select pid,name,age,birthday,salary from person";
		rs = stt.executeQuery(sql);
		while(rs.next()) {
			int pid = rs.getInt("pid");
			String name = rs.getString("name");
			int age = rs.getInt("age");
			Date birthday = rs.getDate("birthday");
			float salary = rs.getFloat("salary"); */
		
		/*
		在查询内容里写入直接输入索引号,不一定必须要用该内容的字段名称。
		在查询数据的时候,可以通过数据所在的索引号查询。*/
		String sql = "select pid,name,age,birthday,salary from person";
		rs = stt.executeQuery(sql);
		while(rs.next()) {
			int pid = rs.getInt(1);
			String name = rs.getString(2);
			int age = rs.getInt(3);
			Date birthday = rs.getDate(4);
			float salary = rs.getFloat(5);
			
			System.out.print("pid :"+pid+"\t");
			System.out.print("name :"+name+"\t");
			System.out.print("age :"+age+"\t");
			System.out.print("birthday :"+birthday+"\t");
			System.out.print("salary :"+salary+"\t");
		}

		//关闭数据库
		rs.close();
		stt.close();
		conn.close();
	}
}

 

星期四, 十二月 03, 2015 18:46:12

 

八、查询信息实例

 

    由于之前的程序所有的输入内容都是固定的,所以在实际操作中,有很多的可变性就没有被考虑到。

现在要求可以由用户自己输入需要的内容,并通过程序把输入的内容加入到数据库中,

 

8.1通过实例化程序了解控制台输入数据库。

 接下来进行的是当用户自己输入数据时,需要如何将输入的数据保存到数据库中。

你可能感兴趣的:(day_32Java JDBC)