mybatis 源码系列(四) 数据库驱动Driver加载方式

本文深入探讨了mybatis数据源实现中数据库驱动Driver的加载方式。通过分析`DriverManager.getDrivers()`方法,揭示了`ServiceLoader`在静态块中加载驱动的过程。在`META-INF/services/java.sql.Driver`配置文件的指引下,驱动类被加载到JVM并注册到`DriverManager`。整个流程包括资源路径检查、类加载和静态块执行。

更多mybatis 源码系列文章可关注我的博客,点击前往

不管是mysql或者oracle等等数据库的连接,在我们Java程序中,都需要将相应的数据库驱动jar包加入到Java应用程序中

那么通过mybatis的两个DataSource数据源实现方式来看,我们的数据库驱动是如何加载的呢?

先来看mybatis的UnpooledDataSource.java数据源

/**
 * @author Clinton Begin
 * @author Eduardo Macarron
 */
public class UnpooledDataSource implements DataSource {
   
   
  
  private ClassLoader driverClassLoader;
  private Properties driverProperties;
  private static Map<String, Driver> registeredDrivers = new ConcurrentHashMap<String, Driver>();

  /***
   * 驱动类
   */
  private String driver;
  /***
   * 数据库连接url
   */
  private String url;
  //用户名
  private String username;
  //密码
  private String password;

  //是否自动提交
  private Boolean autoCommit;
  //默认事务隔离级别
  private Integer defaultTransactionIsolationLevel;

  static {
   
   
    //加载数据库驱动
    //遍历获取依据注册的驱动类,并将该驱动类实例加入到当前数据源的缓存map中
    Enumeration<Driver> drivers = DriverManager.getDrivers();
    while (drivers.hasMoreElements()) {
   
   
      Driver driver = drivers.nextElement();
      registeredDrivers.put(driver.getClass().getName(), driver);
    }
  }
 public UnpooledDataSource() {
   
   
  }
    //.....
}

按照mybatis的数据源实现方式,那么我们使用数据库的方式如下:

//创建数据源工厂
UnpooledDataSourceFactory unpooledDataSourceFactory=new UnpooledDataSourceFactory();
String driver="com.mysql.cj.jdbc.Driver";
String url="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true";
String username="root";
String password="123456";
//赋值properties
Properties properties=new Properties();
properties.setProperty("driver",driver);
properties.setProperty("url",url);
properties.setProperty("username",username);
properties.setProperty("password",password);
unpooledDataSourceFactory.setProperties(properties);
//如果使用的是UnpooledDataSource数据源,则以上properties属性赋值需要使用UnpooledDataSource的属性值
//获取数据源
DataSource dataSource=unpooledDataSourceFactory.getDataSource();
Connection connection=dataSource.getConnection();
String sql="select * from user";
PreparedStatement pstm=connection.prepareStatement(sql);
ResultSet rs=pstm.executeQuery();
while (rs.next()){
   
   
    String id=rs.getString("id");
    int age=rs.getInt("age");
    String name=rs.getString("name");
    System.out.println("id:"+id+",age:"+age+",name:"+name);
}
rs.close();
pstm.close();
connection.close();

这样我们会在控制台中打印当前user表的相关信息,看到这里,这在以前我会可能到此为止了,但是既然是源码研究,那么在阅读代码的时候就会产生疑问

疑问点:

static {
   
   
    //加载数据库驱动
    //遍历获取依据注册的驱动类,并将该驱动类实例加入到当前数据源的缓存map中
    Enumeration<Driver> drivers = DriverManager.getDrivers();
    while (drivers.hasMoreElements()) {
   
   
      Driver driver = drivers.nextElement()
### MyBatisX 插件连接数据库的配置与使用 MyBatisX 是一款专为 IntelliJ IDEA 设计的插件,旨在提高基于 MyBatisMyBatis-Plus 开发项目的效率。以下是关于如何通过 MyBatisX 插件完成数据库连接以及相关配置的方法。 #### 一、安装 MyBatisX 插件 要开始使用 MyBatisX 插件,需先将其安装至 IntelliJ IDEA 中: 1. 打开 IntelliJ IDEA。 2. 导航到 `File > Settings > Plugins`。 3. 在插件市场中搜索 “MyBatisX” 并点击安装按钮[^3]。 4. 安装完成后重启 IDE 即可生效。 #### 二、配置数据库连接 为了实现 MyBatisX 对数据库的操作支持,需要正确设置数据库连接参数。通常情况下,这些参数会存储在 Spring 或 Spring Boot 的配置文件中: ##### **对于传统 Spring 项目** 在 `src/main/resources` 下创建或编辑 `db.properties` 文件,添加如下内容以定义 JDBC 数据库连接信息: ```properties jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/your_database_name?useSSL=false&serverTimezone=UTC jdbc.username=your_username jdbc.password=your_password ``` 此部分配置明确了驱动程序、URL 地址、用户名及密码等必要字段[^2]。 ##### **对于 Spring Boot 项目** 可以直接在 `application.yml` 或者 `application.properties` 文件指定同样的属性值。例如,在 YAML 格式的配置文件中写入以下片段即可满足需求: ```yaml spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/your_database_name?useSSL=false&serverTimezone=UTC username: your_username password: your_password ``` 当完成了以上步骤之后,确保所使用的 Maven 或 Gradle 构建工具已引入对应的依赖项来加载 MySQL 驱动以及其他必要的组件。 #### 三、利用 MyBatisX 自动生成代码 一旦成功建立了与目标数据库之间的联系,则可以通过 MyBatisX 实现自动化生成各类基础类别的功能,比如实体类 (Entity)、映射接口 (Mapper) 及其 XML 映射文件等等。 具体操作流程如下所示: 1. 右键单击想要保存生成结果的目标包名位置; 2. 选择菜单选项 `"Generate"` -> `"MyBatis Code..."`; 3. 接下来按照向导提示选取合适的表结构作为依据对象并确认执行命令; 最终将会看到一系列遵循既定模板构建出来的源码被放置到了相应路径之下[^1]。 --- ### 示例代码展示 下面给出一段简单的控制器逻辑演示了调用服务层方法查询特定用户的场景: ```java @RestController public class UserController { @Autowired private UserService userService; @GetMapping("/getUserById/{id}") public User getUserById(@PathVariable Integer id){ QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("id", id); return userService.getOne(queryWrapper); } } ``` 上述例子展示了如何借助 MyBatis-Plus 提供的条件构造器 (`QueryWrapper`) 来封装 SQL 查询条件,并交由业务逻辑处理单元返回预期的结果集[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值