Oracle数据库中使用java代码(Java Sources)
因为一些特殊的需求,需要将数据库中用户表的密码全部改为“用户名+指定字符”。所以将程序中加密算法改成java sources,函数调用,方便更新数据。
环境:Oracle 11g R2
一、java代码准备
java 代码如下
package com.xxxxsoft.xxxxxx.util;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class EncryptUtil {
/**
* 加密算法,网上搜索了一个,供测试用
* @param str 需要加密的字符串
* @return 加密后的字符串
*/
public static String md5crypt(String str) {
if ((((str == null) || (str.length() == 0)))) {
return "";
}
StringBuffer hexString = new StringBuffer();
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(str.getBytes());
byte[] hash = md.digest();
for (int i = 0; i < hash.length; ++i){
if ((0xFF & hash[i]) < 16) {
hexString.append("0" + Integer.toHexString(0xFF & hash[i]));
} else {
hexString.append(Integer.toHexString(0xFF & hash[i]));
}
}
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return hexString.toString();
}
public static void main(String[] args) {
System.out.println(md5crypt("1"));
// c4ca4238a0b923820dcc509a6f75849b
}
}
二、 将程序中加密算法改写成Java Sources
1、 第一行加入create or replace and compile java source named EncryptUtil as
。
- java source named,如上所示,我使用了java 类名(EncryptUtil),可自定义。
2、 第二行,包名。
- ①采用原代码中的包名:“package com.xxxxsoft.xxxxxx.util;”
- ②改写为其他内容,需遵循Java包(package)的命名规范;
- ③不写包名(下面function调用,注意包名不写即可)
java sources sql脚本如下
create or replace and compile java source named EncryptUtil as
package com.xxxxsoft.xxxxxx.util;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class EncryptUtil {
/**
* 加密算法,网上搜索了一个,供测试用
* @param str 需要加密的字符串,本案例仅有一个参数
* @return 加密后的字符串
*/
public static String md5crypt(String str) {
if ((((str == null) || (str.length() == 0)))) {
return "";
}
StringBuffer hexString = new StringBuffer();
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(str.getBytes());
byte[] hash = md.digest();
for (int i = 0; i < hash.length; ++i){
if ((0xFF & hash[i]) < 16) {
hexString.append("0" + Integer.toHexString(0xFF & hash[i]));
} else {
hexString.append(Integer.toHexString(0xFF & hash[i]));
}
}
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return hexString.toString();
}
public static void main(String[] args) {
System.out.println(md5crypt("1"));
}
}
三、创建function,用于调用java sources
本案例仅有一个参数(str:需要加密的字符串);
返回值为加密后的字符串
create or replace function func_get_password(str in STRING)
RETURN String is
-- 包名 + java sources name + 方法名(参数)
language java name 'com.xxxxsoft.xxxxxx.util.EncryptUtil.md5crypt(java.lang.String) return java.lang.String';
四、测试
分别用SQL和java 对字符串"1"进行加密。
- SQL查询
SELECT func_get_password('1') from dual ;
查询结果:c4ca4238a0b923820dcc509a6f75849b
- Java中调用
public static void main(String[] args) {
System.out.println(md5crypt("1"));
}
终端输出:c4ca4238a0b923820dcc509a6f75849b
- 如上所示,二者内容一致,oracle java sources成功!