zoukankan      html  css  js  c++  java
  • JDBC连接MySQL数据库及演示样例

    JDBC是Sun公司制定的一个能够用Java语言连接数据库的技术。

    一、JDBC基础知识        

            JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,能够为多种关系数据库提供统一訪问,它由一组用Java语言编写的类和接口组成。JDBC为数据库开发者提供了一个标准的API,据此能够构建更高级的工具和接口,使数据库开发者能够用纯 Java API 编写数据库应用程序,而且可跨平台执行,而且不受数据库供应商的限制。

    1、跨平台执行:这是继承了Java语言的“一次编译,到处执行”的特点;

    2、不受数据库供应商的限制:巧妙在于JDBC设有两种接口,一个是面向应用程序层,其作用是使得开发者通过SQL调用数据库和处理结果,而不须要考虑数据库的提供商;还有一个是驱动程序层,处理与详细驱动程序的交互,JDBC驱动程序能够利用JDBC API创建Java程序和数据源之间的桥梁。应用程序仅仅须要编写一次,便能够移到各种驱动程序上执行。Sun提供了一个驱动管理器,数据库供应商——如MySQL、Oracle,提供的驱动程序满足驱动管理器的要求就能够被识别,就能够正常工作。所以JDBC不受数据库供应商的限制。


            JDBC API能够作为连接Java应用程序与各种关系数据库的纽带,在带来方便的同一时候也有负面影响,下面是JDBC的优、缺点。长处例如以下:

    • 操作便捷:JDBC使得开发者不须要再使用复杂的驱动器调用命令和函数;
    • 可移植性强:JDBC支持不同的关系数据库,所以能够使同一个应用程序支持多个数据库的訪问,仅仅要载入对应的驱动程序就可以;
    • 通用性好:JDBC-ODBC桥接驱动器将JDBC函数换成ODBC;
    • 面向对象:能够将经常使用的JDBC数据库连接封装成一个类,在使用的时候直接调用就可以。

            缺点例如以下:

    • 訪问数据记录的速度受到一定程度的影响;
    • 更改数据源困难:JDBC可支持多种数据库,各种数据库之间的操作必有不同,这就给更改数据源带来了非常大的麻烦


    二、JDBC连接数据库的流程及其原理

    1、在开发环境中载入指定数据库的驱动程序。比如,接下来的实验中,使用的数据库是MySQL,所以须要去下载MySQL支持JDBC的驱动程序(最新的是:mysql-connector-java-5.1.18-bin.jar);而开发环境是MyEclipse,将下载得到的驱动程序载入进开发环境中(详细演示样例的时候会解说怎样载入)。


    2、在Java程序中载入驱动程序。在Java程序中,能够通过 “Class.forName(“指定数据库的驱动程序”)” 方式来载入加入到开发环境中的驱动程序,比如载入MySQL的数据驱动程序的代码为:  Class.forName(“com.mysql.jdbc.Driver”)


    3、创建数据连接对象:通过DriverManager类创建数据库连接对象ConnectionDriverManager类作用于Java程序和JDBC驱动程序之间,用于检查所载入的驱动程序能否够建立连接,然后通过它的getConnection方法,依据数据库的URL、username和password,创建一个JDBC Connection 对象。如:Connection connection =  DriverManager.geiConnection(“连接数据库的URL", "username", "password”)。当中,URL=协议名+IP地址(域名)+port+数据库名称;username和password是指登录数据库时所使用的username和password。详细演示样例创建MySQL的数据库连接代码例如以下:

                  Connection connectMySQL  =  DriverManager.geiConnection(“jdbc:mysql://localhost:3306/myuser","root" ,"root" );


    4、创建Statement对象:Statement 类的主要是用于运行静态 SQL 语句并返回它所生成结果的对象。通过Connection 对象的 createStatement()方法能够创建一个Statement对象。比如:Statement statament = connection.createStatement(); 详细演示样例创建Statement对象代码例如以下:

                 Statement statamentMySQL =connectMySQL.createStatement(); 


    5、调用Statement对象的相关方法运行相相应的 SQL 语句:通过execuUpdate()方法用来数据的更新,包含插入和删除等操作,比如向staff表中插入一条数据的代码:

           statement.excuteUpdate( "INSERT INTO staff(name, age, sex,address, depart, worklen,wage)" + " VALUES ('Tom1', 321, 'M', 'china','Personnel','3','3000' ) ") ; 

    通过调用Statement对象的executeQuery()方法进行数据的查询,而查询结果会得到 ResulSet对象,ResulSet表示运行查询数据库后返回的数据的集合,ResulSet对象具有能够指向当前数据行的指针。通过该对象的next()方法,使得指针指向下一行,然后将数据以列号或者字段名取出。假设当next()方法返回null,则表示下一行中没有数据存在。使用演示样例代码例如以下:

           ResultSet resultSel = statement.executeQuery( "select * from staff" );


    6、关闭数据库连接:使用完数据库或者不须要訪问数据库时,通过Connectionclose() 方法及时关闭数据连接。


    三、JDBC应用演示样例实验

    实验内容:使用phpMyAdmin在MySQL中创建数据库(myuser),并加入实验所需的数据(新建staff表,加入一些记录);编写Java程序,利用JDBC连接在MySQL中创建好的数据库(myuser),对staff表格进行插入、更新、删除和查询等操作。

    实验环境及开发工具:Win7操作系统;jdk1.6.0_26;XAMPP1.7.7(MySQL 5.1,  phpMyAdmin);MyEclipse 8.5

    实验环境的搭建:可參考我的博客


    实验过程及步骤:

            1、下载MySQL支持JDBC的驱动程序:假设已经有了,可跳过这一步。前往MySQL官网(http://www.mysql.com/products/connector/ )下载驱动程序,,MySQL针对不同的平台提供了不同的连接器,我们须要的是DBC Driver for MySQL (Connector/J),例如以下图所看到的,点击 Download 跟着站点的引导进行下载。打开下载得到的压缩包(mysql-connector-java-5.1.18.zip),将当中的Java包(mysql-connector-java-5.1.18-bin.jar),拷贝到MySQL文件夹下(仅是为了方便才放到这里),以备载入驱动程序时使用。







            2、创建数据库:使用phpMyAdmin,登录MySQL,创建数据库myuser,并在当中插入一个名为staff的表格。并加入一些数据,操作步骤如图,登录进去MySQL数据库后:

                   1)创建数据库,名称为myuser,编码为utf8_general_ci(支持中文);

    创建数据库

                  2)新建表格,名称为staff,表格有8个字段;

                      3)8个字段的设置,包含名称、类型、值的长度、初始值、编码等等(点击查看大图);


                    4)加入成功后,查看的staff表格情况:


                    5)往表格中插入一些实验所需数据,须要插入两条,一个是员工lucy的,还有lili的:




            3、在MyEclips中创建项目并在项目中加入MySQL驱动程序:创建的项目类型能够是Java项目或者是Java Web项目都能够。这里创建的是Web项目,项目名称能够随便取,我命名为“JavaWebChp07”。创建成功后将步骤1里下载得到的MySQL驱动程序包(mysql-connector-java-5.1.18-bin.jar)加入到project的Build path中,加入过程如图所看到的:








            4、编写JDBC连接MySQL数据库的实例详细代码,JDBC_Test.java:



    详细代码:

    package chp07;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    public class JDBC_Test {
    	// 创建静态全局变量
    	static Connection conn;
    
    	static Statement st;
    
    	public static void main(String[] args) {
    		insert();	//插入加入记录
    		update();	//更新记录数据
    		delete();	//删除记录
    		query();	//查询记录并显示
    	}
    	
    	/* 插入数据记录,并输出插入的数据记录数*/
    	public static void insert() {
    		
    		conn = getConnection();	// 首先要获取连接,即连接到数据库
    
    		try {
    			String sql = "INSERT INTO staff(name, age, sex,address, depart, worklen,wage)"
    					+ " VALUES ('Tom1', 32, 'M', 'china','Personnel','3','3000')";	// 插入数据的sql语句
    			
    			st = (Statement) conn.createStatement();	// 创建用于运行静态sql语句的Statement对象
    			
    			int count = st.executeUpdate(sql);	// 运行插入操作的sql语句,并返回插入数据的个数
    			
    			System.out.println("向staff表中插入 " + count + " 条数据");	//输出插入操作的处理结果
    			
    			conn.close();	//关闭数据库连接
    			
    		} catch (SQLException e) {
    			System.out.println("插入数据失败" + e.getMessage());
    		}
    	}
    	
    	/* 更新符合要求的记录,并返回更新的记录数目*/
    	public static void update() {
    		conn = getConnection();	//相同先要获取连接,即连接到数据库
    		try {
    			String sql = "update staff set wage='2200' where name = 'lucy'";// 更新数据的sql语句
    			
    			st = (Statement) conn.createStatement();	//创建用于运行静态sql语句的Statement对象,st属局部变量
    			
    			int count = st.executeUpdate(sql);// 运行更新操作的sql语句,返回更新数据的个数
    			
    			System.out.println("staff表中更新 " + count + " 条数据");		//输出更新操作的处理结果
    			
    			conn.close();	//关闭数据库连接
    			
    		} catch (SQLException e) {
    			System.out.println("更新数据失败");
    		}
    	}
    
    	/* 查询数据库,输出符合要求的记录的情况*/
    	public static void query() {
    		
    		conn = getConnection();	//相同先要获取连接,即连接到数据库
    		try {
    			String sql = "select * from staff";		// 查询数据的sql语句
    			st = (Statement) conn.createStatement();	//创建用于运行静态sql语句的Statement对象,st属局部变量
    			
    			ResultSet rs = st.executeQuery(sql);	//运行sql查询语句,返回查询数据的结果集
    			System.out.println("最后的查询结果为:");
    			while (rs.next()) {	// 推断是否还有下一个数据
    				
    				// 依据字段名获取对应的值
    				String name = rs.getString("name");
    				int age = rs.getInt("age");
    				String sex = rs.getString("sex");
    				String address = rs.getString("address");
    				String depart = rs.getString("depart");
    				String worklen = rs.getString("worklen");
    				String wage = rs.getString("wage");
    				
    				//输出查到的记录的各个字段的值
    				System.out.println(name + " " + age + " " + sex + " " + address
    						+ " " + depart + " " + worklen + " " + wage);
    			
    			}
    			conn.close();	//关闭数据库连接
    			
    		} catch (SQLException e) {
    			System.out.println("查询数据失败");
    		}
    	}
    
    	/* 删除符合要求的记录,输出情况*/
    	public static void delete() {
    
    		conn = getConnection();	//相同先要获取连接,即连接到数据库
    		try {
    			String sql = "delete from staff  where name = 'lili'";// 删除数据的sql语句
    			st = (Statement) conn.createStatement();	//创建用于运行静态sql语句的Statement对象,st属局部变量
    			
    			int count = st.executeUpdate(sql);// 运行sql删除语句,返回删除数据的数量
    			
    			System.out.println("staff表中删除 " + count + " 条数据
    ");	//输出删除操作的处理结果
    			
    			conn.close();	//关闭数据库连接
    			
    		} catch (SQLException e) {
    			System.out.println("删除数据失败");
    		}
    		
    	}
    	
    	/* 获取数据库连接的函数*/
    	public static Connection getConnection() {
    		Connection con = null;	//创建用于连接数据库的Connection对象
    		try {
    			Class.forName("com.mysql.jdbc.Driver");// 载入Mysql数据驱动
    			
    			con = DriverManager.getConnection(
    					"jdbc:mysql://localhost:3306/myuser", "root", "root");// 创建数据连接
    			
    		} catch (Exception e) {
    			System.out.println("数据库连接失败" + e.getMessage());
    		}
    		return con;	//返回所建立的数据库连接
    	}
    }
    

    
    

    项目部署到server,然后执行结果:

    
    
    
    
    
    
    
  • 相关阅读:
    771. Jewels and Stones
    706. Design HashMap
    811. Subdomain Visit Count
    733. Flood Fill
    117. Populating Next Right Pointers in Each Node II
    250. Count Univalue Subtrees
    94. Binary Tree Inorder Traversal
    116. Populating Next Right Pointers in Each Node
    285. Inorder Successor in BST
    292. Nim Game Java Solutin
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/3786475.html
Copyright © 2011-2022 走看看