dbutil.java,src/main/java/org/jeecgframework/core/util/DynamicDBUtil.java · keelau/jeecg - Gitee.com...

package org.jeecgframework.core.util;

import java.sql.SQLException;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import org.apache.commons.dbcp.BasicDataSource;

import org.apache.commons.lang.ArrayUtils;

import org.apache.log4j.Logger;

import org.jeecgframework.minidao.util.FreemarkerParseFactory;

import org.jeecgframework.web.system.pojo.base.DynamicDataSourceEntity;

import org.springframework.jdbc.core.JdbcTemplate;

import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;

/**

* Spring JDBC 实时数据库访问

*

* @author chenguobin

* @date 2014-09-05

* @version 1.0

*/

public class DynamicDBUtil {

private static final Logger logger = Logger.getLogger(DynamicDBUtil.class);

/**

* 多数据连接池

*/

private static Map dbSources = new HashMap();

/**

* 获取数据源【最底层方法,不要随便调用】

* @param dynamicSourceEntity

* @return

*/

@Deprecated

private static BasicDataSource getJdbcDataSource(final DynamicDataSourceEntity dynamicSourceEntity) {

BasicDataSource dataSource = new BasicDataSource();

String driverClassName = dynamicSourceEntity.getDriverClass();

String url = dynamicSourceEntity.getUrl();

String dbUser = dynamicSourceEntity.getDbUser();

//设置数据源的时候,要重新解密

//String dbPassword = dynamicSourceEntity.getDbPassword();

String dbPassword = PasswordUtil.decrypt(dynamicSourceEntity.getDbPassword(), dynamicSourceEntity.getDbUser(), PasswordUtil.getStaticSalt());//解密字符串;

dataSource.setDriverClassName(driverClassName);

dataSource.setUrl(url);

dataSource.setUsername(dbUser);

dataSource.setPassword(dbPassword);

return dataSource;

}

/**

* 通过dbkey,获取数据源

* @param dbKey

* @return

*/

public static BasicDataSource getDbSourceBydbKey(final String dbKey) {

//获取多数据源配置

DynamicDataSourceEntity dynamicSourceEntity = ResourceUtil.dynamicDataSourceMap.get(dbKey);

//先判断缓存中是否存在数据库链接

BasicDataSource cacheDbSource = dbSources.get(dbKey);

if(cacheDbSource!=null && !cacheDbSource.isClosed()){

return cacheDbSource;

}else{

BasicDataSource dataSource = getJdbcDataSource(dynamicSourceEntity);

dbSources.put(dbKey, dataSource);

return dataSource;

}

}

/**

* 关闭数据库连接池

* @param dbKey

* @return

* @return

*/

public static void closeDBkey(final String dbKey){

BasicDataSource dataSource = getDbSourceBydbKey(dbKey);

try {

if(dataSource!=null && !dataSource.isClosed()){

dataSource.getConnection().commit();

dataSource.getConnection().close();

dataSource.close();

}

} catch (SQLException e) {

e.printStackTrace();

}

}

private static JdbcTemplate getJdbcTemplate(String dbKey) {

BasicDataSource dataSource = getDbSourceBydbKey(dbKey);

JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

return jdbcTemplate;

}

/**

* Executes the SQL statement in this PreparedStatement object,

* which must be an SQL Data Manipulation Language (DML) statement, such as INSERT, UPDATE or

* DELETE; or an SQL statement that returns nothing,

* such as a DDL statement.

*/

public static int update(final String dbKey, String sql, Object... param)

{

int effectCount = 0;

JdbcTemplate jdbcTemplate = getJdbcTemplate(dbKey);

if (ArrayUtils.isEmpty(param)) {

effectCount = jdbcTemplate.update(sql);

} else {

effectCount = jdbcTemplate.update(sql, param);

}

return effectCount;

}

/**

* 支持miniDao语法操作的Update

* @param dbKey 数据源标识

* @param sql 执行sql语句,sql支持minidao语法逻辑

* @param data sql语法中需要判断的数据及sql拼接注入中需要的数据

* @return

*/

public static int updateByHash(final String dbKey, String sql, HashMap data){

int effectCount = 0;

JdbcTemplate jdbcTemplate = getJdbcTemplate(dbKey);

//根据模板获取sql

sql = FreemarkerParseFactory.parseTemplateContent(sql, data);

NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate.getDataSource());

effectCount = namedParameterJdbcTemplate.update(sql, data);

return effectCount;

}

