您的位置:威尼斯官方网站 > 威尼斯官方网站登录 > 即Java数据库编程接口

即Java数据库编程接口

发布时间:2020-01-04 05:07编辑:威尼斯官方网站登录浏览(116)

           远近出名数据库连接的长河,不过近些日子面试的人(菜面菜卡塔尔(قطر‎,都在说用的SSM框架,可是本身问了后生可畏晃,mybatis是怎么总是上mysql的,基本上都会说:配置好的,间接用了,前不久自家来一得之见一下,招待拍砖!

           什么是JDBC?

           Java语言访谈数据库的少年老成种规范,是少年老成套API。JDBC (Java Database Connectivity)API,即Java数据库编制程序接口,是风姿洒脱组正式的Java语言中的接口和类,使用这一个接口和类,Java客商端程序能够访谈各个区别品类的数据库。JDBC规范使用接口和落实分离的沉凝设计了Java数据库编制程序的框架。接口包括在java.sql及javax.sql包中,当中java.sql归于JavaSE,javax.sql归于JavaEE。为了使客商端程序独立于特定的数据库驱动程序,JDBC标准建议开荒者使用基于接口的编制程序方式,即尽量使应用仅信任java.sql及javax.sql中的接口和类。

            JAVA使用JDBC访问数据库的步调:

            1.获取数据库驱动程序

            2.创造数据库连接

            3.执行SQL语句

            4.得到结果集

            5.对结果集做相应的拍卖(增,删,改,查卡塔尔

            6.闭馆能源:这里释放的是DB中的能源

            mysql的驱动包提供了java.sql.Driver这么些SPI的得以完成,实现类是com.mysql.jdbc.Driver,在mysql-connector-java-5.1.6.jar中,大家得以看出有二个META-INF/services目录,目录下有二个文本名叫java.sql.Driver的文书,此中的内容是com.mysql.jdbc.Driver。
    在运营DriverManager.getDriver并传播参数“com.mysql.jdbc.Driver”时,DriverManager会从mysql-connector-java-5.1.6.jar中找到com.mysql.jdbc.Driver并实例化重临八个com.mysql.jdbc.Driver的实例。而SPI(瑟维斯Provider Interface)是指部分提要求你继续、增加,达成自定义效用的类、接口也许措施。

    图片 1

           SPI是生龙活虎种回调的思辨,回调是指大家在运用api时,我们得以向API传入三个类依然措施,API在妥帖的岁月调用类或许措施。SPI是在有个别通用的行业内部中,为标准的达成产商提供的扩大点。规范在上层提供API,API内部选用了SPI,当API被客商利用时,会动态得从今未来时此刻运作的classpath中搜寻该SPI的达成,然后使用该SPI的兑现来成功API的意义。

           SPI的完成情势是:提供达成的兑现类打包成Jar文件,那几个Jar文件里面必得有META-INF目录,其下又有services目录,其下有一个文本文件,文件名即为SPI接口的人名,文件的内容该jar包中提供的SPI接口的兑现类名。

           我们看等级次序中Mybaits的jar包会发掘:

    private class SqlSessionInterceptor implements InvocationHandler {
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
          SqlSession sqlSession = getSqlSession(
              SqlSessionTemplate.this.sqlSessionFactory,
              SqlSessionTemplate.this.executorType,
              SqlSessionTemplate.this.exceptionTranslator);
          try {
            Object result = method.invoke(sqlSession, args);
            if (!isSqlSessionTransactional(sqlSession, SqlSessionTemplate.this.sqlSessionFactory)) {
              // force commit even on non-dirty sessions because some databases require
              // a commit/rollback before calling close()
              sqlSession.commit(true);
            }
            return result;
          } catch (Throwable t) {
            Throwable unwrapped = unwrapThrowable(t);
            if (SqlSessionTemplate.this.exceptionTranslator != null && unwrapped instanceof PersistenceException) {
              // release the connection to avoid a deadlock if the translator is no loaded. See issue #22
              closeSqlSession(sqlSession, SqlSessionTemplate.this.sqlSessionFactory);
              sqlSession = null;
              Throwable translated = SqlSessionTemplate.this.exceptionTranslator.translateExceptionIfPossible((PersistenceException) unwrapped);
              if (translated != null) {
                unwrapped = translated;
              }
            }
            throw unwrapped;
          } finally {
            if (sqlSession != null) {
              closeSqlSession(sqlSession, SqlSessionTemplate.this.sqlSessionFactory);
            }
          }
        }
      }
    

          sqlSessionTemplate.SqlSessionInterceptor源码,有未有风流倜傥种很熟识的痛感?至于getConnection本人去看;用过ElasticSearch和Redis的童鞋,细心的童鞋会开掘一而再再三再四字符串都大致,连接都以相同的,规范的接连方式,升高成效,有效调控连接;

          ElasticSearch的连年字符串:

    protected SearchResponse getSearchResponse(String fieldName, String indexName) {
        client = null;
        SearchResponse response = null;
        try {
            getClient();
            MaxAggregationBuilder aggregation =
                    AggregationBuilders
                            .max("agg")
                            .field(fieldName);
            SearchRequestBuilder request = client.prepareSearch(indexName).addAggregation(aggregation);
            response = request.execute().actionGet();
        } catch (Exception ex) {
            logger.error("getSearchResponse", ex);
        } finally {
            if (client != null) {
                client.close();
            }
            return response;
        }
    }
    

         Jedis连接字符串:

    执行命令如下:
    Jedis jedis = null;
    try {
        jedis = jedisPool.getResource();
        //具体的命令
        jedis.executeCommand()
    } catch (Exception e) {
        logger.error("op key {} error: " + e.getMessage(), key, e);
    } finally {
        //注意这里不是关闭连接,在JedisPool模式下,Jedis会被归还给资源池。
        if (jedis != null) 
            jedis.close(); 
    }
    

           拦截器的兑现都是依靠代理的设计格局达成的,一句话来讲正是要开创贰个指标类的代理类,在代理类中实施目的类的方法并在章程以前实践拦截器代码,拦截器通常常有登入拦截器——验证会话消息,权限拦截器——验证权限消息,那么SqlSessionInterceptor是怎么的?

           Mybatis拦截器设计的八个初心正是为了供客商在一些时候能够达成团结的逻辑而不必去动Mybatis固有的逻辑。打个举个例子,对于Executor,Mybatis中有三种完毕:BatchExecutor、ReuseExecutor、SimpleExecutor和CachingExecutor。
    这时假让你以为那三种达成对于Executor接口的query方法都无法满意你的须求,那如何做吧?是要去改源码吗?当然不。大家能够创设一个Mybatis拦截器用于拦截Executor接口的query方法,在阻止之后实现和煦的query方法逻辑,之后可以筛选是或不是继续推行原本的query方法。允许你在已映射语句施行进程中的某一点进展阻挠调用。有的用Mybatis拦截器统封装分页,有的用它达成读写抽离等,假使读写分离依旧提出配置超多据源;

           spring整合mybatis之后,通过动态代理的措施,使用SqlSessionTemplate持有的sqlSessionProxy属性来代劳实践sql操作,由spring管理的sqlSeesion在sql方法(增加和删除改查等操作卡塔尔(قطر‎施行完成后就自行关闭了sqlSession,不必要大家对其进行手动关闭。

           愿你有恋人终成家室,愿你有个有趣的神魄,愿你拍自身朝气蓬勃砖!

    本文由威尼斯官方网站发布于威尼斯官方网站登录,转载请注明出处:即Java数据库编程接口

    关键词: