rs = stmt.executeQuery(sql);

                return rse.extractData(rs);

            }

            finally {

                JdbcUtils.closeResultSet(rs);

            }

        }

        @Override

        public String getSql() {

            return sql;

        }

    }



    return execute(new QueryStatementCallback());

}



@Override

@Nullable

public <T> T execute(StatementCallback<T> action) throws DataAccessException {

    Assert.notNull(action, "Callback object must not be null");



    Connection con = DataSourceUtils.getConnection(obtainDataSource());

    Statement stmt = null;

    try {

        stmt = con.createStatement();

        applyStatementSettings(stmt);

        T result = action.doInStatement(stmt);

        handleWarnings(stmt);

        return result;

    }

    catch (SQLException ex) {

        // Release Connection early, to avoid potential connection pool deadlock

        // in the case when the exception translator hasn't been initialized yet.

        String sql = getSql(action);

        JdbcUtils.closeStatement(stmt);

        stmt = null;

        DataSourceUtils.releaseConnection(con, getDataSource());

        con = null;

        throw translateException("StatementCallback", sql, ex);

    }

    finally {

        JdbcUtils.closeStatement(stmt);

        DataSourceUtils.releaseConnection(con, getDataSource());

    }

}

...

}


public interface Statement extends Wrapper, AutoCloseable {

    ResultSet executeQuery(String sql) throws SQLException;

    ...

}



public abstract class JdbcAccessor implements InitializingBean {

    @Nullable

    private DataSource dataSource;

    

    public void setDataSource(@Nullable DataSource dataSource) {

        this.dataSource = dataSource;

    }

} 

```



三、更优雅的方式 -> 通过配置类方式实现

---------------------



### 1、application.yml



```

server:

  port: 8080



spring:

  application:

    name: test

  datasource:

    sqlserver:

      jdbc-url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=test

      driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver

      username: sa

      password: sa

    postgres:

      jdbc-url: jdbc:postgresql://127.0.0.1:5432/test

      driverClassName: org.postgresql.Driver

      username: postgres

      password: 123456

```



### 2、配置类



```

package com.guor.config;



import org.apache.ibatis.session.SqlSessionFactory;

import org.mybatis.spring.SqlSessionFactoryBean;

import org.mybatis.spring.SqlSessionTemplate;

import org.mybatis.spring.annotation.MapperScan;

import org.springframework.beans.factory.annotation.Qualifier;

import org.springframework.boot.context.properties.ConfigurationProperties;

import org.springframework.boot.jdbc.DataSourceBuilder;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

import org.springframework.jdbc.datasource.DataSourceTransactionManager;



import javax.sql.DataSource;



@Configuration

@MapperScan(basePackages = "com.guor.dao.postgres", sqlSessionTemplateRef  = "postgresSqlSessionTemplate")

public class PostgresConfig {

    @Bean(name = "postgresDataSource")

    @ConfigurationProperties(prefix = "spring.datasource.postgres")

    public DataSource postgresDataSource() {

        return DataSourceBuilder.create().build();

    }



    @Bean(name = "postgresSqlSessionFactory")

    public SqlSessionFactory postgresSqlSessionFactory(@Qualifier("postgresDataSource") DataSource dataSource) throws Exception {

        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();

        bean.setDataSource(dataSource);

        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("com/guor/dao/postgres/mapping/*.xml"));

        return bean.getObject();

    }



    @Bean(name = "postgresTransactionManager")

    public DataSourceTransactionManager postgresTransactionManager(@Qualifier("postgresDataSource") DataSource dataSource) {

        return new DataSourceTransactionManager(dataSource);

    }



    @Bean(name = "postgresSqlSessionTemplate")

    public SqlSessionTemplate postgresSqlSessionTemplate(@Qualifier("postgresSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {

        return new SqlSessionTemplate(sqlSessionFactory);

    }

}

package com.guor.config;

import org.apache.ibatis.session.SqlSessionFactory;

import org.mybatis.spring.SqlSessionFactoryBean;

import org.mybatis.spring.SqlSessionTemplate;

import org.mybatis.spring.annotation.MapperScan;

import org.springframework.beans.factory.annotation.Qualifier;

import org.springframework.boot.context.properties.ConfigurationProperties;

import org.springframework.boot.jdbc.DataSourceBuilder;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.context.annotation.Primary;

import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

@Configuration

@MapperScan(basePackages = “com.guor.dao.sqlserver”, sqlSessionTemplateRef = “sqlserverSqlSessionTemplate”)

public class SqlserverConfig {

@Bean(name = "sqlserverDataSource")

@ConfigurationProperties(prefix = "spring.datasource.sqlserver")

@Primary

public DataSource sqlserverDataSource() {

    return DataSourceBuilder.create().build();

}



@Bean(name = "sqlserverSqlSessionFactory")

@Primary

public SqlSessionFactory sqlserverSqlSessionFactory(@Qualifier("sqlserverDataSource") DataSource dataSource) throws Exception {

    SqlSessionFactoryBean bean = new SqlSessionFactoryBean();

    bean.setDataSource(dataSource);

    bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("com/guor/dao/sqlserver/mapping/*.xml"));

    return bean.getObject();

}



@Bean(name = "sqlserverTransactionManager")

@Primary

