Java,使用JDBC访问数据库 - Angel's Blog.

ing
 
 
软件开发,程序设计,前端设计
 
 
首页 > code > Java,使用JDBC访问数据库

Java,使用JDBC访问数据库

 

 1)JDBC API:

JDBC API可以使用数据库的连接,发送SQL语句,处理结果;

其中这个流程中用到了一个类,三个接口:

DriverManager类:数据库的不同来管理JDBC驱动。

Connection接口:连接数据库与传诵数据。

Statement接口:执行SQL语句(由Connection产生,类似于c#的Connection)。

ResultSet接口:保存Statement执行后产生的查询结果(类似于c#的DataSet)。

2)JDBC程序的模板:

使用开发JDBC只需要记住这几个字:“加、连、语、执、释”。

加:加载:将JDBC放置到JMV中,在这里使用到了Class的静态方法.forName(),用来将指定的类加载到JMV中;

连:加载驱动&&数据库进行连接。这里就用到了DriverManager类:

 

Connection conn = DriverManager.getConnection('连接数据库的字符串' , '数据库用户名' , '数据库密码');

语:发送SQL语句,且得到一个结果集(C#中应该对应的上dataSet),也就是可以形容为一张虚拟的表;

 

Statement states = conn.createStatement();
ResultSet resultS = states.executeQuery("select x , y , z from Mytable");

执:使用ResultSet对象的next()将cursor指向下一行。如果达到结果集的末尾处,将返回false退出while循环。

 

while(results.next())
{
	String firstWord = results.getString("x");
	int secondWord = results.getInt("y");
	String thirdWord = results.getString("z");
}

释:释放资源和开销,关闭数据库的连接。

3)JDBC驱动:

Java驱动方式:

JDBC-ODBC bridge连接:

 4)Java驱动方式的常用连接代码(对应的各种数据库):

SQL2005:

String driver="com.microsoft.sqlserver.jdbc.SQLServerDriver";
Class.forName(driver);
Connection con=DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=master","sa","");

Oracle:

Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
String url="jdbc:oracle:thin:@localhost:1521:orcl"; //orcl:数据库的SID
String user="test";
String password="test";
Connection conn= DriverManager.getConnection(url,user,password); 

DB2:

Class.forName("com.ibm.db2.jdbc.app.DB2Driver ").newInstance();
String url="jdbc:db2://localhost:5000/sample"; //sample:数据库名
String user="admin";
String password="";
Connection conn= DriverManager.getConnection(url,user,password); 

MySQL:

Class.forName("org.gjt.mm.mysql.Driver").newInstance();
String url ="jdbc:mysql://localhost/myDB?user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1" //myDB:数据库名
Connection conn= DriverManager.getConnection(url); 

5)Statement接口常用的对数据库操作的方法:

ResultSet executeQuery(String sql);//执行SQL查询&&get到Result对象;

int executeUpdate(String sql)://执行非查询的操作(增(insert)删(delete)改(update));

boolean execute(String sql)://执行任意的SQL语句,get一个boolean类型的值,用来表示是否返回ResultSet。

PreparedStatement的使用(在这里,以SQL2005为demo):

