JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。
在使用getConn返回的mysql连接之前需要将JDBC连接mysql的驱动jar包添加到build path中。
如果要使用数据库就要添加数据库的驱动,不同的数据库有不用的驱动,本文主要介绍JDBC连接mysql的基本步骤和操作,用到的驱动为:
mysql-connector-java-XXX-bin.jar
创建连接
首先创建一个产生数据库连接的类,代码如下:
package db;
import java.sql.*;
public class Connector {
// Change the parameters accordingly.
private static String dbUrl = "jdbc:mysql://127.0.0.1:3306/dblp?useUnicode=true&characterEncoding=utf-8";
private static String user = "root";
private static String password = "123";
public static Connection getConn() {
try {
Class.forName("com.mysql.jdbc.Driver");
return DriverManager.getConnection(dbUrl, user, password);
} catch (Exception e) {
System.out.println("Error while opening a conneciton to database server: "
+ e.getMessage());
return null;
}
}
}
在使用getConn返回的mysql连接之前需要将JDBC连接mysql的驱动jar包添加到build path中。
使用示例
代码如下:
package test;
import java.sql.*;
import db.Connector;
public class TestConn {
public static void main(String[] args) throws SQLException {
// TODO Auto-generated method stub
Connection conn = Connector.getConn();
Statement stmt = conn.createStatement();
/*
* 执行静态sql语句
*/
//创建表
String sql = "create table student(stu_no char(20), stu_name varchar(20),primary key(stu_no))";
stmt.executeUpdate(sql);
String sql1= "INSERT INTO student(stu_no, stu_name)"
+ " VALUES ('2016001','tom')"; // 插入数据的sql语句
//executeUpdate返回受影响的行数,返回-1表示执行失败
stmt.executeUpdate(sql1);
String sql2 = "SELECT * FROM tb_user";
//ResultSet对象接收查询返回的结果,可对结果进行遍历
ResultSet rs = stmt.executeQuery(sql2);
while (rs.next()) {
System.out .println(rs.getString(1) + "\t" + rs.getString(2));// 入如果返回的是int类型可以用getInt()
}
/*
* 执行动态sql语句
*/
PreparedStatement pstmt = conn.prepareStatement("INSERT INTO student(stu_no, stu_name) VALUES (?, ?)");
pstmt.setString(1,"2016002");
pstmt.setString(2, "Jerry");
pstmt.executeUpdate();
/*
* 批处理
* 普通的执行过程是:每处理一条数据,就访问一次数据库;
* 而批处理是:累积到一定数量,再一次性提交到数据库,减少了与数据库的交互次数,所以效率会大大提高
* JDBC的批处理不能加入select语句,否则会抛异常.
*/
//关闭自动执行
conn.setAutoCommit(false);
//批处理
Statement bstmt = conn.createStatement();
bstmt.addBatch("INSERT INTO student(stu_no, stu_name) VALUES ('2016003','Jack')" );
bstmt.addBatch("INSERT INTO student(stu_no, stu_name) VALUES ('2016004','Marry')" );
bstmt.addBatch("INSERT INTO student(stu_no, stu_name) VALUES ('2016005','Jackson')" );
pstmt.executeBatch();
conn.commit();
//或者:
for(int i=0; i<10000; i++){
pstmt.setString(1, "2016"+i);
pstmt.setString(2, " abc"+i);
pstmt.addBatch();//添加到同一个批处理中
}
pstmt.executeBatch();//执行批处理
conn.commit();
conn.setAutoCommit(true);
//如果使用了addBatch() -> executeBatch()还是很慢,需要在数据库连接url后面加上参数 rewriteBatchedStatements=true (启动批处理操作)
// String dbUrl = "jdbc:mysql://127.0.0.1:3306/dblp?rewriteBatchedStatements=true";
/*
* 事务处理
* 事物是指一组原子操作,要么全部执行,要么一个都不执行
*/
//关闭自动提交
conn.setAutoCommit(false);
try{
/*
* 事物代码
*/
conn.commit();
}catch(Exception e){
conn.rollback();
e.printStackTrace();
}finally{
conn.close();
}
}
}