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();