问题分析
JDBC 问题总结
原生 jdbc 开发存在的问题有哪些?
- 数据库连接创建、释放频繁造成 系统资源浪费 ,从而影响系统性能;
- Sql 语句在代码中 硬编码 ,造成代码不易维护,实际应用中 sql 变化的可能较大,sql 变动需要改变 java 代码;
- 使用 preparedStatement 向占有位符号传参数存在硬编码 ,因为 sql 语句的 where 条件不一定,可能多也可能少,修改 sql 还要修改代码,系统不易维护;
- 对结果集解析存在硬编码 (查询列名),sql 变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成 pojo 对象来解析比较方便。
问题解决思路
怎么解决 jdbc 开发存在的那些问题?
- 使用 数据库连接池 来初始化连接资源;
- 将 sql 语句抽取到 xml 配置文件 中去;
- 使用 反射 、 内省 等底层技术,自动将实体与数据库表进行属性与字段的自动映射。
核心实现
用具体的代码阐明 jdbc 开发遇到的问题?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| package test;
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet;
public class Main { public static void main(String[] args) { Connection connection = null; PreparedStatement preparedStatement = null; ResultSet resultSet = null; try { Class.forName("com.mysql.jdbc.Driver"); connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8&useSSL=false", "root", "123456");
String sql = "select * from user where username = ?"; preparedStatement = connection.prepareStatement(sql); preparedStatement.setString(1, "terwer"); resultSet = preparedStatement.executeQuery();
while (resultSet.next()) { int id = resultSet.getInt("id"); String username = resultSet.getString("username");
User user = new User(); user.setId(id); user.setUsername(username);
System.out.println("user = " + user.toString()); }
} catch (Exception e) { e.printStackTrace(); } finally { System.out.println("释放资源"); } } }
|
mysql 驱动链接
https://files.cnblogs.com/files/tangyouwei/mysql-connector-java-5.1.49.jar.zip
本文源码
https://github.com/terwer/senior-java-engineer-road/blob/main/p7-skill/framework/mybatis/jdbc-simple/src/main/java/com/terwergreen/Main.java
文章更新历史
2023/08/24 优化闪卡
2023/01/02 修正源码路径错误问题
2022/03/16 校对完成
2022/03/06 初稿