下面是详细讲解“Java SSH 秘钥连接mysql数据库的方法”的完整攻略,步骤如下:
在本地电脑上生成密钥文件,使用如下命令:
$ ssh-keygen -t rsa -b 2048
然后你会看到生成了两个文件:id_rsa
和 id_rsa.pub
,这两个文件一个是私钥,一个是公钥。将公钥文件 id_rsa.pub
发送给服务器管理员,并让他把公钥添加到服务器上的~/.ssh/authorized_keys
文件中。
在你的 Java 代码中需要使用 SSH 转发来访问远程 MySQL 服务器。你需要在本地启动 SSH 连接并配置端口转发(-forwarding)功能。假设你的私钥文件为 id_rsa
,服务器的 IP 地址为 123.123.123.123
,用户名为 root
,则可以使用如下命令:
$ ssh -i /path/to/id_rsa -fN -L 33306:localhost:3306 root@123.123.123.123
在这个命令中,-i
表示使用指定的私钥文件,-fN
表示将 SSH 连接作为守护进程在后台运行,并且不打开远程 shell。 -L
表示端口转发的本地端口 33306
将被转发到远程服务器的本地端口 3306
。
在 Java 代码中使用如下配置信息连接远程 MySQL 数据库:
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:33306/your_schema?autoReconnect=true&useSSL=false
spring.datasource.username=your_root_user_name
spring.datasource.password=your_root_password
spring.datasource.url
中的 localhost:33306
是转发后的本地端口号,your_schema
是你要连接的数据库名称。
下面给出两个示例说明。
一个名为 SSHDatabaseConnection
的类,连接远程的 MySQL 数据库,使用 Spring 框架的 JDBC 与数据库进行交互。代码如下:
import org.springframework.jdbc.datasource.DriverManagerDataSource;
public class SSHDatabaseConnection {
public static void main(String[] args) {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:33306/your_schema?autoReconnect=true&useSSL=false");
dataSource.setUsername("your_root_user_name");
dataSource.setPassword("your_root_password");
// ... 使用 Spring JDBC 进行相应的数据库操作 ...
}
}
使用 Mybatis 框架连接远程的 MySQL 数据库。代码中使用的是 Spring Boot 框架启动的应用。
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.sql.DataSource;
@Service
public class UserService {
@Autowired private DataSource dataSource;
@Autowired private DataSourceTransactionManager dataSourceTransactionManager;
@Autowired private MybatisSqlSessionFactoryBean mybatisSqlSessionFactoryBean;
@Transactional
public User getUser(long id) {
SqlSession sqlSession = mybatisSqlSessionFactoryBean.getObject().openSession(true);
try {
// 获取 mapper 实例
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
return userMapper.findById(id);
} finally {
sqlSession.close();
}
}
}
其中的 DataSource
和 DataSourceTransactionManager
的配置与示例 1 中相同,这里不再赘述。MybatisSqlSessionFactoryBean
是 Mybatis 框架提供的一个工厂 Bean,其配置如下:
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.stereotype.Component;
import javax.sql.DataSource;
import java.io.IOException;
@Component
public class MybatisSqlSessionFactoryBean extends SqlSessionFactoryBean {
@Autowired private DataSource dataSource;
@Override
public void afterPropertiesSet() throws Exception {
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
try {
// 扫描 Mybatis 配置文件
Resource[] resources = resolver.getResources("classpath:/mybatis/mapper/*.xml");
setDataSource(dataSource);
setMapperLocations(resources);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
这里将 Mybatis 的 mapper 配置文件放到 classpath:/mybatis/mapper/
目录下。Mybatis 的 mapper 配置文件与 Java 定义的 DAO 接口对应,所以还需要一个名为 UserMapper
的接口:
public interface UserMapper {
User findById(long id);
}
这个接口对应的查询语句需要写在 classpath:/mybatis/mapper/UserMapper.xml
文件中。
到此为止,我们就完成了使用 Java SSH 秘钥连接 MySQL 数据库的方法的攻略了。