MyBatis
带着问题学习
- MyBatis 干了什么、为什么用 MyBatis
- 如果不用我们会怎么做
jdbc 操作数据库
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", "root", "root");
// 定义 sql 语句 ? 标识占位符
String sql = "select * from user where username = ?";
// 获取预处理 statement
preparedStatement = connection.prepareStatement(sql);
// 设置参数
preparedStatement.setString(1, "tom");
// 想数据库发出 sql 执行查询 查询出结果集
resultSet = preparedStatement.executeQuery();
//便利查询结果集
while (resultSet.next()) {
int id = resultSet.getInt("id");
String username = resultSet.getString("username");
//封装实体 user
user.setId(id);
user.setUsername(username);
}
System.out.println(user);
} catch (Exception e) {
e.printStackTrace();
} finally {
// 释放资源
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (preparedStatement != null) {
try {
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
JDBC 问题
- 数据库链接创建、释放频繁造成系统资源浪费
- SQL 语句再代码中硬编码、赵成代码不易维护,实际应用中 sql 的变化可能较大、sql 变动需要改变 java 代码,
- 使用 preparedStatement 向占有位符号传参数存在硬编码、因为 sql 语句的 where 条件不一定、修改 sql 不灵活、需修改代码不易维护
- 对结果集解析存在硬编码(查询列名),sql 变化解析代码变化、系统不移维护。
问题解决
- 数据库频繁创建链接、释放资源:连接池
- sql 硬编码:配置文件管理
- 手动解析封装返回结果集:反射、内省
- 动态代理模式创建接口的代理对象、减少sql 执行的硬编码和模板重复创建
本文由 chaoohuua 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为:
2022/10/07 19:04