转载请注明出处:/linglongxin24/article/details/53750584
本文出自【DylanAndroid的博客】
玩转JDBC打造数据库操作万能工具类JDBCUtil,加入了高效的数据库连接池,利用了参数绑定有效防止SQL注入
在之前学习了MySQL和Oracle之后,那么,如和在Java种去连接这两种数据库。在这个轻量级的工具类当中,使用了数据库连接池
去提高数据库连接的高效性,并且使用了PreparedStatement来执行对SQL的预编译,能够有效防止SQL注入问题。
一.准备在配置文件配置:配置数据库连接属性文件:在项目新建config包下建立并加入以下配置
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8
jdbc.username=root
jdbc.password=root
二.准备数据库连接池对象:单例
package util;
import .v2.;
import .v2.;
import ;
import ;
import ;
import ;
import ;
import ;
/**
* 数据库连接对象
* Created by yuandl on 2016-12-16.
*/
public class DBConnectionPool {
private static volatile DBConnectionPool dbConnection;
private ComboPooledDataSource cpds;
/**
* 在构造函数初始化的时候获取数据库连接
*/
private DBConnectionPool() {
try {
/**通过属性文件获取数据库连接的参数值**/
Properties properties = new Properties();
FileInputStream fileInputStream = new FileInputStream("src/config/");
(fileInputStream);
/**获取属性文件中的值**/
String driverClassName = ("");
String url = ("");
String username = ("");
String password = ("");
/**数据库连接池对象**/
cpds = new ComboPooledDataSource();
/**设置数据库连接驱动**/
(driverClassName);
/**设置数据库连接地址**/
(url);
/**设置数据库连接用户名**/
(username);
/**设置数据库连接密码**/
(password);
/**初始化时创建的连接数,应在minPoolSize与maxPoolSize之间取值.默认为3**/
(3);
/**连接池中保留的最大连接数据.默认为15**/
(10);
/**当连接池中的连接用完时,C3PO一次性创建新的连接数目;**/
(1);
/**隔多少秒检查所有连接池中的空闲连接,默认为0表示不检查;**/
(60);
/**最大空闲时间,超过空闲时间的连接将被丢弃.为0或负数据则永不丢弃.默认为0;**/
(3000);
/**因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的
时候都将校验其有效性。建议使用idleConnectionTestPeriod或automaticTestTable
等方法来提升连接测试的性能。Default: false**/
(true);
/**如果设为true那么在取得连接的同时将校验连接的有效性。Default: false **/
(true);
/**定义在从数据库获取新的连接失败后重复尝试获取的次数,默认为30;**/
(30);
/**两次连接中间隔时间默认为1000毫秒**/
(1000);
/** 获取连接失败将会引起所有等待获取连接的线程异常,
但是数据源仍有效的保留,并在下次调用getConnection()的时候继续尝试获取连接.如果设为true,
那么尝试获取连接失败后该数据源将申明已经断开并永久关闭.默认为false**/
(true);
} catch (IOException e) {
();
} catch (PropertyVetoException e) {
();
}
}
/**
* 获取数据库连接对象,单例
*
* @return
*/
public static DBConnectionPool getInstance() {
if (dbConnection == null) {
synchronized () {
if (dbConnection == null) {
dbConnection = new DBConnectionPool();
}
}
}
return dbConnection;
}
/**
* 获取数据库连接
*
* @return 数据库连接
*/
public final synchronized Connection getConnection() throws SQLException {
return ();
}
/**
* finalize()方法是在垃圾收集器删除对象之前对这个对象调用的。
*
* @throws Throwable
*/
protected void finalize() throws Throwable {
(cpds);
super.finalize();
}
}
三.实现新增、修改、删除、查询操作的两个核心方法:可以实现任何复杂的SQL,而且通过数据绑定的方式不会有SQL注入问题
/**
* 可以执行新增,修改,删除
*
* @param sql sql语句
* @param bindArgs 绑定参数
* @return 影响的行数
* @throws SQLException SQL异常
*/
public static int executeUpdate(String sql, Object[] bindArgs) throws SQLException {
/**影响的行数**/
int affectRowCount = -1;
Connection connection = null;
PreparedStatement preparedStatement = null;
try {
/**从数据库连接池中获取数据库连接**/
connection = ().getConnection();
/**执行SQL预编译**/
preparedStatement = (());
/**设置不自动提交,以便于在出现异常的时候数据库回滚**/
(false);
(getExecSQL(sql, bindArgs));
if (bindArgs != null) {
/**绑定参数设置sql占位符中的值**/
for (int i = 0; i < ; i++) {
(i + 1, bindArgs[i]);
}
}
/**执行sql**/
affectRowCount = ();
();
String operate;
if (().indexOf("DELETE FROM") != -1) {
operate = "删除";
} else if (().indexOf("INSERT INTO") != -1) {
operate = "新增";
} else {
operate = "修改";
}
("成功" + operate + "了" + affectRowCount + "行");
();
} catch (Exception e) {
if (connection != null) {
();
}
();
throw e;
} finally {
if (preparedStatement != null) {
();
}
if (connection != null) {
();
}
}
return affectRowCount;
}
/**
* 执行查询
*
* @param sql 要执行的sql语句
* @param bindArgs 绑定的参数
* @return List<Map<String, Object>>结果集对象
* @throws SQLException SQL执行异常
*/
public static List<Map<String, Object>> executeQuery(String sql, Object[] bindArgs) throws SQLException {
List<Map<String, Object>> datas = new ArrayList<>();
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
/**获取数据库连接池中的连接**/
connection = ().getConnection();
preparedStatement = (sql);
if (bindArgs != null) {
/**设置sql占位符中的值**/
for (int i = 0; i < ; i++) {
(i + 1, bindArgs[i]);
}
}
(getExecSQL(sql, bindArgs));
/**执行sql语句,获取结果集**/
resultSet = ();
getDatas(resultSet);
();
} catch (Exception e) {
();
throw e;
} finally {
if (resultSet != null) {
();
}
if (preparedStatement != null) {
();
}
if (connection != null) {
();
}
}
return datas;
}
四.执行新增的简化操作
/**
* 执行数据库插入操作
*
* @param valueMap 插入数据表中key为列名和value为列对应的值的Map对象
* @param tableName 要插入的数据库的表名
* @return 影响的行数
* @throws SQLException SQL异常
*/
public static int insert(String tableName, Map<String, Object> valueMap) throws SQLException {
/**获取数据库插入的Map的键值对的值**/
Set<String> keySet = ();
Iterator<String> iterator = ();
/**要插入的字段sql,其实就是用key拼起来的**/
StringBuilder columnSql = new StringBuilder();
/**要插入的字段值,其实就是?**/
StringBuilder unknownMarkSql = new StringBuilder();
Object[] bindArgs = new Object[()];
int i = 0;
while (()) {
String key = ();
(i == 0 ? "" : ",");
(key);
(i == 0 ? "" : ",");
("?");
bindArgs[i] = (key);
i++;
}
/**开始拼插入的sql语句**/
StringBuilder sql = new StringBuilder();
("INSERT INTO ");
(tableName);
(" (");
(columnSql);
(" ) VALUES (");
(unknownMarkSql);
(" )");
return executeUpdate((), bindArgs);
}
五.执行更新的简化操作
/**
* 执行更新操作
*
* @param tableName 表名
* @param valueMap 要更改的值
* @param whereMap 条件
* @return 影响的行数
* @throws SQLException SQL异常
*/
public static int update(String tableName, Map<String, Object> valueMap, Map<String, Object> whereMap) throws SQLException {
/**获取数据库插入的Map的键值对的值**/
Set<String> keySet = ();
Iterator<String> iterator = ();
/**开始拼插入的sql语句**/
StringBuilder sql = new StringBuilder();
("UPDATE ");
(tableName);
(" SET ");
/**要更改的的字段sql,其实就是用key拼起来的**/
StringBuilder columnSql = new StringBuilder();
int i = 0;
List<Object> objects = new ArrayList<>();
while (()) {
String key = ();
(i == 0 ? "" : ",");
(key + " = ? ");
((key));
i++;
}
(columnSql);
/**更新的条件:要更改的的字段sql,其实就是用key拼起来的**/
StringBuilder whereSql = new StringBuilder();
int j = 0;
if (whereMap != null && () > 0) {
(" WHERE ");
iterator = ().iterator();
while (()) {
String key = ();
(j == 0 ? "" : " AND ");
(key + " = ? ");
((key));
j++;
}
(whereSql);
}
return executeUpdate((), ());
}
六.执行删除的简化操作
/**
* 执行删除操作
*
* @param tableName 要删除的表名
* @param whereMap 删除的条件
* @return 影响的行数
* @throws SQLException SQL执行异常
*/
public static int delete(String tableName, Map<String, Object> whereMap) throws SQLException {
/**准备删除的sql语句**/
StringBuilder sql = new StringBuilder();
("DELETE FROM ");
(tableName);
/**更新的条件:要更改的的字段sql,其实就是用key拼起来的**/
StringBuilder whereSql = new StringBuilder();
Object[] bindArgs = null;
if (whereMap != null && () > 0) {
bindArgs = new Object[()];
(" WHERE ");
/**获取数据库插入的Map的键值对的值**/
Set<String> keySet = ();
Iterator<String> iterator = ();
int i = 0;
while (()) {
String key = ();
(i == 0 ? "" : " AND ");
(key + " = ? ");
bindArgs[i] = (key);
i++;
}
(whereSql);
}
return executeUpdate((), bindArgs);
}
七.查询的4种玩法
1.执行sql通过 Map
import ;
import ;
import ;
import ;
import ;
import ;
/**
* Created by yuandl on 2016-12-16.
*/
public class DBTest {
public static void main(String[] args) {
("数据库的原数据");
testQuery3();
testInsert();
("执行插入后的数据");
testQuery3();
testUpdate();
("执行修改后的数据");
testQuery3();
testDelete();
("执行删除后的数据");
testQuery3();
("带条件的查询1");
testQuery2();
("带条件的查询2");
testQuery1();
}
/**
* 测试插入
*/
private static void testInsert() {
Map<String, Object> map = new HashMap<>();
("emp_id", 1013);
("name", "JDBCUtil测试");
("job", "developer");
("salary", 10000);
("hire_date", new (()));
try {
int count = ("emp_test", map);
} catch (SQLException e) {
();
}
}
/**
* 测试更新
*/
private static void testUpdate() {
Map<String, Object> map = new HashMap<>();
("name", "测试更新");
Map<String, Object> whereMap = new HashMap<>();
("emp_id", "1013");
try {
int count = ("emp_test", map, whereMap);
} catch (SQLException e) {
();
}
}
/**
* 测试删除
*/
private static void testDelete() {
Map<String, Object> whereMap = new HashMap<>();
("emp_id", 1013);
("job", "developer");
try {
int count = ("emp_test", whereMap);
} catch (SQLException e) {
();
}
}
/**
* 查询方式一
*/
public static void testQuery1() {
Map<String,Object> whereMap=new HashMap<>();
("salary","10000");
try {
("emp_test",whereMap);
} catch (SQLException e) {
();
}
}
/**
* 查询方式二
*/
public static void testQuery2() {
String where = "job = ? AND salary = ? ";
String[] whereArgs = new String[]{"clerk", "3000"};
try {
List<Map<String, Object>> list = ("emp_test", where, whereArgs);
} catch (SQLException e) {
();
}
}
/**
* 查询方式三
*/
public static void testQuery3() {
try {
List<Map<String, Object>> list = ("emp_test", false, null, null, null, null, null, null, null);
} catch (SQLException e) {
();
}
}
}
- 打印结果
数据库的原数据
SELECT * FROM emp_test
成功查询到了14行数据
第1行:{DEPT_TEST_ID=10, EMP_ID=1001, SALARY=10000, HIRE_DATE=2010-01-12, BONUS=2000, MANAGER=1005, JOB=Manager, NAME=张无忌}
第2行:{DEPT_TEST_ID=10, EMP_ID=1002, SALARY=8000, HIRE_DATE=2011-01-12, BONUS=1000, MANAGER=1001, JOB=Analyst, NAME=刘苍松}
第3行:{DEPT_TEST_ID=10, EMP_ID=1003, SALARY=9000, HIRE_DATE=2010-02-11, BONUS=1000, MANAGER=1001, JOB=Analyst, NAME=李翊}
第4行:{DEPT_TEST_ID=10, EMP_ID=1004, SALARY=5000, HIRE_DATE=2010-02-11, BONUS=null, MANAGER=1001, JOB=Programmer, NAME=郭芙蓉}
第5行:{DEPT_TEST_ID=20, EMP_ID=1005, SALARY=15000, HIRE_DATE=2008-02-15, BONUS=null, MANAGER=null, JOB=President, NAME=张三丰}
第6行:{DEPT_TEST_ID=20, EMP_ID=1006, SALARY=5000, HIRE_DATE=2009-02-01, BONUS=400, MANAGER=1005, JOB=Manager, NAME=燕小六}
第7行:{DEPT_TEST_ID=20, EMP_ID=1007, SALARY=3000, HIRE_DATE=2009-02-01, BONUS=500, MANAGER=1006, JOB=clerk, NAME=陆无双}
第8行:{DEPT_TEST_ID=30, EMP_ID=1008, SALARY=5000, HIRE_DATE=2009-05-01, BONUS=500, MANAGER=1005, JOB=Manager, NAME=黄蓉}
第9行:{DEPT_TEST_ID=30, EMP_ID=1009, SALARY=4000, HIRE_DATE=2009-02-20, BONUS=null, MANAGER=1008, JOB=salesman, NAME=韦小宝}
第10行:{DEPT_TEST_ID=30, EMP_ID=1010, SALARY=4500, HIRE_DATE=2009-05-10, BONUS=500, MANAGER=1008, JOB=salesman, NAME=郭靖}
第11行:{DEPT_TEST_ID=null, EMP_ID=1011, SALARY=null, HIRE_DATE=null, BONUS=null, MANAGER=null, JOB=null, NAME=于泽成}
第12行:{DEPT_TEST_ID=null, EMP_ID=1012, SALARY=null, HIRE_DATE=2011-08-10, BONUS=null, MANAGER=null, JOB=null, NAME=amy}
第13行:{DEPT_TEST_ID=null, EMP_ID=1014, SALARY=8000, HIRE_DATE=null, BONUS=null, MANAGER=null, JOB=null, NAME=张无忌}
第14行:{DEPT_TEST_ID=20, EMP_ID=1015, SALARY=null, HIRE_DATE=null, BONUS=null, MANAGER=null, JOB=null, NAME=刘苍松}
INSERT INTO emp_test (name,hire_date,job,salary,emp_id ) VALUES (JDBCUtil测试,2016-12-17,developer,10000,1013 )
成功新增了1行
执行插入后的数据
SELECT * FROM emp_test
成功查询到了15行数据
第1行:{DEPT_TEST_ID=10, EMP_ID=1001, SALARY=10000, HIRE_DATE=2010-01-12, BONUS=2000, MANAGER=1005, JOB=Manager, NAME=张无忌}
第2行:{DEPT_TEST_ID=10, EMP_ID=1002, SALARY=8000, HIRE_DATE=2011-01-12, BONUS=1000, MANAGER=1001, JOB=Analyst, NAME=刘苍松}
第3行:{DEPT_TEST_ID=10, EMP_ID=1003, SALARY=9000, HIRE_DATE=2010-02-11, BONUS=1000, MANAGER=1001, JOB=Analyst, NAME=李翊}
第4行:{DEPT_TEST_ID=10, EMP_ID=1004, SALARY=5000, HIRE_DATE=2010-02-11, BONUS=null, MANAGER=1001, JOB=Programmer, NAME=郭芙蓉}
第5行:{DEPT_TEST_ID=20, EMP_ID=1005, SALARY=15000, HIRE_DATE=2008-02-15, BONUS=null, MANAGER=null, JOB=President, NAME=张三丰}
第6行:{DEPT_TEST_ID=20, EMP_ID=1006, SALARY=5000, HIRE_DATE=2009-02-01, BONUS=400, MANAGER=1005, JOB=Manager, NAME=燕小六}
第7行:{DEPT_TEST_ID=20, EMP_ID=1007, SALARY=3000, HIRE_DATE=2009-02-01, BONUS=500, MANAGER=1006, JOB=clerk, NAME=陆无双}
第8行:{DEPT_TEST_ID=30, EMP_ID=1008, SALARY=5000, HIRE_DATE=2009-05-01, BONUS=500, MANAGER=1005, JOB=Manager, NAME=黄蓉}
第9行:{DEPT_TEST_ID=30, EMP_ID=1009, SALARY=4000, HIRE_DATE=2009-02-20, BONUS=null, MANAGER=1008, JOB=salesman, NAME=韦小宝}
第10行:{DEPT_TEST_ID=30, EMP_ID=1010, SALARY=4500, HIRE_DATE=2009-05-10, BONUS=500, MANAGER=1008, JOB=salesman, NAME=郭靖}
第11行:{DEPT_TEST_ID=null, EMP_ID=1011, SALARY=null, HIRE_DATE=null, BONUS=null, MANAGER=null, JOB=null, NAME=于泽成}
第12行:{DEPT_TEST_ID=null, EMP_ID=1012, SALARY=null, HIRE_DATE=2011-08-10, BONUS=null, MANAGER=null, JOB=null, NAME=amy}
第13行:{DEPT_TEST_ID=null, EMP_ID=1014, SALARY=8000, HIRE_DATE=null, BONUS=null, MANAGER=null, JOB=null, NAME=张无忌}
第14行:{DEPT_TEST_ID=20, EMP_ID=1015, SALARY=null, HIRE_DATE=null, BONUS=null, MANAGER=null, JOB=null, NAME=刘苍松}
第15行:{DEPT_TEST_ID=null, EMP_ID=1013, SALARY=10000, HIRE_DATE=2016-12-17, BONUS=null, MANAGER=null, JOB=developer, NAME=JDBCUtil测试}
UPDATE emp_test SET name = 测试更新 WHERE emp_id = 1013
成功修改了1行
执行修改后的数据
SELECT * FROM emp_test
成功查询到了15行数据
第1行:{DEPT_TEST_ID=10, EMP_ID=1001, SALARY=10000, HIRE_DATE=2010-01-12, BONUS=2000, MANAGER=1005, JOB=Manager, NAME=张无忌}
第2行:{DEPT_TEST_ID=10, EMP_ID=1002, SALARY=8000, HIRE_DATE=2011-01-12, BONUS=1000, MANAGER=1001, JOB=Analyst, NAME=刘苍松}
第3行:{DEPT_TEST_ID=10, EMP_ID=1003, SALARY=9000, HIRE_DATE=2010-02-11, BONUS=1000, MANAGER=1001, JOB=Analyst, NAME=李翊}
第4行:{DEPT_TEST_ID=10, EMP_ID=1004, SALARY=5000, HIRE_DATE=2010-02-11, BONUS=null, MANAGER=1001, JOB=Programmer, NAME=郭芙蓉}
第5行:{DEPT_TEST_ID=20, EMP_ID=1005, SALARY=15000, HIRE_DATE=2008-02-15, BONUS=null, MANAGER=null, JOB=President, NAME=张三丰}
第6行:{DEPT_TEST_ID=20, EMP_ID=1006, SALARY=5000, HIRE_DATE=2009-02-01, BONUS=400, MANAGER=1005, JOB=Manager, NAME=燕小六}
第7行:{DEPT_TEST_ID=20, EMP_ID=1007, SALARY=3000, HIRE_DATE=2009-02-01, BONUS=500, MANAGER=1006, JOB=clerk, NAME=陆无双}
第8行:{DEPT_TEST_ID=30, EMP_ID=1008, SALARY=5000, HIRE_DATE=2009-05-01, BONUS=500, MANAGER=1005, JOB=Manager, NAME=黄蓉}
第9行:{DEPT_TEST_ID=30, EMP_ID=1009, SALARY=4000, HIRE_DATE=2009-02-20, BONUS=null, MANAGER=1008, JOB=salesman, NAME=韦小宝}
第10行:{DEPT_TEST_ID=30, EMP_ID=1010, SALARY=4500, HIRE_DATE=2009-05-10, BONUS=500, MANAGER=1008, JOB=salesman, NAME=郭靖}
第11行:{DEPT_TEST_ID=null, EMP_ID=1011, SALARY=null, HIRE_DATE=null, BONUS=null, MANAGER=null, JOB=null, NAME=于泽成}
第12行:{DEPT_TEST_ID=null, EMP_ID=1012, SALARY=null, HIRE_DATE=2011-08-10, BONUS=null, MANAGER=null, JOB=null, NAME=amy}
第13行:{DEPT_TEST_ID=null, EMP_ID=1014, SALARY=8000, HIRE_DATE=null, BONUS=null, MANAGER=null, JOB=null, NAME=张无忌}
第14行:{DEPT_TEST_ID=20, EMP_ID=1015, SALARY=null, HIRE_DATE=null, BONUS=null, MANAGER=null, JOB=null, NAME=刘苍松}
第15行:{DEPT_TEST_ID=null, EMP_ID=1013, SALARY=10000, HIRE_DATE=2016-12-17, BONUS=null, MANAGER=null, JOB=developer, NAME=测试更新}
DELETE FROM emp_test WHERE job = developer AND emp_id = 1013
成功删除了1行
执行删除后的数据
SELECT * FROM emp_test
成功查询到了14行数据
第1行:{DEPT_TEST_ID=10, EMP_ID=1001, SALARY=10000, HIRE_DATE=2010-01-12, BONUS=2000, MANAGER=1005, JOB=Manager, NAME=张无忌}
第2行:{DEPT_TEST_ID=10, EMP_ID=1002, SALARY=8000, HIRE_DATE=2011-01-12, BONUS=1000, MANAGER=1001, JOB=Analyst, NAME=刘苍松}
第3行:{DEPT_TEST_ID=10, EMP_ID=1003, SALARY=9000, HIRE_DATE=2010-02-11, BONUS=1000, MANAGER=1001, JOB=Analyst, NAME=李翊}
第4行:{DEPT_TEST_ID=10, EMP_ID=1004, SALARY=5000, HIRE_DATE=2010-02-11, BONUS=null, MANAGER=1001, JOB=Programmer, NAME=郭芙蓉}
第5行:{DEPT_TEST_ID=20, EMP_ID=1005, SALARY=15000, HIRE_DATE=2008-02-15, BONUS=null, MANAGER=null, JOB=President, NAME=张三丰}
第6行:{DEPT_TEST_ID=20, EMP_ID=1006, SALARY=5000, HIRE_DATE=2009-02-01, BONUS=400, MANAGER=1005, JOB=Manager, NAME=燕小六}
第7行:{DEPT_TEST_ID=20, EMP_ID=1007, SALARY=3000, HIRE_DATE=2009-02-01, BONUS=500, MANAGER=1006, JOB=clerk, NAME=陆无双}
第8行:{DEPT_TEST_ID=30, EMP_ID=1008, SALARY=5000, HIRE_DATE=2009-05-01, BONUS=500, MANAGER=1005, JOB=Manager, NAME=黄蓉}
第9行:{DEPT_TEST_ID=30, EMP_ID=1009, SALARY=4000, HIRE_DATE=2009-02-20, BONUS=null, MANAGER=1008, JOB=salesman, NAME=韦小宝}
第10行:{DEPT_TEST_ID=30, EMP_ID=1010, SALARY=4500, HIRE_DATE=2009-05-10, BONUS=500, MANAGER=1008, JOB=salesman, NAME=郭靖}
第11行:{DEPT_TEST_ID=null, EMP_ID=1011, SALARY=null, HIRE_DATE=null, BONUS=null, MANAGER=null, JOB=null, NAME=于泽成}
第12行:{DEPT_TEST_ID=null, EMP_ID=1012, SALARY=null, HIRE_DATE=2011-08-10, BONUS=null, MANAGER=null, JOB=null, NAME=amy}
第13行:{DEPT_TEST_ID=null, EMP_ID=1014, SALARY=8000, HIRE_DATE=null, BONUS=null, MANAGER=null, JOB=null, NAME=张无忌}
第14行:{DEPT_TEST_ID=20, EMP_ID=1015, SALARY=null, HIRE_DATE=null, BONUS=null, MANAGER=null, JOB=null, NAME=刘苍松}
带条件的查询1
SELECT * FROM emp_test WHERE job = clerk AND salary = 3000
成功查询到了1行数据
第1行:{DEPT_TEST_ID=20, EMP_ID=1007, SALARY=3000, HIRE_DATE=2009-02-01, BONUS=500, MANAGER=1006, JOB=clerk, NAME=陆无双}
带条件的查询2
SELECT * FROM emp_test WHERE salary = 10000
成功查询到了1行数据
第1行:{DEPT_TEST_ID=10, EMP_ID=1001, SALARY=10000, HIRE_DATE=2010-01-12, BONUS=2000, MANAGER=1005, JOB=Manager, NAME=张无忌}