版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/u010785585/article/details/53750584
轉載請註明出處:http://blog.csdn.net/linglongxin24/article/details/53750584
本文出自【DylanAndroid的博客】
玩轉JDBC打造數據庫操作萬能工具類JDBCUtil,加入了高效的數據庫連接池,利用了參數綁定有效防止SQL注入
在之前學習了MySQL和Oracle之後,那麼,如和在Java種去連接這兩種數據庫。在這個輕量級的工具類當中,使用了數據庫連接池
去提高數據庫連接的高效性,並且使用了PreparedStatement來執行對SQL的預編譯,能夠有效防止SQL注入問題。
一.準備在配置文件配置:配置數據庫連接屬性文件:在項目新建config包下建立jdbc-mysql.properties並加入以下配置
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 com.mchange.v2.c3p0.ComboPooledDataSource;
import com.mchange.v2.c3p0.DataSources;
import java.beans.PropertyVetoException;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
/**
* 數據庫連接對象
* 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/jdbc-mysql.properties");
properties.load(fileInputStream);
/**獲取屬性文件中的值**/
String driverClassName = properties.getProperty("jdbc.driverClassName");
String url = properties.getProperty("jdbc.url");
String username = properties.getProperty("jdbc.username");
String password = properties.getProperty("jdbc.password");
/**數據庫連接池對象**/
cpds = new ComboPooledDataSource();
/**設置數據庫連接驅動**/
cpds.setDriverClass(driverClassName);
/**設置數據庫連接地址**/
cpds.setJdbcUrl(url);
/**設置數據庫連接用戶名**/
cpds.setUser(username);
/**設置數據庫連接密碼**/
cpds.setPassword(password);
/**初始化時創建的連接數,應在minPoolSize與maxPoolSize之間取值.默認爲3**/
cpds.setInitialPoolSize(3);
/**連接池中保留的最大連接數據.默認爲15**/
cpds.setMaxPoolSize(10);
/**當連接池中的連接用完時,C3PO一次性創建新的連接數目;**/
cpds.setAcquireIncrement(1);
/**隔多少秒檢查所有連接池中的空閒連接,默認爲0表示不檢查;**/
cpds.setIdleConnectionTestPeriod(60);
/**最大空閒時間,超過空閒時間的連接將被丟棄.爲0或負數據則永不丟棄.默認爲0;**/
cpds.setMaxIdleTime(3000);
/**因性能消耗大請只在需要的時候使用它。如果設爲true那麼在每個connection提交的
時候都將校驗其有效性。建議使用idleConnectionTestPeriod或automaticTestTable
等方法來提升連接測試的性能。Default: false**/
cpds.setTestConnectionOnCheckout(true);
/**如果設爲true那麼在取得連接的同時將校驗連接的有效性。Default: false **/
cpds.setTestConnectionOnCheckin(true);
/**定義在從數據庫獲取新的連接失敗後重復嘗試獲取的次數,默認爲30;**/
cpds.setAcquireRetryAttempts(30);
/**兩次連接中間隔時間默認爲1000毫秒**/
cpds.setAcquireRetryDelay(1000);
/** 獲取連接失敗將會引起所有等待獲取連接的線程異常,
但是數據源仍有效的保留,並在下次調用getConnection()的時候繼續嘗試獲取連接.如果設爲true,
那麼嘗試獲取連接失敗後該數據源將申明已經斷開並永久關閉.默認爲false**/
cpds.setBreakAfterAcquireFailure(true);
} catch (IOException e) {
e.printStackTrace();
} catch (PropertyVetoException e) {
e.printStackTrace();
}
}
/**
* 獲取數據庫連接對象,單例
*
* @return
*/
public static DBConnectionPool getInstance() {
if (dbConnection == null) {
synchronized (DBConnectionPool.class) {
if (dbConnection == null) {
dbConnection = new DBConnectionPool();
}
}
}
return dbConnection;
}
/**
* 獲取數據庫連接
*
* @return 數據庫連接
*/
public final synchronized Connection getConnection() throws SQLException {
return cpds.getConnection();
}
/**
* finalize()方法是在垃圾收集器刪除對象之前對這個對象調用的。
*
* @throws Throwable
*/
protected void finalize() throws Throwable {
DataSources.destroy(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 = DBConnectionPool.getInstance().getConnection();
/**執行SQL預編譯**/
preparedStatement = connection.prepareStatement(sql.toString());
/**設置不自動提交,以便於在出現異常的時候數據庫回滾**/
connection.setAutoCommit(false);
System.out.println(getExecSQL(sql, bindArgs));
if (bindArgs != null) {
/**綁定參數設置sql佔位符中的值**/
for (int i = 0; i < bindArgs.length; i++) {
preparedStatement.setObject(i + 1, bindArgs[i]);
}
}
/**執行sql**/
affectRowCount = preparedStatement.executeUpdate();
connection.commit();
String operate;
if (sql.toUpperCase().indexOf("DELETE FROM") != -1) {
operate = "刪除";
} else if (sql.toUpperCase().indexOf("INSERT INTO") != -1) {
operate = "新增";
} else {
operate = "修改";
}
System.out.println("成功" + operate + "了" + affectRowCount + "行");
System.out.println();
} catch (Exception e) {
if (connection != null) {
connection.rollback();
}
e.printStackTrace();
throw e;
} finally {
if (preparedStatement != null) {
preparedStatement.close();
}
if (connection != null) {
connection.close();
}
}
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 = DBConnectionPool.getInstance().getConnection();
preparedStatement = connection.prepareStatement(sql);
if (bindArgs != null) {
/**設置sql佔位符中的值**/
for (int i = 0; i < bindArgs.length; i++) {
preparedStatement.setObject(i + 1, bindArgs[i]);
}
}
System.out.println(getExecSQL(sql, bindArgs));
/**執行sql語句,獲取結果集**/
resultSet = preparedStatement.executeQuery();
getDatas(resultSet);
System.out.println();
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
if (resultSet != null) {
resultSet.close();
}
if (preparedStatement != null) {
preparedStatement.close();
}
if (connection != null) {
connection.close();
}
}
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 = valueMap.keySet();
Iterator<String> iterator = keySet.iterator();
/**要插入的字段sql,其實就是用key拼起來的**/
StringBuilder columnSql = new StringBuilder();
/**要插入的字段值,其實就是?**/
StringBuilder unknownMarkSql = new StringBuilder();
Object[] bindArgs = new Object[valueMap.size()];
int i = 0;
while (iterator.hasNext()) {
String key = iterator.next();
columnSql.append(i == 0 ? "" : ",");
columnSql.append(key);
unknownMarkSql.append(i == 0 ? "" : ",");
unknownMarkSql.append("?");
bindArgs[i] = valueMap.get(key);
i++;
}
/**開始拼插入的sql語句**/
StringBuilder sql = new StringBuilder();
sql.append("INSERT INTO ");
sql.append(tableName);
sql.append(" (");
sql.append(columnSql);
sql.append(" ) VALUES (");
sql.append(unknownMarkSql);
sql.append(" )");
return executeUpdate(sql.toString(), 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 = valueMap.keySet();
Iterator<String> iterator = keySet.iterator();
/**開始拼插入的sql語句**/
StringBuilder sql = new StringBuilder();
sql.append("UPDATE ");
sql.append(tableName);
sql.append(" SET ");
/**要更改的的字段sql,其實就是用key拼起來的**/
StringBuilder columnSql = new StringBuilder();
int i = 0;
List<Object> objects = new ArrayList<>();
while (iterator.hasNext()) {
String key = iterator.next();
columnSql.append(i == 0 ? "" : ",");
columnSql.append(key + " = ? ");
objects.add(valueMap.get(key));
i++;
}
sql.append(columnSql);
/**更新的條件:要更改的的字段sql,其實就是用key拼起來的**/
StringBuilder whereSql = new StringBuilder();
int j = 0;
if (whereMap != null && whereMap.size() > 0) {
whereSql.append(" WHERE ");
iterator = whereMap.keySet().iterator();
while (iterator.hasNext()) {
String key = iterator.next();
whereSql.append(j == 0 ? "" : " AND ");
whereSql.append(key + " = ? ");
objects.add(whereMap.get(key));
j++;
}
sql.append(whereSql);
}
return executeUpdate(sql.toString(), objects.toArray());
}
六.執行刪除的簡化操作
/**
* 執行刪除操作
*
* @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();
sql.append("DELETE FROM ");
sql.append(tableName);
/**更新的條件:要更改的的字段sql,其實就是用key拼起來的**/
StringBuilder whereSql = new StringBuilder();
Object[] bindArgs = null;
if (whereMap != null && whereMap.size() > 0) {
bindArgs = new Object[whereMap.size()];
whereSql.append(" WHERE ");
/**獲取數據庫插入的Map的鍵值對的值**/
Set<String> keySet = whereMap.keySet();
Iterator<String> iterator = keySet.iterator();
int i = 0;
while (iterator.hasNext()) {
String key = iterator.next();
whereSql.append(i == 0 ? "" : " AND ");
whereSql.append(key + " = ? ");
bindArgs[i] = whereMap.get(key);
i++;
}
sql.append(whereSql);
}
return executeUpdate(sql.toString(), bindArgs);
}
七.查詢的4種玩法
1.執行sql通過 Map
import util.DBUtil;
import java.sql.SQLException;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by yuandl on 2016-12-16.
*/
public class DBTest {
public static void main(String[] args) {
System.out.println("數據庫的原數據");
testQuery3();
testInsert();
System.out.println("執行插入後的數據");
testQuery3();
testUpdate();
System.out.println("執行修改後的數據");
testQuery3();
testDelete();
System.out.println("執行刪除後的數據");
testQuery3();
System.out.println("帶條件的查詢1");
testQuery2();
System.out.println("帶條件的查詢2");
testQuery1();
}
/**
* 測試插入
*/
private static void testInsert() {
Map<String, Object> map = new HashMap<>();
map.put("emp_id", 1013);
map.put("name", "JDBCUtil測試");
map.put("job", "developer");
map.put("salary", 10000);
map.put("hire_date", new java.sql.Date(System.currentTimeMillis()));
try {
int count = DBUtil.insert("emp_test", map);
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 測試更新
*/
private static void testUpdate() {
Map<String, Object> map = new HashMap<>();
map.put("name", "測試更新");
Map<String, Object> whereMap = new HashMap<>();
whereMap.put("emp_id", "1013");
try {
int count = DBUtil.update("emp_test", map, whereMap);
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 測試刪除
*/
private static void testDelete() {
Map<String, Object> whereMap = new HashMap<>();
whereMap.put("emp_id", 1013);
whereMap.put("job", "developer");
try {
int count = DBUtil.delete("emp_test", whereMap);
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 查詢方式一
*/
public static void testQuery1() {
Map<String,Object> whereMap=new HashMap<>();
whereMap.put("salary","10000");
try {
DBUtil.query("emp_test",whereMap);
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 查詢方式二
*/
public static void testQuery2() {
String where = "job = ? AND salary = ? ";
String[] whereArgs = new String[]{"clerk", "3000"};
try {
List<Map<String, Object>> list = DBUtil.query("emp_test", where, whereArgs);
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 查詢方式三
*/
public static void testQuery3() {
try {
List<Map<String, Object>> list = DBUtil.query("emp_test", false, null, null, null, null, null, null, null);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
- 打印結果
數據庫的原數據
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=張無忌}