1. 通过代码操作数据库的基本流程
- 实际开发中,数据库操作很少直接用命令行或图形化客户端。
- 更多场景是通过代码(C++、Java、Python、Go等)进行数据库操作。
- 前提:数据库需提供API供程序调用,这些API通常被封装成“库”。
- Java有自己的API标准,各数据库需将自身API适配成Java标准API(即JDBC)。
2. JDBC的定义与作用
- JDBC(Java Database Connectivity)是Java访问数据库的标准API。
- 各数据库需提供兼容JDBC的驱动(如MySQL的mysql-connector)。
- 使用JDBC,开发者只需学习一套API即可操作多种数据库。
3. 驱动与第三方库
- 数据库厂商会提供JDBC驱动(如MySQL的mysql-connector.jar)。
- 这些驱动通常以.jar文件形式提供,需要手动下载并导入项目(如通过Maven中央仓库)。
4. JDBC操作数据库的标准步骤
创建数据源
通过
MysqlDataSource
等设置数据库连接信息(URL、用户名、密码)。例如:
MysqlDataSource dataSource = new MysqlDataSource(); dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/exercise?characterEncoding=utf8&useSSL=false"); dataSource.setUser("root"); dataSource.setPassword("aa1234");
建立连接
- 调用
dataSource.getConnection()
获取数据库连接对象。
- 调用
构造SQL语句
推荐使用
PreparedStatement
预编译SQL,提升效率并防止SQL注入。例如:
String sql = "insert into student(name) values(?)"; PreparedStatement statement = connection.prepareStatement(sql); statement.setString(1, name);
执行SQL语句
- 查询用
executeQuery()
,增删改用executeUpdate()
。
- 查询用
处理结果
查询结果通过
ResultSet
遍历处理。例如:
while (resultSet.next()) { System.out.println(resultSet.getInt("id")); System.out.println(resultSet.getString("name")); }
释放资源
- 按照创建顺序的逆序关闭
ResultSet
、Statement
、Connection
等资源。
- 按照创建顺序的逆序关闭
5. JDBC的局限与框架的出现
- 直接使用JDBC编写代码繁琐、重复度高,容易出错。
- 为简化开发,出现了如MyBatis等基于JDBC的ORM框架,对JDBC进行封装和简化。
- 这些框架主要解决“通用场景”,但对于某些特殊需求,仍需开发者具备底层JDBC操作能力,对框架进行定制或扩展。
6. 总结
- 框架的本质是为了解决通用问题,提高开发效率。
- 但开发者仍需掌握底层原理和操作,才能在遇到特殊场景时灵活应对。
代码示例总结
// 1. 创建数据源
MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/exercise?characterEncoding=utf8&useSSL=false");
dataSource.setUser("root");
dataSource.setPassword("aa1234");
// 2. 建立连接
Connection connection = dataSource.getConnection();
// 3. 构建SQL
String sql = "select * from student";
PreparedStatement statement = connection.prepareStatement(sql);
// 4. 执行SQL
ResultSet resultSet = statement.executeQuery();
// 5. 遍历结果集
while (resultSet.next()) {
System.out.println(resultSet.getInt("id"));
System.out.println(resultSet.getString("name"));
}
// 6. 关闭资源
resultSet.close();
statement.close();
connection.close();