jdbc连接mysql数据库与mysql jdbc操作实例

发布时间:2020-04-06编辑:脚本学堂
jdbc连接mysql数据库的方法详解,加载合适的jdbc驱动程序,建立数据库连接,创建statement对象,获得结果集中结构信息,不了解的朋友参考下。

前期准备:安好jdk,myeclipse。

下载jdbc驱动mysql-connector-java-5.0.5-bin.jar导入到工程中去

1、工程(右键)--buildpath--configure build path--add external jars。

2、 也可以加到classpath中去,具体如下:“我的电脑”-> “属性” ->“高级” -> “环境变量”,在系统变量那里编辑classpath,将d:mysql-connector-java-5.0.5mysql- connector-java-5.0.5-bin.jar加到最后,在加这个字符串前要加“;”,以与前一个classpath区分开,然后确定。


测试代码:
所用驱动 mysql-connector-java-5.0-nightly-20071116-bin.jar

程序中引用必要的包:import java.sql.*;  //它包含有操作数据库的各个类与接口


1、加载合适的jdbc驱动程序
 

class.forname(driver);
mysql驱动程序:com.mysql.jdbc.driver
oracle驱动程序:oracle.jdbc.driver.oracledriver
sqlserver驱动程序:
com.microsoft.jdbc.sqlserver.sqlserverdriver

2、建立数据库连接

mysql数据库连接的方法:

