参考:https://zh.wikipedia.org/wiki/Java%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5
例子
利用Class.forName()方法来加载JDBC驱动程序(Driver)至DriverManager:
Class.forName( "com.somejdbcvendor.TheirJdbcDriver" );
然后,从DriverManager中,通过JDBC URL,用户名,密码来获取相应的数据库连接(Connection):
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true", // URL
"root", // 用户名
"root" ); // 密码
不同的JDBC驱动程序的URL是不同的,它永远以jdbc:
开始,但后面的内容依照驱动程序类型不同而各异。在获取Connection之后,便可以创建Statement用以运行SQL语句。下面是一个插入(INSERT)的例子:
Statement stmt = conn.createStatement();
stmt.executeUpdate( "INSERT INTO MyTable( name ) VALUES ( 'my name' ) " );
查询(SELECT)的结果存放于结果集(ResultSet)中,可以按照顺序依次访问:
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM MyTable");
while (rs.next()) {
int numColumns = rs.getMetaData().getColumnCount();
for (int i = 1; i <= numColumns; i++) {
// 与大部分Java API中下标的使用方法不同,字段的下标从1开始
// 当然,还有其他很多的方式(ResultSet.getXXX())获取数据
System.out.println("COLUMN " + i + " = " + rs.getObject(i));
}
}
rs.close();
stmt.close();
但是,通常,Java程序员们更倾向于使用PreparedStatement。下面的例子使用上例中的conn对象:
PreparedStatement ps = null;
ResultSet rs = null;
try {
// 使用问好作为参数的下标
ps = conn.prepareStatement("SELECT * FROM MyTable WHERE name = ?");
// 进行参数设置
// 与大部分Java API中下标的使用方法不同,字段的下标从1开始,1代表第一个问好
// 当然,还有其他很多针对不同类型的类似的PreparedStatement.setXXX()方法
ps.setString(1, "name1");
// 结果集
rs = ps.executeQuery();
while (rs.next()) {
int numColumns = rs.getMetaData().getColumnCount();
for (int i = 1; i <= numColumns; i++) {
// 与大部分Java API中下标的使用方法不同,字段的下标从1开始
// 当然,还有其他很多的方式(ResultSet.getXXX())获取数据
System.out.println("COLUMN " + i + " = " + rs.getObject(i));
}
}
} catch (SQLException e) {
// 异常处理
} finally { // 使用finally进行资源释放
try {
rs.close();
ps.close();
} catch (SQLException e) {
} // 异常处理:忽略close()时的错误
}
但是,通常,Java程序员们更倾向于使用PreparedStatement。下面的例子使用上例中的conn对象:
boolean autoCommitDefault = conn.getAutoCommit();
try {
conn.setAutoCommit(false);
/* 在此基于有事务控制的conn执行你的代码*/
conn.commit();
} catch (Throwable e) {
try {
conn.rollback();
} catch (Throwable ignore) {
}
throw e;
} finally {
try {
conn.setAutoCommit(autoCommitDefault);
} catch (Throwable ignore) {
}
}
完整例子
例子1
public class App {
public static void main( String[] args ) throws Exception {
// 1. 利用Class.forName()方法来加载JDBC驱动程序(Driver)至DriverManager
Class.forName("com.mysql.cj.jdbc.Driver");
// 2. 从DriverManager中,通过JDBC URL,用户名,密码来获取相应的数据库连接(Connection)
// 不同的JDBC驱动程序的URL是不同的,它永远以"jdbc:"开始,但后面的内容依照驱动程序类型不同而各异。在获取Connection之后,便可以创建
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true", // URL
"root", // 用户名
"root" ); // 密码
// 3. Statement用以运行SQL语句。下面是一个插入(INSERT)的例子
Statement stmt = conn.createStatement();
stmt.executeUpdate("INSERT INTO MyTable( name ) VALUES ( 'my name' ) ");
// 4. 查询(SELECT)的结果存放于结果集(ResultSet)中,可以按照顺序依次访问
ResultSet rs = stmt.executeQuery("SELECT * FROM MyTable");
while (rs.next()) {
int numColumns = rs.getMetaData().getColumnCount();
for (int i = 1; i <= numColumns; i++) {
// 与大部分Java API中下标的使用方法不同,字段的下标从1开始
// 当然,还有其他很多的方式(ResultSet.getXXX())获取数据
System.out.println("COLUMN " + i + " = " + rs.getObject(i));
}
}
rs.close();
stmt.close();
}
}
例子2
public class App2 {
public static void main( String[] args ) throws Exception {
// 1. 利用Class.forName()方法来加载JDBC驱动程序(Driver)至DriverManager
Class.forName("com.mysql.cj.jdbc.Driver");
// 2. 从DriverManager中,通过JDBC URL,用户名,密码来获取相应的数据库连接(Connection)
// 不同的JDBC驱动程序的URL是不同的,它永远以"jdbc:"开始,但后面的内容依照驱动程序类型不同而各异。在获取Connection之后,便可以创建
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true", // URL
"root", // 用户名
"root" ); // 密码
// 3. 通常,更倾向于使用PreparedStatement。下面的例子使用上例中的conn对象
PreparedStatement ps = null;
ResultSet rs = null;
try {
// 使用问好作为参数的下标
ps = conn.prepareStatement("SELECT * FROM MyTable WHERE name = ?");
// 进行参数设置
// 与大部分Java API中下标的使用方法不同,字段的下标从1开始,1代表第一个问好
// 当然,还有其他很多针对不同类型的类似的PreparedStatement.setXXX()方法
ps.setString(1, "name1");
// 结果集
rs = ps.executeQuery();
while (rs.next()) {
int numColumns = rs.getMetaData().getColumnCount();
for (int i = 1; i <= numColumns; i++) {
// 与大部分Java API中下标的使用方法不同,字段的下标从1开始
// 当然,还有其他很多的方式(ResultSet.getXXX())获取数据
System.out.println("COLUMN " + i + " = " + rs.getObject(i));
}
}
} catch (SQLException e) {
// 异常处理
} finally { // 使用finally进行资源释放
try {
rs.close();
ps.close();
} catch (SQLException e) {
} // 异常处理:忽略close()时的错误
}
}
}
例子3
public class App3 {
public static void main( String[] args ) throws Exception {
// 1. 利用Class.forName()方法来加载JDBC驱动程序(Driver)至DriverManager
Class.forName("com.mysql.cj.jdbc.Driver");
// 2. 从DriverManager中,通过JDBC URL,用户名,密码来获取相应的数据库连接(Connection)
// 不同的JDBC驱动程序的URL是不同的,它永远以"jdbc:"开始,但后面的内容依照驱动程序类型不同而各异。在获取Connection之后,便可以创建
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true", // URL
"root", // 用户名
"root" ); // 密码
// 3. 如果数据库操作失败,JDBC将抛出一个SQLException。一般来说,此类异常很少能够恢复,唯一能做的就是尽可能详细的打印异常日记。推荐的做法是将SQLException翻译成应用程序领域相关的异常(非强制处理异常)并最终回滚数据库和通知用户
// 一个数据库事务代码如下
boolean autoCommitDefault = conn.getAutoCommit();
try {
conn.setAutoCommit(false);
/* 在此基于有事务控制的conn执行你的代码*/
conn.commit();
} catch (Throwable e) {
try {
conn.rollback();
} catch (Throwable ignore) {
}
throw e;
} finally {
try {
conn.setAutoCommit(autoCommitDefault);
} catch (Throwable ignore) {
}
}
}
}