JDBC
2020-09-03 本文已影响0人
奥利夫羊
JDBC
Java连接步骤
// 1. 加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 2. 用户信息和数据库地址
// useUnicode=true&characterEncoding=utf8&useSSL=true
String url = "jdbc:mysql://localhost:3306/shop?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC";
String username = "root";
String password = "123456";
// 3. 获取数据库对象
Connection connection = DriverManager.getConnection(url,username,password);
// 4. 执行SQL的对象
Statement statement = connection.createStatement();
// 5. 获得结果
String sql = "SELECT * FROM account";
ResultSet resultSet = statement.executeQuery(
sql
);
while (resultSet.next()) {
System.out.println("id:" + resultSet.getObject("id"));
System.out.println("name:" + resultSet.getObject("name"));
System.out.println("cash:" + resultSet.getObject("cash"));
}
System.out.println(resultSet);
// 6. 释放连接
resultSet.close();
statement.close();
connection.close();
-
加载驱动
加载驱动方法:
Class.forName("com.mysql.cj.jdbc.Driver");
//Dirver类里面只有一个静态代码块,在加载的时候自动通过DriverManager注册了驱动 public class Driver extends NonRegisteringDriver implements java.sql.Driver { public Driver() throws SQLException { } static { try { DriverManager.registerDriver(new Driver()); } catch (SQLException var1) { throw new RuntimeException("Can't register driver!"); } } }
-
用户信息和数据库地址
连接URL
MySQL jdbc:mysql://(数据库地址):3306/(数据库)参数=值&参数=值&...
Oracle jdbc:oracle:thin@(数据库地址):1521/(数据表)
常用URL
useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=UTC
-
获取数据库对象
Connection connection = DriverManager.getConnection(url,username,password);
获得连接对象,
Connection
代表数据库connection.setAutoCommit(); // 设置自动提交 connection.commit(); // 提交 connection.rollback(); // 回滚
-
执行SQL的对象
Statement
执行SQL的对象Statement statement = connection.createStatement();
PrepareStatement
执行SQL的对象PrepareStatement prepareStatement = connection.prepareStatement()
// Statement的用法 statement.executeQuery(); // 查询操作,返回ResultSet statement.execute(); // 执行任何SQL,返回执行的结果boolean statement.executeUpdate(); // 更新插入删除,返回一个受影响的行数 statement.executeBatch() // 执行一系列的SQL // 使用executeQuery操作增删改操作报错:Can not issue data manipulation statements with executeQuery().
PrepareStatement的用法(效率更高,可以防止SQL注入,转义字符直接被转义) String sql = "INSERT INTO ACCOUNT(`name`,`cash`) VALUES(?,?)"; // 使用问号占位符代替参数 PrepareStatement prepareStatement = connection.prepareStatement(sql) // 预编译SQL preparedStatement = conn.prepareStatement(sql); preparedStatement.setString(1,"yhq"); preparedStatement.setBigDecimal(2,new BigDecimal(1000.00)); preparedStatement.executeUpdate(); // 无需参数,其它查询同Statement
-
获得结果
ResultSet类 // 是查询获得的结果集合 resultSet.getObject() // 在不知道类型的情况下使用 resultSet.afterLast() // 移动到最后面 resultSet.beforeFirst() // 移动到最前面 resultSet.next() // 移动到下一个 resultSet.previous() // 移动到上一个 resultSet.absolute(row) // 移动到指定行
-
释放连接
resultSet.close(); statement.close(); connection.close();
-
操作事务
connection.setAutoCommit(false); //关闭自动提交,自动开启事务 connection.commit(); // 默认不成功回滚,也可以在catch里面显式定义
try {
conn = JdbcUtils.getConnection();
conn.setAutoCommit(false); //关闭自动提交,自动开启事务
// 数据库操作逻辑代码
conn.commit();
} catch (Exception e) {
// 默认回滚
e.printStackTrace();
try { //显式定义回滚
conn.rollback();
} catch (Exception e2) {
e2.printStackTrace();
}
} finally {
释放资源;
}
```
-
数据库连接池
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。
-
连接池实现了
DataSource
接口 -
开源数据源实现:
DBCP
、C3P0
、Druid
-
使用连接池之后,开发中就不需要写连接服务代码了
-