Mybatis动态连接数据库
Mybatis动态连接数据库
根据url,用户名密码,手动连接数据库,而不是只能在项目启动的时候连接
参考:
/**
* 获取SqlSessionFactory
*/
private SqlSessionFactory getSqlSessionFactory(Long id) throws Exception {
DbInfo dbInfo = getById(id);
PooledDataSource dataSource = new PooledDataSource();
dataSource.setDriver("com.mysql.cj.jdbc.Driver");
dataSource.setUrl(String.format(JDBC_URL, dbInfo.getAddr(), dbInfo.getPort(), dbInfo.getDbName()));
dataSource.setUsername(dbInfo.getUName());
dataSource.setPassword(dbInfo.getUPass());
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
//配置mapper路径
Resource[] resources = resolver.getResources("classpath:/mapper/**/*.xml");
MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
sqlSessionFactoryBean.setMapperLocations(resources);
sqlSessionFactoryBean.setDataSource(dataSource);
sqlSessionFactoryBean.setConfiguration(new MybatisConfiguration());
return sqlSessionFactoryBean.getObject();
}
调用
- 调用mapper中的方法
public List<JSONObject> getAllTable(Long id) throws Exception {
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(id);
SqlSession sqlsession = sqlSessionFactory.openSession();
DbInfoMapper mapper = sqlsession.getMapper(DbInfoMapper.class);
List<JSONObject> sql = mapper.getList();
return sql;
}
- 通用的mapper
DynamicMapper
public interface DynamicMapper {
List<Map<String, Object>> selectSql(@Param("tableName") String tableName, @Param("fields") String fields, @Param("whereCondition") String whereCondition, @Param("orderCondition") String orderCondition);
Integer insertSql(@Param("tableName") String tableName, @Param("result") String result);
Integer updateSql(@Param("tableName") String tableName, @Param("result") String result, @Param("whereCondition") String whereCondition);
Integer deleteSql(@Param("tableName") String tableName, @Param("whereCondition") String whereCondition);
}
DynamicMapper.xml
<mapper namespace="com.camellibby.pangu.openapi.mapper.DynamicMapper">
<select id="selectSql" resultType="java.util.LinkedHashMap">
select ${fields} from ${tableName}
<if test="whereCondition != null and whereCondition != ''">
where ${whereCondition}
</if>
<if test="orderCondition != null and orderCondition != ''">
order by ${orderCondition}
</if>
</select>
<insert id="insertSql">
insert into ${tableName} ${result}
</insert>
<update id="updateSql">
UPDATE ${tableName} SET ${result} WHERE ${whereCondition}
</update>
<delete id="deleteSql">
delete from ${tableName} WHERE ${whereCondition}
</delete>
</mapper>
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(id);
SqlSession sqlsession = sqlSessionFactory.openSession();
DbInfoMapper mapper = sqlsession.getMapper(DbInfoMapper.class);
DynamicMapper dynamicMapper = sqlsession.getMapper(DynamicMapper.class);
List<Map<String, Object>> users = dynamicMapper.selectSql(
"users",
"username, password, enabled",
"enabled=0",
"username"
);
users.forEach(user -> user.keySet().forEach(key -> System.out.println(key + ":" + user.get(key))));
// 调用数据库操作方法
sqlsession.close();
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下