• Mybatis核心源码赏析(三)


    Mybatis如何连接数据源源代码赏析。从源码上看Mybatis中与数据库进行连接是继承了ibatis里面的内容。源代码如下:

    作者重点表达这个连接类功能  ,没有使用连接池,仅供测试或打开关闭连接非常少的场合使用!

    一、这里默认指出了连接数据库配置文件的位置和所需参数

        /** 默认的数据库连接配置文件路径 */
        public final static String DEFAULT_DB_CONFIG_PATH = "config/db.setting";

        // -------------------------------------------------------------------- Fields start
        private String driver; // 数据库驱动
        private String url; // jdbc url
        private String user; // 用户名
        private String pass; // 密码

    二、获取数据源的方式加了锁,保证者获取一个连接

        synchronized public static SimpleDataSource getDataSource(String group) {
            return new SimpleDataSource(group);
        }

        /**
         * 获得一个数据源,无分组
         *
         * @return {@link SimpleDataSource}
         */
        synchronized public static SimpleDataSource getDataSource() {
            return new SimpleDataSource();
        }
     

    三、启动的过程中通过构造函数进行调用

        /**
         * 构造
         *
         * @param url jdbc url
         * @param user 用户名
         * @param pass 密码
         */
        public SimpleDataSource(String url, String user, String pass) {
            init(url, user, pass);
        }
     

    四、进行数据库连接

        @Override
        public Connection getConnection() throws SQLException {
            final Props info = new Props();
            if (this.user != null) {
                info.setProperty("user", this.user);
            }
            if (this.pass != null) {
                info.setProperty("password", this.pass);
            }

            // 其它参数
            final Properties connProps = this.connProps;
            if(MapUtil.isNotEmpty(connProps)){
                info.putAll(connProps);
            }

            return DriverManager.getConnection(this.url, info);
        }

        @Override
        public Connection getConnection(String username, String password) throws SQLException {
            return DriverManager.getConnection(this.url, username, password);
        }

    1. package cn.hutool.db.ds.simple;
    2. import cn.hutool.core.map.MapUtil;
    3. import cn.hutool.core.util.StrUtil;
    4. import cn.hutool.db.DbRuntimeException;
    5. import cn.hutool.db.dialect.DriverUtil;
    6. import cn.hutool.db.ds.DSFactory;
    7. import cn.hutool.setting.Setting;
    8. import cn.hutool.setting.dialect.Props;
    9. import java.sql.Connection;
    10. import java.sql.DriverManager;
    11. import java.sql.SQLException;
    12. import java.util.Properties;
    13. /***
    14. * 简易数据源,没有使用连接池,仅供测试或打开关闭连接非常少的场合使用!
    15. *
    16. * @author loolly
    17. *
    18. */
    19. public class SimpleDataSource extends AbstractDataSource {
    20. /** 默认的数据库连接配置文件路径 */
    21. public final static String DEFAULT_DB_CONFIG_PATH = "config/db.setting";
    22. // -------------------------------------------------------------------- Fields start
    23. private String driver; // 数据库驱动
    24. private String url; // jdbc url
    25. private String user; // 用户名
    26. private String pass; // 密码
    27. // 连接配置
    28. private Properties connProps;
    29. // -------------------------------------------------------------------- Fields end
    30. /**
    31. * 获得一个数据源
    32. *
    33. * @param group 数据源分组
    34. * @return {@link SimpleDataSource}
    35. */
    36. synchronized public static SimpleDataSource getDataSource(String group) {
    37. return new SimpleDataSource(group);
    38. }
    39. /**
    40. * 获得一个数据源,无分组
    41. *
    42. * @return {@link SimpleDataSource}
    43. */
    44. synchronized public static SimpleDataSource getDataSource() {
    45. return new SimpleDataSource();
    46. }
    47. // -------------------------------------------------------------------- Constructor start
    48. /**
    49. * 构造
    50. */
    51. public SimpleDataSource() {
    52. this(null);
    53. }
    54. /**
    55. * 构造
    56. *
    57. * @param group 数据库配置文件中的分组
    58. */
    59. public SimpleDataSource(String group) {
    60. this(null, group);
    61. }
    62. /**
    63. * 构造
    64. *
    65. * @param setting 数据库配置
    66. * @param group 数据库配置文件中的分组
    67. */
    68. public SimpleDataSource(Setting setting, String group) {
    69. if (null == setting) {
    70. setting = new Setting(DEFAULT_DB_CONFIG_PATH);
    71. }
    72. final Setting config = setting.getSetting(group);
    73. if (MapUtil.isEmpty(config)) {
    74. throw new DbRuntimeException("No DataSource config for group: [{}]", group);
    75. }
    76. init(//
    77. config.getAndRemoveStr(DSFactory.KEY_ALIAS_URL), //
    78. config.getAndRemoveStr(DSFactory.KEY_ALIAS_USER), //
    79. config.getAndRemoveStr(DSFactory.KEY_ALIAS_PASSWORD), //
    80. config.getAndRemoveStr(DSFactory.KEY_ALIAS_DRIVER)//
    81. );
    82. // 其它连接参数
    83. this.connProps = config.getProps(Setting.DEFAULT_GROUP);
    84. }
    85. /**
    86. * 构造
    87. *
    88. * @param url jdbc url
    89. * @param user 用户名
    90. * @param pass 密码
    91. */
    92. public SimpleDataSource(String url, String user, String pass) {
    93. init(url, user, pass);
    94. }
    95. /**
    96. * 构造
    97. *
    98. * @param url jdbc url
    99. * @param user 用户名
    100. * @param pass 密码
    101. * @param driver JDBC驱动类
    102. * @since 3.1.2
    103. */
    104. public SimpleDataSource(String url, String user, String pass, String driver) {
    105. init(url, user, pass, driver);
    106. }
    107. // -------------------------------------------------------------------- Constructor end
    108. /**
    109. * 初始化
    110. *
    111. * @param url jdbc url
    112. * @param user 用户名
    113. * @param pass 密码
    114. */
    115. public void init(String url, String user, String pass) {
    116. init(url, user, pass, null);
    117. }
    118. /**
    119. * 初始化
    120. *
    121. * @param url jdbc url
    122. * @param user 用户名
    123. * @param pass 密码
    124. * @param driver JDBC驱动类,传入空则自动识别驱动类
    125. * @since 3.1.2
    126. */
    127. public void init(String url, String user, String pass, String driver) {
    128. this.driver = StrUtil.isNotBlank(driver) ? driver : DriverUtil.identifyDriver(url);
    129. try {
    130. Class.forName(this.driver);
    131. } catch (ClassNotFoundException e) {
    132. throw new DbRuntimeException(e, "Get jdbc driver [{}] error!", driver);
    133. }
    134. this.url = url;
    135. this.user = user;
    136. this.pass = pass;
    137. }
    138. // -------------------------------------------------------------------- Getters and Setters start
    139. public String getDriver() {
    140. return driver;
    141. }
    142. public void setDriver(String driver) {
    143. this.driver = driver;
    144. }
    145. public String getUrl() {
    146. return url;
    147. }
    148. public void setUrl(String url) {
    149. this.url = url;
    150. }
    151. public String getUser() {
    152. return user;
    153. }
    154. public void setUser(String user) {
    155. this.user = user;
    156. }
    157. public String getPass() {
    158. return pass;
    159. }
    160. public void setPass(String pass) {
    161. this.pass = pass;
    162. }
    163. public Properties getConnProps() {
    164. return connProps;
    165. }
    166. public void setConnProps(Properties connProps) {
    167. this.connProps = connProps;
    168. }
    169. public void addConnProps(String key, String value){
    170. if(null == this.connProps){
    171. this.connProps = new Properties();
    172. }
    173. this.connProps.setProperty(key, value);
    174. }
    175. // -------------------------------------------------------------------- Getters and Setters end
    176. @Override
    177. public Connection getConnection() throws SQLException {
    178. final Props info = new Props();
    179. if (this.user != null) {
    180. info.setProperty("user", this.user);
    181. }
    182. if (this.pass != null) {
    183. info.setProperty("password", this.pass);
    184. }
    185. // 其它参数
    186. final Properties connProps = this.connProps;
    187. if(MapUtil.isNotEmpty(connProps)){
    188. info.putAll(connProps);
    189. }
    190. return DriverManager.getConnection(this.url, info);
    191. }
    192. @Override
    193. public Connection getConnection(String username, String password) throws SQLException {
    194. return DriverManager.getConnection(this.url, username, password);
    195. }
    196. @Override
    197. public void close() {
    198. // Not need to close;
    199. }
    200. }

  • 相关阅读:
    ReactNative中升级IOS 17版本Crash解决
    AlexNet、VGG、GoogLeNet、ReaNet、MobileNet、ShuffleNet和EfficientNet网络的亮点和创新之处
    vue3解决[Vue warn]: Failed to resolve component:XXX
    双指针——复写零
    有哪些免费的数据恢复软件?EasyRecovery免费版下载
    【升级U8+】在将 varchar 值 ‘IA01‘ 转换成数据类型 int 时失败。
    Docker Compose具体应用
    tomcat启动配置java_home,启动网址等,点击startup.bat直接启动
    排序算法:快速排序
    PHP文件读写
  • 原文地址:https://blog.csdn.net/dongjing991/article/details/127427439