目录
前言
JDBC使用步骤
JDBC使用示例
原始jdbc开发存在的问题
本文源代码参考
前言
众所周知,MyBatis是一个非常优秀的基于Java的持久层框架。其支持定制化 SQL、存储过程以及高级映射,通过使用简单的 XML或注解避免了使用传统JDBC时带来的硬编码问题。那么MyBatis究竟是如何解决这些问题的呢?XML或注解又是如何被解析的?其内部的数据库连接池是如何实现的?我们如何通过MyBatis预留给我们的扩展接口进行插件开发?请大家带着这些疑问,在接下来的章节里我将和大家一起探索这些问题的实现
在学习MyBatis源码之前,我们先对传统JDBC的使用方式进行演示,同时总结出其存在的缺点
JDBC使用步骤
- 加载 jdbc 驱动程序
- 通过驱动管理类获取数据库连接
- 获取预处理statement
- 设置参数
- 获取结果集
- 处理结果集
- 释放资源? ??
JDBC使用示例
import com.example.mybatismrpu.entity.User;
import java.sql.*;
public class JDBCDemo {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
User user = new User();
// 1.加载数据库驱动 (我用的是mysql 8.0.27,如果你用的是5.X的版本请换成 com.mysql.jdbc.Driver)
Class.forName("com.mysql.cj.jdbc.Driver");
// 2.通过驱动管理类获取数据库链接
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis_mrpu?characterEncoding=utf-8", "root", "1527463happy");
// 定义sql语句?表示占位符
String sql = "select * from user where username = ?";
// 3.获取预处理statement
preparedStatement = connection.prepareStatement(sql);
// 4.设置参数,第?个参数为sql语句中参数的序号(从1开始),第?个参数为设置的参数值
preparedStatement.setString(1, "tom");
// 5.向数据库发出sql执?查询,查询出结果集
resultSet = preparedStatement.executeQuery();
// 6.处理结果集
while (resultSet.next()) {
int id = resultSet.getInt("id");
String username = resultSet.getString("username");
String password = resultSet.getString("password");
String birthday = resultSet.getString("birthday");
// 封装User
user.setId(id);
user.setUsername(username);
user.setPassword(password);
user.setBirthday(birthday);
}
System.out.println("查询结果 user = " + user);
// 7.释放资源
if (resultSet!=null){
resultSet.close();
}
if (preparedStatement != null){
preparedStatement.close();
}
if (connection != null){
connection.close();
}
}
}
原始jdbc开发存在的问题
- 频繁的创建与销毁数据库连接,从而影响系统性能
- 硬编码,配置、sql参数、结果集处理等与业务代码耦合在一起
本文源代码参考
mybatis-mrpu: mybatis实现原理探索
|