connection con=drivermanager.getconnection(“jdbc:mysql://主机ip或主机名:3306/数据库名”,用户名,密码);

java.sql.drivemanager  用来处理装载驱动程序并且为创建新的数据库连接提供支持;

–java.sql.connection  用于完成对特定定数据库的连接;

–java.sql.statement  用于对特定的数据库执行sql语句;java.sql.statement又包含了以下两个重要的子类型:

java.sql.preparedstatement  用于执行预编译的sql语句;

java.sql.callablestatement  用于执行数据库中存储的过程的调用;

--java.sql.resultset  用于保存查询所得的结果集


3、创建statement对象

statement  st=con.createstatement();  //最后可以不关闭,但推荐关闭

利用statement对象可以执行静态sql语句,静态sql语句可以是select语句、delete语句、update语句和insert语句。

执行sql语句

statement接口提供了三种执行sql语句的方法:executequery()、executeupdate() 和execute()。具体使用哪一个方法由sql语句本身来决定。

方法 executequery 用于产生单个结果集的语句,例如 select 语句等。

方法 executeupdate 用于执行insert、update或delete 语句以及sql ddl(数据定义语言)语句,例如 create table 和 drop table。insert、update 或delete 语句的效果是修改表中零行或多行中的一列或多列。executeupdate 的返回值是一个 整数,指示受影响的行数(即更新计数)。对于 create table 或drop table 等不操作行的语句,executeupdate 的返回值总为零。


方法 execute 用于执行返回多个结果集、多个更新计数或二者组合的语句。一般不会需要该高级功能。

①jdbc在编译时并不对将要执行的sql查询语句作任何检查,只是将其作为一个string类对象,直到驱动程序执行sql查询语句时才知道其是否正确。对于错误的sql查询语句,在执行时将会产生 sqlexception。


②一个statement对象在同一时间只能打开一个结果集,对第二个结果集的打开隐含着对第一个结果集的关闭。


③如果想对多个结果集同时操作,必须创建出多个statement对象,在每个statement对象上执行sql查询语句以获得相应的结果集。


④如果不需要同时处理多个结果集,则可以在一个statement对象上顺序执行多个sql查询语句,对获得的结果集进行顺序操作。

str="insertinto customer values('wangyang',24,'beijing','wangyang@sina.com')";

int  recordnumber=st.executeupdate(str);执行executeupdate()方法返回该sql语句涉及的记录数。

str="select* from mycustomer";   //查询表中记录

resultset rs=st.executequery(str); 由于sql语句是select,用executequery()方法,返回一个结果集保存在resultset对象rs中。


4、分析resultset对象

① 执行完毕sql语句后,将返回一个resultset类的对象,它包含所有的查询结果。但对resultset类的对象方式依赖于光标(cursor)的 类型,而对每一行中的各个列,可以按任何顺序进行处理(当然,如果按从左到右的顺序对各列进行处理可以获得较高的执行效率);

resultset类中的course方式主要有:

resultset.type_forward_only(为缺省设置):光标只能前进不能后退,也就是只能从第一个一直移动到最后一个。

resultset.type_scroll_sensitive:允许光标前进或后退并感应到其它resultset的光标的移动情形。

resultset.type_scroll_insensitive:允许光标前进或后退并不能感应到其它resultset的光标的移动情形。

resultset类中的数据是否允许修改主要有:

resultset.concur_read_only(为缺省设置):表示数据只能只读,不能更改。

resultset.concur_updatable:表示数据允许被修改。

可以在创建statement或preparedstatement对象时指定resultset的这两个特性。

statement stmt=con.createstatement(resultset.type_forward_only,resultset.concur_read_only);

preparedstatement pstmt=con.preparestatement("insert into booktable values (?,?,?)",resultset.type_scroll_insensitive,resultset.concur_updatable);

② resultset类的对象维持一个指向当前行的指针,利用resultset类的next()方法可以移动到下一行(在jdbc中,java程序一次只 能看到一行数据),如果next()的返回值为false,则说明已到记录集的尾部。另外jdbc也没有类似odbc 的书签功能的方法。

③ 利用resultset类的getxxx()方法可以获得某一列的结果,其中xxx代表jdbc中的java数据类型,如 getint()、getstring()、getdate()等。访问时需要指定要检索的列(可以采用 int值作为列号(从1开始计数)或指定列(字段)名方式,但字段名不区别字母的大小写)。


例子:

while(rs.next()){

int id=rs.getint("id");

string name=rs.getstring("cname");

int age=rs.getint("cage");

string address=rs.getstring("caddress");

string email=rs.getstring("cemail");

system.out.println(id+" "+name+" "+age+" "+address+" "+email);

}

获得结果集中结构信息:
利用resultset类的getmetadata()方法来获得结果集中的一些结构信息(主要提供用来描述列的数量、列的名称、列的数据类型。利用resulsetmetadata类中的方法)。

resultsetmetadata  rsmd=rs.getmetadata();

rsmd.getcolumncount();   //返回结果集中的列数

rsmd.getcolumnlabel(1); //返回第一列的列名(字段名)


例子:
 

复制代码 代码示例:

statement stmt=con.createstatement();

resultset rs=stmt.executequery("select * from tablename");

for(int i=1; i<=rs.getmetadata().getcolumncount(); i++) //跟踪显示各个列的名称

{ system.out.print(rs. getcolumnname (i)+"t");

}

while(rs.next())

{ //跟踪显示各个列的值

for(int j=1; j<=rs.getmetadata().getcolumncount(); j++)

{ system.out.print(rs.getobject(j)+"t");

}

}

5、关闭连接

(注意关闭的顺序) 例:

rs.close();

st.close();

con.close()


6、jdbc的常用api


一、connection接口:

1.createstatement():创建数据库连接

2.preparestatement(stringsql):创建预处理语句

3.preparecall(stringsql):创建可调用语句

4.getautocommit():获取自动提交的模式

5.setautocommit():设置自动提交的模式

6.commit():提交所执行的sql语句

7.rollback():回滚所执行的sql语句

8.getmetadata():获取一个databasemetadata对象,该对象包含了有关数据库的基本信息

9.close():关闭数据库连接

10.isclose():判断数据库连接是否超时或被显示关闭


二、statement接口:

1.execute(stringsql):执行sql语句,如果返回值是结果集则为true,否则为false

2.executequery(stringsql):执行sql语句,返回值为resultset

3.executeupdate(stringsql):执行sql语句,返回值为所影响的行数

4.addbatch(stringsql):向当前statement对象的命令列表中添加新的批处理sql语句

5.clearbatch():清空当前statement对象的命令列表

6.executebatch():执行当前statement对象的批处理语句,返回值为每个语句所影响的函数数组

7.getconnection():返回创建了该statement对象的connection对象

8.getquerytimeout():获取等待处理结果的时间

9.setquerytimeout():设置等待处理结果的时间


三、resultset接口:

1.first()/beforefirst():将游标移动到resultset中第一条记录(的前面)

2.last()/afterlast():将游标移动到resultset中最后一条记录(的后面)

3.absolute(intcolumn):将游标移动到相对于第一行的指定行,负数则为相对于最后一条记录

4.relative(introws):将游标移动到相对于当前行的第几行,正为向下,负为向上

5.next():将游标下移一行

6.previous():将游标上移一行

7.insertrow():向当前resultset和数据库中被插入行处插入一条记录

8.deleterow():将当前resultset中的当前行和数据库中对应的记录删除

9.updaterow():用当前resultset中已更新的记录更新数据库中对应的记录

10.cancelupdate():取消当前对resultset和数据库中所做的操作

11.findcolumn(stringcolumnname):返回当前resultset中与指定列名对应的索引

12.getrow():返回resultset中的当前行号

13.refreshrow():更新当前resultset中的所有记录

14.getmetadata():返回描述resultset的resultsetmetadata对象

15.isafterlast():是否到了结尾

16.isbeforefirst(): 是否到了开头

17.isfirst():是否第一条记录

18.islast(): 是否最后一条记录

19.wasnull():检查列值是否为null值,如果列的类型为基本类型,且数据库中的值为0,那么
由于数据库null也返回0,所以0值和数据库的null不能区分。如果列的类型为对象,可以简单地将返回值与null比较

20.close():关闭当前resultset


四、resultsetmetadata接口:

1.getcolumncount():返回resultset中列的数目

2.getcolumnname():返回列在数据库中的名称

3.getcolumntype():返回列的sql类型

4.isreadonly():表示该数据项是否为只读值

5.isnullable():表示该列是否可以存储null


例子:
 

复制代码 代码示例:

import java.sql.*;

public class jdbctest {

public static void main(string[] args){

// 驱动程序名
string driver = "com.mysql.jdbc.driver";

// url指向要访问的数据库名scutcs
string url = "jdbc:mysql://127.0.0.1:3306/test";

// mysql配置时的用户名
string user = "root";

// mysql配置时的密码
string password = "123456";

try {
// 加载驱动程序
class.forname(driver);

// 连续数据库
connection conn = drivermanager.getconnection(url, user, password);

if(!conn.isclosed())
system.out.println("succeeded connecting to the database!");

// statement用来执行sql语句
statement statement = conn.createstatement();

// 要执行的sql语句
string sql = "select * from pet";

// 结果集
resultset rs = statement.executequery(sql);

system.out.println("-----------------");


string name = null;

while(rs.next()) {

// 选择sname这列数据
name = rs.getstring("name");

// 使用iso-8859-1字符集将name解码为字节序列并将结果存储新的字节数组中。
// 使用gb2312字符集解码指定的字节数组
name = new string(name.getbytes("iso-8859-1"),"gb2312");

// 输出结果
system.out.println(rs.getstring("id") + "t" + name);
}

rs.close();
conn.close();

} catch(classnotfoundexception e) {


system.out.println("sorry,can`t find the driver!");
e.printstacktrace();


} catch(sqlexception e) {


e.printstacktrace();


} catch(exception e) {


e.printstacktrace();


}
}
}

效果:
java jdbc连接mysql数据库