博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java连接数据库
阅读量:6639 次
发布时间:2019-06-25

本文共 7296 字,大约阅读时间需要 24 分钟。

hot3.png

创建一个以JDBC连接数据库的程序,包含7个步骤:

1、加载JDBC驱动程序:

在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机),这通过java.lang.Class类的静态方法forName(String className)实现。

例如:

try{   	//加载MySql的驱动类   	Class.forName("com.mysql.jdbc.Driver") ;   }catch(ClassNotFoundException e){   	System.out.println("找不到驱动程序类 ,加载驱动失败!");   	e.printStackTrace();  }

成功加载后,会将Driver类的实例注册到DriverManager类中。

2、提供JDBC连接的URL

• 连接URL定义了连接数据库时的协议、子协议、数据源标识。

• 书写形式:协议:子协议:数据源标识
协议:在JDBC中总是以jdbc开始
子协议:是桥连接的驱动程序或是数据库管理系统名称。
数据源标识:标记找到数据库来源的地址与连接端口。
例如:(MySql的连接URL)

jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=gbk;

useUnicode=true:表示使用Unicode字符集。如果characterEncoding设置为gb2312或GBK,本参数必须设置为true 。characterEncoding=gbk:字符编码方式。

3、创建数据库的连接

•要连接数据库,需要向java.sql.DriverManager请求并获得Connection对象,该对象就代表一个数据库的连接。

•使用DriverManager的getConnectin(String url , String username , String password )方法传入指定的欲连接的数据库的路径、数据库的用户名和密码来获得。

例如:

//连接MySql数据库,用户名和密码都是root   String url = "jdbc:mysql://localhost:3306/test" ;    String username = "root" ;   String password = "root" ;   try{   	Connection con =    	DriverManager.getConnection(url , username , password ) ;   }catch(SQLException se){   	System.out.println("数据库连接失败!");   	se.printStackTrace() ;   }

4、创建一个Statement

•要执行SQL语句,必须获得java.sql.Statement实例,Statement实例分为以下3

种类型:
1、执行静态SQL语句。通常通过Statement实例实现。
2、执行动态SQL语句。通常通过PreparedStatement实例实现。
3、执行数据库存储过程。通常通过CallableStatement实例实现。
具体的实现方式:

Statement stmt = con.createStatement() ;   PreparedStatement pstmt = con.prepareStatement(sql) ;   CallableStatement cstmt =    con.prepareCall("{CALL demoSp(? , ?)}") ;

5、执行SQL语句

Statement接口提供了三种执行SQL语句的方法:executeQuery 、executeUpdate和execute

1、ResultSet executeQuery(String sqlString):执行查询数据库的SQL语句,返回一个结果集(ResultSet)对象。
2、int executeUpdate(String sqlString):用于执行INSERT、UPDATE或DELETE语句以及SQL DDL语句,如:CREATE TABLE和DROP TABLE等
3、execute(sqlString):用于执行返回多个结果集、多个更新计数或二者组合的语句。
具体实现的代码:

ResultSet rs = stmt.executeQuery("SELECT * FROM ...") ;   int rows = stmt.executeUpdate("INSERT INTO ...") ;   boolean flag = stmt.execute(String sql) ;

6、处理结果

两种情况:

1、执行更新返回的是本次操作影响到的记录数。
2、执行查询返回的结果是一个ResultSet对象。
• ResultSet包含符合SQL语句中条件的所有行,并且它通过一套get方法提供了对这些
行中数据的访问。
• 使用结果集(ResultSet)对象的访问方法获取数据:

while(rs.next()){   	String name = rs.getString("name") ;   	String pass = rs.getString(1) ; // 此方法比较高效   }(列是从左到右编号的,并且从列1开始)

7、关闭JDBC对象

操作完成以后要把所有使用的JDBC对象全都关闭,以释放JDBC资源,关闭顺序和声

明顺序相反:
1、关闭记录集
2、关闭声明
3、关闭连接对象

if(rs != null){   // 关闭记录集   	try{   		rs.close() ;   	}catch(SQLException e){   		e.printStackTrace() ;   	}   }   if(stmt != null){   // 关闭声明   	try{   		stmt.close() ;   	}catch(SQLException e){   		e.printStackTrace() ;   	}   }   if(conn != null){  // 关闭连接对象   	try{   		conn.close() ;   	}catch(SQLException e){   		e.printStackTrace() ;   	}   }

---------------------------------分割线---------------------------------

一、如何通过JDBC访问数据库

JDBC:Java DataBase Connectivity数据库连接用于在java程序中实现操作数据库。一般步骤如下:

加载JDBC驱动器。将数据库的JDBC驱动加载到classPath,web工程的一般放大WEB-INF/lib/下,java工程项目的则用build path将jar包导进去。

加载JDBC驱动,并将其注册到DriverManager中,一般使用反射Class.forName(String driveName).
简历数据库连接,取得Connection对象。一般通过Driver.getConnection(url,username,password)方法实现。
建立Statement对象或是PreparedStatement对象。
执行SQL语句
访问结果集ResultSet
依次将ResultSet、Statement、PreparedStatement、Connection对象关闭,释放掉所占用的资源。
实例代码如下:

首先创建一张表:

create tabel Employee(	id int primarykey,	name varchar(20),	age int);

示例程序:

import java.sql.*; public class Test{ 	public static void main(String args[]){	 		String user = "user1";		String password = "pwd";		String url = "jdbc:mysql://127.0.0.1:3306/Test";		String driver = "com.mysql.jdbc.Driver";		Connection con = null;		Statement stmt = null;		ResultSet rs = null;		 		try{			Class.forName(driver);			con=DriverManager.getConnection(url,user,password);			stmt=con.createStatement();			stmt.execute("insert into Employee values(1,'James1',36)");			rs=stmt.executeQuery("select * from Employee");			while(rs.next()){				System.out.println(rs.getInt(1)+""+rs.getString(2)+""+rs.getInt(3));			}		}catch(SQLException e){			System.out.println(e.getMessage());		}finally{			try{				if(rs!=null) rs.close();				if(stmt!=null) stmt.close();				if(con!=null) con.close();				 			}catch(SQLException =e){				System.out.println("fe:"+e.getMessage());			}		}	}}

二、Statement、PreparedStatement和CallableStatement的区别

Statement一般用于执行不带参数的SQL语句,并返回生成的结果,每次执行SQL语句时,数据库都要编译该SQL语句。

PerparedStatement表示 与的SQL语句对象,用于执行带参数的SQL语句。效率高、安全性好、代码可读性和可维护性好。(推荐使用)
CallableStatement用来调用数据库中存储过程的接口,如果有输出参数要注册,说明是输出参数。
举例说明PreparedStatement:

 

import java.sql.*; public class Test{ 	public static void main(String args[]){		String user="user1";		String password="pwd";		String url="jdbc:mysql://127.0.0.1:3306/Test";		String driver="com.mysql.jdbc.Driver";		Connection con=null;		PreparedStatement ps=null;		ResultSet rs=null;		 		try{			Class.forName(driver);			con=DriverManager.getConnection(url,user,password);			ps=con.preparedStatement("select * from Emloyee where id=?");			ps.setInt(1,1);			rs=ps.executeQuery();			while(rs.next()){				System.out.println(rs.getInt(1)+""+rs.getString(2)+""+rs.getInt(3));			}		}catch(SQLException e){			System.out.println(e.getMessage());		}finally{			try{				if(rs!=null)rs.close();				if(ps!=null)ps.close();				if(con!=null)con.close();			}catch(SQLException fe){				System.out.println("fe:"+fe.getMessage());			}		}	}}

三、getString()方法和getObject()方法有什么区别

在数据量很大的时候直接调用ResultSet方法的getString、getInt、getData方法会抛出异常:OrcaleException。此时应该使用getObject方法。因为其他方法会将查询结果都加载到内存中,如果数据量超过内存上限,则会导致异常。

四、JDBC与Hibernate有什么区别

Hibernate是JDBC的封装。采用配置文件的形式将数据库连接参数写到XML文件中。(下次再研究Hibernate)

package com.test; import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;/** * * @author Hongten
* @date 2012-7-16 * */public class JDBCTest { public static void main(String[] args) { String driver = "com.mysql.jdbc.Driver"; String dbName = "spring"; String passwrod = "root"; String userName = "root"; String url = "jdbc:mysql://localhost:3308/" + dbName; String sql = "select * from users"; try { Class.forName(driver); Connection conn = DriverManager.getConnection(url, userName, passwrod); PreparedStatement ps = conn.prepareStatement(sql); ResultSet rs = ps.executeQuery(); while (rs.next()) { System.out.println("id : " + rs.getInt(1) + " name : " + rs.getString(2) + " password : " + rs.getString(3)); } // 关闭记录集 if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } // 关闭声明 if (ps != null) { try { ps.close(); } catch (SQLException e) { e.printStackTrace(); } } // 关闭链接对象 if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } catch (Exception e) { e.printStackTrace(); } } }

 

原文链接

转载于:https://my.oschina.net/u/2935389/blog/754668

你可能感兴趣的文章
canvas动画—圆形扩散、运动轨迹
查看>>
HTML状态码收集(301,404,500等)
查看>>
云时代的开源软件收入模式
查看>>
ARKit 2推出共享体验
查看>>
Oracle即将发布的全新Java垃圾收集器 ZGC
查看>>
Gremlin发布面向混沌实验的应用级故障注入(ALF)平台
查看>>
有赞搜索系统的架构演进
查看>>
More than React(五)异步编程真的好吗?
查看>>
Mads Torgersen介绍C# 7及后续版本新特性
查看>>
区块链和数据科学:如果同时应用这两种技术,将会实现什么?
查看>>
分布式系统关注点:99%人看得懂的“熔断”以及最佳实践
查看>>
非泄露,NSA官方开源反汇编工具GHIDRA
查看>>
《Storm技术内幕与大数据实践》作者陈敏敏谈大数据技术在电商领域的应用
查看>>
前端工程师必读的10篇精选技术文章
查看>>
微软发布VSBT:无需安装Visual Studio即可实现项目编译
查看>>
jQuery 3.3.1已经发布,开发团队正在准备4.0版本
查看>>
云端能力知几许?12人众测华为云企业级Kubernetes集群实力
查看>>
AWS再迎大师加盟:Java之父James Gosling决定效力
查看>>
iOS遗留系统重构实践
查看>>
虚拟主播上线:多模态将改变人机交互的未来
查看>>