demo(这里已经将和数据库打交道的静态方法提取到ConnectionManager类中,类似于c#的dbhelper类):

先在SQL Server创建数据库和对应的表:

create database MyJava
go
use MyJava
go
create table JavaName
(
	ID int not null ,
	NickName varchar(50) not null ,
	Hobby varchar(50) not null
)
go
--设置primary key
alter table JavaName
add constraint PK_ID primary key (ID)
go

--添加两行数据
insert into JavaName values(1 , '小明' , '123')
go
insert into JavaName values(2 , 'Angel' , '44')
go

写一个ConnectionManager类:

import java.sql.*;

public class ConnectionManager
{
	private static final String DRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
	private static final String DATABASE_STRING = "jdbc:sqlserver://localhost:1433;DatabaseName=MyJava";
	private static final String USER = "sa";
	private static final String PWD = "";

	/**
	 * 创建数据库的连接
	 * @return
	 */
	public static Connection getConnection()
	{
		Connection dbconn = null;
		try
		{
			Class.forName(DRIVER);
			dbconn = DriverManager.getConnection(DATABASE_STRING , USER , PWD);
		}
		catch (Exception e)
		{
			// TODO: handle exception
			e.printStackTrace();
		}
		return dbconn;
	}
	/**
	 * 关闭数据库的连接
	 * @param dbconn
	 */
	public static void closeConnection(Connection dbconn)
	{
		try
		{
			if (dbconn != null && (!dbconn.isClosed()))
			{
				dbconn.close();
			}
		}
		catch (SQLException e)
		{
			// TODO: handle exception
			e.printStackTrace();
		}
	}
	/**
	 * 关闭ResultSet集
	 * @param rs
	 */
	public static void closeResultSet(ResultSet rs)
	{
		try
		{
			if (rs != null)
			{
				rs.close();
				rs = null;
			}
		}
		catch (SQLException e)
		{
			// TODO: handle exception
			e.printStackTrace();
		}
	}
	/**
	 * 关闭Statement对象
	 * @param ps
	 */
	public static void closeStatement(PreparedStatement ps)
	{
		try
		{
			if (ps != null)
			{
				ps.close();
				ps = null;
			}
		}
		catch (SQLException e)
		{
			// TODO: handle exception
			e.printStackTrace();
		}
	}

}

接下来使用“PreparedStatement”进行增删改的操作(查询的操作就不写了):

import java.sql.*;

public class PreparedStatementInsert
{
	public static void main(String[] args)
	{
		Connection conn = null;
		PreparedStatement ps = null;
//		/**
//		 * PreparedStatement的插入操作.
//		 */
//		try
//		{
//			conn = ConnectionManager.getConnection();
//			String strSql = "insert into JavaName values(? , ? , ?)";
//			ps = conn.prepareStatement(strSql);
//			ps.setInt(1, 3);
//			ps.setString(2, "hiahia");
//			ps.setString(3, "eee");
//			ps.executeUpdate();
//		}
//		/**
//		 * PreparedStatement的删除操作.
//		 */
//		try
//		{
//			conn = ConnectionManager.getConnection();
//			String strSql = "delete from JavaName where NickName = ?";
//			ps = conn.prepareStatement(strSql);
//			ps.setString(1, "Angel");
//			int rows = ps.executeUpdate();
//			System.out.println("Already delete" + rows + " of datas!" );
//		}
		/**
		 * PreparedStatement的更新操作.
		 */
		try
		{
			conn = ConnectionManager.getConnection();
			String strSql = "update JavaName set NickName = ? where id = ?";
			ps = conn.prepareStatement(strSql);
			ps.setString(1, "AngelUpdate");
			ps.setInt(2, 1);
			int rows = ps.executeUpdate();
			System.out.println("Already update" + rows + " of datas.");
		}

		catch (SQLException e)
		{
			// TODO: handle exception
			e.printStackTrace();
		}
		finally
		{
			ConnectionManager.closeStatement(ps);
			ConnectionManager.closeConnection(conn);
		}
	}
}

可以看得出,PreparedStatement接口的灵活性。

或者通过RSS 关注本站的更新 ^ O ^ 。” —  by  转载请注明:来自 Angel's Blog.
本文永久链接: http://www.0ee.com/2011/01/11/use-java-database-connectivity-to-control-database.html
 
分类: code标签: , ,
 
  • QQ书签
  • Del.icio.us
  • 百度收藏
  • Google
  • 饭否
  • FriendFeed
 

 
评论 (17) Trackbacks (0)
发表评论 Trackback
 
17 Comments Contributed by Visitors
  1.     等待思索 2011年1月23日02:45 11#

    不管了,送IP了!!

  2.     Angel 2011年1月23日05:34 12#

    @鸣
    嘿嘿,,最近都一直没搞学习。。。:)

  3.     Angel 2011年1月23日05:36 13#

    @等待思索
    嘿嘿,,内牛满面。。。

  4.     vastar 2011年1月23日08:20 14#

    果然开始java了啊。。。我沉默的支持~

  5.     Angel 2011年1月24日05:19 15#

    @vastar
    感谢支持哈;
    唉..我呢,放假回家除了吃还是吃,,要么就是睡觉= =!好几天没写code了..

  6.     littletheif 2011年6月22日02:42 16#

    曾经尝试用JDBC连接SQL数据库,一直没连上。纠结一个多月,最后发现要打SP补丁。 emotion

  7.     Mucid 2011年1月18日03:30 17#

    不知道orcal有木linux版呵呵 ok 我回家啦

Leave Comments Here...

:) :-D :( :-o 8-O :-? 8) lol :-x :-P oops cry evil twisted wink ? idea :-| arrow mrgreen roll !

(required)

(required)

网址随您("http://"可以省略)

(Ctrl+Enter)

  • 本站不会泄露您的 Email 地址, 敬请放心.
  • 本站已开启缓存, 请不要重复提交评论.
  • 请注意: 带有 《广告(链)、不健康、或者 产品名字》 的评论一律视为spam.
  • 支持常用 HTML 标签调用, 插入 HTML 标签需注意: < == &lt;> == &gt;.
  • 仅当某人针对您的评论做出回应时, 您才会收到由本站发出的邮件通知.
  • 如您希望以相同方式通知某位网友, 请点击  按钮进行回复.
  • 允许在评论中使用如下代码: 
    <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> 
    <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> 
    .
  • 鼠标悬浮到评论中的 @someone 区域即可自动显示 someone 的评论内容.
 
 
  • 正在加载...