java使用jdbc对mysql数据库进行操作的步骤和代码
前言
java程序通过jdbc对mysql进行连接和操作的步骤,主要按照四个步骤:加载驱动、建立连接、创建声明、执行sql语句后的结果集。
1. 加载驱动
在取得连接之前,需要注册驱动程序。通过调用方法Class.forName,这将显式地加载驱动程序类,以下代码分别加载连接ODBC、MySQL、Oracle、SQLServer的驱动类:
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Class.forName("com.mysql.jdbc.Driver");
Class.forName("oracle.jdbc.driver.OracleDriver");
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
此处,本程序事例是使用mysql的驱动类:
try{
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e){
System.out.println("找不到驱动程序类,加载驱动失败!");
e.printStackTrace();
}
建立连接
JDBC URL
JDBC URL 提供了一种标识数据库的方法,可以是相应的驱动程序能识别该数据库并与之建立连接。JDBC URL的标准语法如下所示。它由三部分组成,各部分间用冒号分隔:
<协议 jdbc>:<子协议>:<子名称>
- <协议>: JDBC URL 中的协议总是jdbc
- <子协议>: 驱动程序名或数据库连接机制(这种机制可由一个或多个驱动程序支持)的名称。
- <子名称>:包含要连接数据库的名称、用户名、密码等信息。
以下代码分别是JDBC-ODBC桥、MySQL、Oracle、SQLServer的连接URL举例:
jdbc:odbc:TEST
jdbc:mysql://localhost/db?user=root&password=123&useUnicode=true&characterEncoding=utf-8
jdbc:oracle:thin:@localhost:1521:orcl //"oracle:thin"为连接子协议
jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs
取得Connection连接
通过驱动管理类DriverManager下面的getConnection方法获取数据库的连接对象:
DriverManager.getConnection(url, username, password)
代码示例
String url="jdbc:mysql://localhost:3306/demo";
String username = "root";
String password = "password";
Connection con = null;
try{
con = DriverManager.getConnection(url, username, password);
} catch (SQLException se) {
System.out.println("数据库连接失败!");
se.printStackTrace();
}
创建声明(Statement)
Statement对象用于将SQL语句发送到数据库中。实际上有三种Statement对象,都作为在给定连接上执行SQL语句的包容器:Statement、PreparedStatement(继承自Statement)和CallableStatement(继承自PreparedStatement)。他们都用于发送特定类型的SQL语句:Statement对象用于执行不带参数的简单SQL语句;PreparedStatement对象用于执行带或者不带IN参数的预编译SQL语句;CallableStatement对象用于执行对数据库已存储过程的调用。
Statement接口提供了执行语句和获取结果的基本方法。PreparedStatement接口添加了处理IN参数的方法;而CallableStatement添加了处理OUT参数的方法。
Statement对象
创建Statement对象
用Connection对象的createStatement方法创建,如下例代码:
Statement stmt = con.createStatement();
Statement对象的方法概览
- executeQuery: 用于产生单个结果集的语句,比如select语句。
- executeUpdate: 用于执行insert、update、delete语句以及SQL DL(数据定义语言)语句。executeUpdate的返回值为整数,指受影响的行数,对于
create table
和drop table
等不操作行的语句,返回值为0。 - execute:用于执行返回多个结果集、多个更新计数或两者组合的语句。
源码实例
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("select * from user");
while(rs.next()){
System.out.println(rs.getString(2)+" "+rs.getString("password")+" " + rs.getString(4));
}
ResultSetMetaData rsmd = rs.getMetaData();
System.out.println(rsmd.getColumnCount()+" "+rsmd.getTableName(2)+" "+rsmd.getColumnLabel(1));
// int rows = stmt.executeUpdate("insert into user values(2, 'user', 'user','user@qq.com')");
// System.out.println(rows);
if(rs!=null){
try{
rs.close();
} catch (SQLException e){
e.printStackTrace();
}
}
if(stmt!=null){
try{
stmt.close();
} catch (SQLException e){
e.printStackTrace();
}
}
PreparedStatement
创建及方法
创建:PreparedStatement pstmt = con.prepareStatement(sql)
方法:
pstmt.setString(int, "String")
pstmt.setInt(int, int)
示例代码
PreparedStatement pstmt = con.prepareStatement("update user set email=? where username like ?");
pstmt.setString(1,"cde@126.com");
pstmt.setString(2, "admin");
pstmt.executeUpdate();
pstmt.setString(2, "user");
pstmt.executeUpdate();
String[] userName = {"admin","user"};
String[] email = {"admin@163.com", "user@qq.com"};
int len = userName.length;
for(int i=0; i<len; ++i){
pstmt.setString(1, email[i]);
pstmt.setString(2, userName[i]);
int n = pstmt.executeUpdate();
System.out.println(n); // n = 1
// pstmt.executeUpdate("create table ...");
// System.out.println(n); // n = 0
}
执行sql语句后的结果集
ResultSet 基本处理方法
- ResultSet对象维持一个指向当前行的指针。next()方法返回值为布尔型,true代表当前指向行存在值,false代表没有下一行记录了,结果集已处理完毕。
- ResultSet对象获取列的值,通过getInt(column|column_name)或者getString(column|column_name)
示例代码
ResultSet rs = stmt.executeQuery("select * from user");
while(rs.next()){
System.out.println(rs.getString(2)+" "+rs.getString("password")+" " + rs.getString(4));
}
其他
ResultSetMetaData
代码事例:
ResultSetMetaData rsmd = rs.getMetaData();
System.out.println(rsmd.getColumnCount()+" "+rsmd.getTableName(2)+" "+rsmd.getColumnLabel(1));
参考文档
《开发突击者 Java Web 主流框架整合开发》p65
http://www.cnblogs.com/hongten/archive/2011/03/29/1998311.html