public static Object findOne(final String dbKey, String sql, Object... param) {

List> list;

list = findList(dbKey, sql, param);

if(ListUtils.isNullOrEmpty(list))

{

logger.error("Except one, but not find actually");

}

if(list.size() > 1)

{

logger.error("Except one, but more than one actually");

}

return list.get(0);

}

/**

* 支持miniDao语法操作的查询 返回HashMap

* @param dbKey 数据源标识

* @param sql 执行sql语句,sql支持minidao语法逻辑

* @param data sql语法中需要判断的数据及sql拼接注入中需要的数据

* @return

*/

public static Object findOneByHash(final String dbKey, String sql, HashMap data){

List> list;

list = findListByHash(dbKey, sql, data);

if(ListUtils.isNullOrEmpty(list)){

logger.error("Except one, but not find actually");

}

if(list.size() > 1){

logger.error("Except one, but more than one actually");

}

return list.get(0);

}

/**

* 直接sql查询 根据clazz返回单个实例

* @param dbKey 数据源标识

* @param sql 执行sql语句

* @param clazz 返回实例的Class

* @param param

* @return

*/

@SuppressWarnings("unchecked")

public static Object findOne(final String dbKey, String sql, Class clazz, Object... param) {

Map map = (Map) findOne(dbKey, sql, param);

return ReflectHelper.setAll(clazz, map);

}

/**

* 支持miniDao语法操作的查询 返回单个实例

* @param dbKey 数据源标识

* @param sql 执行sql语句,sql支持minidao语法逻辑

* @param clazz 返回实例的Class

* @param data sql语法中需要判断的数据及sql拼接注入中需要的数据

* @return

*/

@SuppressWarnings("unchecked")

public static Object findOneByHash(final String dbKey, String sql, Class clazz, HashMap data) {

Map map = (Map) findOneByHash(dbKey, sql, data);

return ReflectHelper.setAll(clazz, map);

}

public static List> findList(final String dbKey, String sql, Object... param) {

List> list;

JdbcTemplate jdbcTemplate = getJdbcTemplate(dbKey);

if (ArrayUtils.isEmpty(param)) {

list = jdbcTemplate.queryForList(sql);

} else {

list = jdbcTemplate.queryForList(sql, param);

}

return list;

}

/**

* 支持miniDao语法操作的查询

* @param dbKey 数据源标识

* @param sql 执行sql语句,sql支持minidao语法逻辑

* @param data sql语法中需要判断的数据及sql拼接注入中需要的数据

* @return

*/

public static List> findListByHash(final String dbKey, String sql, HashMap data){

List> list;

JdbcTemplate jdbcTemplate = getJdbcTemplate(dbKey);

//根据模板获取sql

sql = FreemarkerParseFactory.parseTemplateContent(sql, data);

NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate.getDataSource());

list = namedParameterJdbcTemplate.queryForList(sql, data);

return list;

}

//此方法只能返回单列,不能返回实体类

public static List findList(final String dbKey, String sql, Class clazz,Object... param) {

List list;

JdbcTemplate jdbcTemplate = getJdbcTemplate(dbKey);

if (ArrayUtils.isEmpty(param)) {

list = jdbcTemplate.queryForList(sql,clazz);

} else {

list = jdbcTemplate.queryForList(sql,clazz,param);

}

return list;

}

