package com.walker.connector.support;
import com.walker.connector.AbstractConnector;
import com.walker.db.DatabaseException;
import com.walker.db.DatabaseExistException;
import com.walker.db.DatabaseType;
import com.walker.db.page.GenericPager;
import com.walker.db.page.ListPageContext;
import com.walker.infrastructure.utils.StringUtils;
import com.walker.jdbc.ds.MyDruidDataSource;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import javax.sql.DataSource;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
/**
* 基于数据库实现的连接器对象,目前仅能查询数据集合
* @author shikeying
* @date 2015年12月15日
*
*/
public abstract class DatabaseConnector extends AbstractConnector {
public static final String OPTION_USER = "user";
public static final String OPTION_PASSWORD = "password";
public static final String OPTION_MAX_ACTIVE = "maxActive";
public static final String OPTION_MAX_IDLE = "maxIdle";
public static final String OPTION_INIT_SIZE = "initialSize";
public static final String SQL_CREATE_DB_PREF = "CREATE DATABASE ";
public static final String SQL_CREATE_DB_SUF = " DEFAULT CHARSET utf8 COLLATE utf8_general_ci;";
// private SupportDBTypeDataSource dataSource = null;
// 2023-05-08 统一使用平台配置数据源,不再创建独立数据源。
// private DataSource dataSource = null;
protected JdbcTemplate jdbcTemplate = null;
protected NamedParameterJdbcTemplate namedJdbcTemplate;
/* 管理模式:不设置数据库名字,可以创建数据库,应该也可以管理 */
private boolean manageMode = false;
private DataSource dataSource = null;
/**
* 没有数据源,只能通过设置参数方式初始化连接器,最后要调用{@link this.initialize()}方法初始化
*/
public DatabaseConnector(){}
/**
* 如果从外部传入数据源,则通过构造函数直接创建即可。
* @param dataSource
*/
public DatabaseConnector(DataSource dataSource){
if(dataSource == null){
throw new IllegalArgumentException("dataSource必须设置!");
}
this.dataSource = dataSource;
jdbcTemplate = new JdbcTemplate(dataSource);
namedJdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
}
public DataSource getDataSource() {
// return (DataSource) JdbcInspector.getInstance().getPrimaryDataSourceMeta();
return this.dataSource;
}
public JdbcTemplate getJdbcTemplate() {
return jdbcTemplate;
}
public NamedParameterJdbcTemplate getNamedJdbcTemplate() {
return namedJdbcTemplate;
}
/**
* 返回是否管理模式,管理模式中没有数据库名字,用于处理各种数据库命令
* @return
*/
public boolean isManageMode() {
return manageMode;
}
/**
* 设置为管理模式:没有数据库名字
*/
public void setManageMode() {
this.manageMode = true;
this.setServiceName(StringUtils.EMPTY_STRING);
}
/**
* 执行命令:创建数据库
* @param databaseName
* @throws DatabaseException
*/
public void exeCreateDatabase(String databaseName) throws DatabaseException {
try{
jdbcTemplate.execute(new StringBuilder()
.append(SQL_CREATE_DB_PREF)
.append(databaseName)
.append(SQL_CREATE_DB_SUF).toString());
} catch(DataAccessException ex){
SQLException sqlEx = (SQLException)ex.getRootCause();
if(sqlEx.getErrorCode() == 1007){
throw new DatabaseExistException(databaseName);
} else
throw new DatabaseException("createDatabase异常", ex);
}
}
/**
* 根据SQL语句创建表结构
* @param sql
* @throws DatabaseException
*/
public void exeCreateTable(String sql) throws DatabaseException{
try{
jdbcTemplate.execute(sql);
logger.debug("执行创建表SQL = " + sql);
} catch(DataAccessException ex){
// SQLException sqlEx = (SQLException)ex.getRootCause();
// if(sqlEx.getErrorCode() == 1007){
// throw new DatabaseExistException("ddddddd");
// } else
throw new DatabaseException("createTable异常", ex);
}
}
/**
* 批量写入数据库记录
* @param sql
* @param spsArray
* @transaction 注意:方法名前缀为"exec"的会走事务处理,不过需要在DatabaseStore中设置参数
*/
public int execBatchInsert(String sql, MapSqlParameterSource[] spsArray){
int[] res = namedJdbcTemplate.batchUpdate(sql, spsArray);
return res[0];
}
/**
* 使用JdbcTemplate
实现批量更新。
* 通过?替换变量数据即可。
* @param sql
* @param batchArgs
*/
public void execBatchUpdateForJdbc(String sql, List