需求来源
近期由于项目的图片服务器迁移导致大量写死在数据库中图片路径需要修改。
实现思路
通过百度了解到可以通过mysql的REPLACE
函数来进行局部替换数据内容,类似这样的语句:
"UPDATE "+tableName+" SET "+column+" = REPLACE ( "+column + ",'"+oldValue+"','" +newValue+"')"
。
版本演化一
我们了解基本实现思路,那么进行简单的数据替换就没问题了。比如本来的数据是这样http://www.oldImage.com/upload/image/1.jpg
需要改成http://www.newImage.com/upload/image/1.jpg
,你应该知道如何实现了吗?好了,我们开始慢慢实现我们的小工具。首先,我们把基础设施搭建好,定义好SQLUtils类:
public class SQLUtils {
/**
* 数据源
*/
private final DruidDataSource ds;
/**
* 表和列集合
*/
private Map<String, List<String>> table_column;
/**
* 日志工具类
*/
private Logger log = LoggerFactory.getLogger(SQLUtils.class);
/**
* 初始化数据源
*
* @param db 数据库
* @param username 用户名
* @param password 密码
*/
public SQLUtils(String db, String username, String password) {
ds = new DruidDataSource();
ds.setUrl(db);
ds.setUsername(username);
ds.setPassword(password);
initTableAndColumn(true);
}
}
然后我们再来定义一个替换数据的方法:
/**
* 部分替换数据
* @param tableName
* 表名
* @param column
* 列名
* @param oldValue
* 旧值
* @param newValue
* 新值
*/
public void update(String tableName,String column, String oldValue, String newValue) {
Connection conn = null;
try {
conn = ds.getConnection();
// 拼接sql
String sql = "UPDATE " + tableName + " SET " + column + " = REPLACE ( " + column + ",'" + oldValue + "','" + newValue + "')";
// 日志输出
log.info("sql:{}", sql);
int count = SqlExecutor.execute(conn, sql);
log.info("影响行数:{}", count);
} catch (SQLException e) {
log.error(e.getMessage());
} finally {
DbUtil.close(conn);
}
}
接着来看看我们的入口函数:
/**
* 执行器
*
* @param args
*/
public static void main(String[] args) {
String db = "jdbc:mysql:///test"; // 数据源
String username = "root"; // 用户名
String password = "root"; // 密码
String tableName = "ad"; // 表名
String column = "path"; // 列名
String oldValue = "oldImage.com"; // 旧值
String newValue = "newImage.com"; // 新值
SQLUtils sqlUtils = new SQLUtils(db, username, password);
sqlUtils.batchExecute(tableName,column,oldValue, newValue);
}
通过以上代码可以实现单条数据的修改。
版本演化二猜想
但是,如果数据库中存在大量这样的数据,比如说一个电商网站的商品图片地址,这样一条一条地修改数据恐怕你会疯掉,如果图片服务器再次迁移恐怕你要跑路了。那么我们如何批量修改呢?今天现在写到这里。。。。