Java数据库连接

参考: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) {
			}
		}
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值