/**

* 支持miniDao语法操作的查询 返回单列数据list

* @param dbKey 数据源标识

* @param sql 执行sql语句,sql支持minidao语法逻辑

* @param clazz 类型Long、String等

* @param data sql语法中需要判断的数据及sql拼接注入中需要的数据

* @return

*/

public static List findListByHash(final String dbKey, String sql, Class clazz, HashMap data){

List list;

JdbcTemplate jdbcTemplate = getJdbcTemplate(dbKey);

//根据模板获取sql

sql = FreemarkerParseFactory.parseTemplateContent(sql, data);

NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate.getDataSource());

list = namedParameterJdbcTemplate.queryForList(sql, data, clazz);

return list;

}

/**

* 直接sql查询 返回实体类列表

* @param dbKey 数据源标识

* @param sql 执行sql语句,sql支持minidao语法逻辑

* @param clazz 返回实体类列表的class

* @param param sql拼接注入中需要的数据

* @return

*/

public static List findListEntrys(final String dbKey, String sql, Class clazz, Object... param){

List> queryList = findList(dbKey, sql, param);

return ReflectHelper.transList2Entrys(queryList, clazz);

}

/**

* 支持miniDao语法操作的查询 返回实体类列表

* @param dbKey 数据源标识

* @param sql 执行sql语句,sql支持minidao语法逻辑

* @param clazz 返回实体类列表的class

* @param data sql语法中需要判断的数据及sql拼接注入中需要的数据

* @return

*/

public static List findListEntrysByHash(final String dbKey, String sql, Class clazz, HashMap data){

List> queryList = findListByHash(dbKey, sql, data);

return ReflectHelper.transList2Entrys(queryList, clazz);

}

@SuppressWarnings("unchecked")

public static void main(String[] args) {

DynamicDataSourceEntity dynamicSourceEntity = new DynamicDataSourceEntity();

String dbKey = "SAP_DB";

String driverClassName = "com.mysql.jdbc.Driver";

String url = "jdbc:mysql://localhost:3306/jeecg";

String dbUser = "root";

String dbPassword = "root";

dynamicSourceEntity.setDbKey(dbKey);

dynamicSourceEntity.setDriverClass(driverClassName);

dynamicSourceEntity.setUrl(url);

dynamicSourceEntity.setDbUser(dbUser);

dynamicSourceEntity.setDbPassword(dbPassword);

ResourceUtil.dynamicDataSourceMap.put(dbKey, dynamicSourceEntity);

String sql = " insert into GWYUTEST003(id, sname, nlevel) values ((select maxid from (select ifnull(max(id)+1,1) maxid from GWYUTEST003) a),"

+ " :sname, :nlevel)#if>";

HashMap data = new HashMap();

data.put("sname", "aaa");

data.put("nlevel", 3);

DynamicDBUtil.updateByHash(dbKey, sql, data);

sql = "SELECT * FROM GWYUTEST003 WHERE id = :id";data = new HashMap();

data.put("id", 1);

Map aaa = (Map) DynamicDBUtil.findOneByHash(dbKey, sql, data);

System.out.println(aaa.get("sname"));

sql = "SELECT * FROM GWYUTEST003 WHERE id >= '${id}'";data = new HashMap();

data.put("id", 2);

List bbb = DynamicDBUtil.findListEntrysByHash(dbKey, sql, GwyuTest.class, data);

System.out.println(bbb);

//List> list = DynamicDBUtil.getList(jdbcTemplate, sql);

//System.out.println(list.size());

}

public static class GwyuTest{

public GwyuTest(){}

private long id;

private String sname;

private long nlevel;

public long getId() {

return id;

}

public void setId(long id) {

this.id = id;

}

public String getSname() {

return sname;

}

public void setSname(String sname) {

this.sname = sname;

}

public long getNlevel() {

return nlevel;

}

public void setNlevel(long nlevel) {

this.nlevel = nlevel;

}

}

}

一键复制

编辑

原始数据

按行查看

历史

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值