public DataSourceTransactionManager sqlserverTransactionManager(@Qualifier("sqlserverDataSource") DataSource dataSource) {

    return new DataSourceTransactionManager(dataSource);

}



@Bean(name = "sqlserverSqlSessionTemplate")

@Primary

public SqlSessionTemplate sqlserverSqlSessionTemplate(@Qualifier("sqlserverSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {

    return new SqlSessionTemplate(sqlSessionFactory);

}

}




### 3、UserPostgresMapper 



package com.guor.dao.postgres;

import java.util.List;

import java.util.Map;

public interface UserPostgresMapper {

List<Map<String, Object>> getUsersByPostgres();

}




### 4、UserPostgresMapper.xml



<?xml version="1.0" encoding="UTF-8" ?>
<select id="getUsersByPostgres" resultType="java.util.LinkedHashMap">

    SELECT * FROM t_user

</select>



### 5、UserSqlserverMapper



package com.guor.dao.sqlserver;

import java.util.List;

import java.util.Map;

public interface UserSqlserverMapper {

List<Map<String, Object>> getUsersFromSqlserver();

}




### 6、UserSqlserverMapper.xml



<?xml version="1.0" encoding="UTF-8" ?>
<select id="getUsersFromSqlserver" resultType="java.util.LinkedHashMap">

    SELECT * FROM t_user

</select>



### 7、controller



package com.guor.controller;

import java.util.List;

import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

import com.guor.dao.postgres.UserPostgresMapper;

import com.guor.dao.sqlserver.UserSqlserverMapper;

@RestController

@RequestMapping(“user”)

public class UserController {

@Autowired

private UserSqlserverMapper userMapper;



@GetMapping("/getUsersBySqlserver")

public List<Map<String, Object>> getUsersBySqlserver(){

    return userMapper.getUsersFromSqlserver();

}



@Autowired

private UserPostgresMapper userPostgresMapper;



@GetMapping("/getUsersByPostgres")

public List<Map<String, Object>> getUsersByPostgres(){

    return userPostgresMapper.getUsersByPostgres();

}

}




### 8、浏览器访问



> [http://localhost:8080/user/getUsersByPostgres]( )

> 

> \[{"id":1,"name":"zs","age":18,"version":"1","deleted":0},{"id":1,"name":"ls","age":28,"creator\_id":87368736,"created\_time":"2021-06-11T02:43:48.000+0000"},{"id":2,"name":"ww","age":35,"creator\_id":87368736,"created\_time":"2021-06-11T05:29:20.000+0000"}\]



> [http://localhost:8080/user/getUsersBySqlserver]( )

> 

> \[{"id":1,"name":"zs","age":18},{"id":2,"name":"ls","age":20}\]



### 9、pom



<?xml version="1.0" encoding="UTF-8"?>

<project xmlns=“http://maven.apache.org/POM/4.0.0”

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>



<parent>

    <groupId>com.guor</groupId>

    <artifactId>test-pom</artifactId>

    <version>1.0.0</version>

    <relativePath>../pom.xml</relativePath>

</parent>



<artifactId>test</artifactId>

<name>test</name>

<description>test</description>

<version>1.0.0</version>



<dependencies>

    <dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-web</artifactId>

    </dependency>

    <dependency>

        <groupId>org.mybatis.spring.boot</groupId>

        <artifactId>mybatis-spring-boot-starter</artifactId>

        <version>2.0.1</version>

    </dependency>

    <dependency>

        <groupId>org.postgresql</groupId>

        <artifactId>postgresql</artifactId>

    </dependency>

    <dependency>

        <groupId>commons-io</groupId>

        <artifactId>commons-io</artifactId>

        <version>2.5</version>

    </dependency>

    <dependency>

        <groupId>com.microsoft.sqlserver</groupId>

        <artifactId>mssql-jdbc</artifactId>

    </dependency>

    <dependency>

        <groupId>com.google.guava</groupId>

        <artifactId>guava</artifactId>

        <version>20.0</version>

    </dependency>

    <dependency>

        <groupId>cglib</groupId>

        <artifactId>cglib-nodep</artifactId>

        <version>3.2.4</version>

    </dependency>

    <dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-configuration-processor</artifactId>

        <optional>true</optional>

    </dependency>

    <dependency>

        <groupId>com.alibaba</groupId>

总结

无论是哪家公司,都很重视高并发高可用的技术,重视基础,重视JVM。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定适用于所有人,相信经过一些面试,大家都会有这些感触。

最后我整理了一些面试真题资料,技术知识点剖析教程,还有和广大同仁一起交流学习共同进步,还有一些职业经验的分享。

CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】

面试了阿里,滴滴,网易,蚂蚁,最终有幸去了网易【面试题分享】

    </dependency>

    <dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-configuration-processor</artifactId>

        <optional>true</optional>

    </dependency>

    <dependency>

        <groupId>com.alibaba</groupId>

总结

无论是哪家公司,都很重视高并发高可用的技术,重视基础,重视JVM。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定适用于所有人,相信经过一些面试,大家都会有这些感触。

最后我整理了一些面试真题资料,技术知识点剖析教程,还有和广大同仁一起交流学习共同进步,还有一些职业经验的分享。

CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】

[外链图片转存中…(img-zrUZ1bkY-1630925011407)]

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