本文講述2點:
一. jdbc 操作 mysql 。(封裝一個JdbcUtils.java類,實現數據庫表的增刪改查)
1. 建立數據庫連接
Class.forName(DRIVER);
connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
2.用PrepareStatement執行sql語句
pstmt = connection.prepareStatement(sql);
3. 獲得執行Sql結果(int result)或結果集合(ResultSet)
int result = pstmt.executeUpdate(); (增,刪,改)
ResultSet resultSet = pstmt.executeQuery(); (查詢)
// 獲取所有列的信息
ResultSetMetaData metaData = resultSet.getMetaData();
二. 用Java反射機制返回JavaBean,List<JavaBean>
看JdbcUtils.java 中具體代碼。
------------------------------------------------------------------------------------------------------------
程序思路:
用eclipse建立一個java 工程,訪問mysql數據庫。數據庫名稱:mydb,表格名稱:userinfo. user表格有三個屬性(id , username , pswd)
工程目錄:
1 JdbcUtils.java --封裝數據庫操作的類
package com.jdbc.dbutils;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.jdbc.data.UserInfo;
import com.mysql.jdbc.Driver;
public class JdbcUtils {
// 定義數據庫的用戶名
private final String USERNAME = "root";
// 定義數據庫的密碼
private final String PASSWORD = "123456";
// 定義數據庫的驅動信息
private final String DRIVER = "com.mysql.jdbc.Driver";
// 定義訪問數據庫的地址
private final String URL = "jdbc:mysql://localhost:3306/mydb";
// 定義訪問數據庫的連接
private Connection connection;
// 定義sql語句的執行對象
private PreparedStatement pstmt;
// 定義查詢返回的結果集合
private ResultSet resultSet;
public JdbcUtils() {
// TODO Auto-generated constructor stub
try {
Class.forName(DRIVER);
System.out.println("註冊驅動成功!!");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
System.out.println("註冊驅動失敗!!");
}
}
// 定義獲得數據庫的連接
public Connection getConnection() {
try {
connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
} catch (Exception e) {
// TODO: handle exception
System.out.println("Connection exception !");
}
return connection;
}
/**
* 完成對數據庫標的增加刪除和修改的操作
*
* @param sql
* @param params
* @return
* @throws SQLException
*/
public boolean updateByPreparedStatement(String sql, List<Object> params)
throws SQLException {
boolean flag = false;
int result = -1;// 表示當用戶執行增加刪除和修改的操作影響的行數
int index = 1; // 表示 佔位符 ,從1開始
pstmt = connection.prepareStatement(sql);
if (params != null && !params.isEmpty()) {
for (int i = 0; i < params.size(); i++) {
pstmt.setObject(index++, params.get(i)); // 填充佔位符
}
}
result = pstmt.executeUpdate();
flag = result > 0 ? true : false;
return flag;
}
/**
* 查詢返回單條記錄
*
* @param sql
* @param params
* @return
* @throws SQLException
*/
public Map<String, Object> findSimpleResult(String sql, List<Object> params)
throws SQLException {
Map<String, Object> map = new HashMap<String, Object>();
pstmt = connection.prepareStatement(sql);
int index = 1;
if (params != null && !params.isEmpty()) {
for (int i = 0; i < params.size(); i++) {
pstmt.setObject(index++, params.get(i));
}
}
resultSet = pstmt.executeQuery(); // 返回查詢結果
ResultSetMetaData metaData = pstmt.getMetaData(); // 獲取 結果中,一行所有列的結果
int cols_len = metaData.getColumnCount(); // 獲得列的總數
while (resultSet.next()) {
for (int i = 0; i < cols_len; i++) {
String col_name = metaData.getColumnName(i + 1); // 獲得第i列的字段名稱
Object col_value = resultSet.getObject(col_name);// 返回 第i列的內容值
if (col_value == null) {
col_value = "";
}
map.put(col_name, col_value);
}
}
return map;
}
/**
* 查詢返回多條記錄
*
* @param sql
* @param params
* @return
* @throws SQLException
*/
public List<Map<String, Object>> findMoreResult(String sql,
List<Object> params) throws SQLException {
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
pstmt = connection.prepareStatement(sql);
int index = 1; // 表示佔位符
if (params != null && !params.isEmpty()) {
for (int i = 0; i < params.size(); i++) {
pstmt.setObject(index++, params.get(i));
}
}
resultSet = pstmt.executeQuery(); // 返回查詢結果集合
ResultSetMetaData metaData = resultSet.getMetaData(); // 獲得列的結果
while (resultSet.next()) {
Map<String, Object> map = new HashMap<String, Object>();
int cols_len = metaData.getColumnCount(); // 獲取總的列數
for (int i = 0; i < cols_len; i++) {
String col_name = metaData.getColumnName(i + 1); // 獲取第 i列的字段名稱
// ,列計算從1開始
Object col_value = resultSet.getObject(col_name); // 獲取第i列的內容值
if (col_value == null) {
col_value = "";
}
map.put(col_name, col_value);
}
list.add(map);
}
return list;
}
/**
* 查詢返回單個JavaBean(使用java反射機制)
*
* @param sql
* @param params
* @param cls
* @return
* @throws Exception
*/
public <T> T findSimpleRefResult(String sql, List<Object> params,
Class<T> cls) throws Exception {
T resultObject = null;
int index = 1; // 佔位符
pstmt = connection.prepareStatement(sql);
if (params != null && !params.isEmpty()) {
for (int i = 0; i < params.size(); i++) {
pstmt.setObject(index++, params.get(i)); // 填充佔位符
}
}
resultSet = pstmt.executeQuery(); // 獲取查詢結果
ResultSetMetaData metaData = resultSet.getMetaData(); // 獲取列的信息
int cols_len = metaData.getColumnCount(); // 獲取總的列數
while (resultSet.next()) {
// 通過反射機制創建實例
resultObject = cls.newInstance(); // java反射機制
for (int i = 0; i < cols_len; i++) {
String col_name = metaData.getColumnName(i + 1); // 獲取第i列的名稱
Object col_value = resultSet.getObject(col_name); // 獲取第i列的值
if (col_value == null) {
col_value = "";
}
Field field = cls.getDeclaredField(col_name);
field.setAccessible(true);// 打開 JavaBean的訪問 private權限
field.set(resultObject, col_value);
}
}
return resultObject;
}
/** 查詢返回多個JavaBean(通過java反射機制)
* @param sql
* @param params
* @param cls
* @return
* @throws Exception
*/
public <T> List<T> findMoreRefResult(String sql, List<Object> params,
Class<T> cls) throws Exception {
List<T> list = new ArrayList<T>();
int index = 1; //佔位符
pstmt = connection.prepareStatement(sql);
if (params != null && !params.isEmpty()) {
for (int i = 0; i < params.size(); i++) {
pstmt.setObject(index++, params.get(i));
}
}
resultSet = pstmt.executeQuery(); // 返回查詢結果集合
ResultSetMetaData metaData = resultSet.getMetaData(); // 返回列的信息
int cols_len = metaData.getColumnCount(); // 結果集中總的列數
while (resultSet.next()) {
// 通過反射機制創建一個java實例
T resultObject = cls.newInstance();
for (int i = 0; i < cols_len; i++) {
String col_name = metaData.getColumnName(i + 1); // 獲得第i列的名稱
Object col_value = resultSet.getObject(col_name); // 獲得第i列的內容
if (col_value == null) {
col_value = "";
}
Field field = cls.getDeclaredField(col_name);
field.setAccessible(true); // 打開JavaBean的訪問private權限
field.set(resultObject, col_value);
}
list.add(resultObject);
}
return list;
}
/**關閉數據庫訪問
* @throws SQLException
*/
public void releaseConn() throws SQLException{
if (resultSet!=null) {
resultSet.close();
}
if (pstmt!=null) {
pstmt.close();
}
if (connection!=null) {
connection.close();
}
}
}
2. UserInfo.java (用來驗證java反射機制的JavaBean , 屬性名稱和數據表userinfo的字段完全一致)
package com.jdbc.data;
import java.io.Serializable;
public class UserInfo implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private int id;
private String username;
private String pswd;
public UserInfo() {
// TODO Auto-generated constructor stub
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPswd() {
return pswd;
}
public void setPswd(String pswd) {
this.pswd = pswd;
}
public static long getSerialversionuid() {
return serialVersionUID;
}
@Override
public String toString() {
return "UserInfo [id=" + id + ", username=" + username + ", pswd="
+ pswd + "]";
}
}
3. Test_insert.java 測試添加
package com.jdbc.test;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.jdbc.dbutils.JdbcUtils;
public class Test_Insert {
/**
* @param args
* @throws SQLException
*/
public static void main(String[] args) throws SQLException {
JdbcUtils jdbcUtils = new JdbcUtils();
jdbcUtils.getConnection();
//增加一條記錄。新增一個用戶信息 uername = "jack" , password = "admin"
String sql = "insert into userinfo(username,pswd) values(?,?)";
List<Object> params = new ArrayList<Object>();
params.add("jack");
params.add("admin");
try {
boolean flag = jdbcUtils.updateByPreparedStatement(sql, params);
System.out.println("添加一條記錄: "+flag);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally{
jdbcUtils.releaseConn();
}
}
}
運行結果:
(用同樣的方法,再增加一條記錄username="rose",pswd="123"),此時數據庫共2條記錄。如下圖:
4. Test_FindMore.java (查詢多條記錄)
package com.jdbc.test;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.jdbc.dbutils.JdbcUtils;
public class Test_FindMore {
/** 返回多條記錄
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
JdbcUtils jdbcUtils = new JdbcUtils();
jdbcUtils.getConnection();
String sql = "select * from userinfo";
try {
List<Map<String, Object>> list = jdbcUtils.findMoreResult(sql, null);
System.out.println(list);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally{
jdbcUtils.releaseConn();
}
}
}
運行結果:
5. Test_FindSimple.java (查詢返回單條記錄)
package com.jdbc.test;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.jdbc.dbutils.JdbcUtils;
public class Test_FindSimple {
/**查詢返回一條記錄
* @param args
* @throws SQLException
*/
public static void main(String[] args) throws SQLException {
// TODO Auto-generated method stub
JdbcUtils jdbcUtils = new JdbcUtils();
jdbcUtils.getConnection();
String sql = "select * from userinfo where username = ?";
List<Object> params = new ArrayList<Object>();
params.add("rose");
try {
Map<String, Object> map = jdbcUtils.findSimpleResult(sql, params);
System.out.println(map);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally{
jdbcUtils.releaseConn();
}
}
}
運行結果:
6.Test_RefMore.java 查詢返回List<JavaBean>(使用Java反射機制)
package com.jdbc.test;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import com.jdbc.data.UserInfo;
import com.jdbc.dbutils.JdbcUtils;
public class Test_RefMore {
/**返回List<JavaBean> (用Java反射機制)
* @param args
* @throws SQLException
*/
public static void main(String[] args) throws SQLException {
// TODO Auto-generated method stub
JdbcUtils jdbcUtils = new JdbcUtils();
jdbcUtils.getConnection();
String sql = "select * from userinfo";
try {
List<UserInfo> list = jdbcUtils.findMoreRefResult(sql, null , UserInfo.class);
System.out.println(list);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally{
jdbcUtils.releaseConn();
}
}
}
7. Test_RefSimple.java 查詢返回單個JavaBean (使用Java反射機制)
package com.jdbc.test;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.jdbc.data.UserInfo;
import com.jdbc.dbutils.JdbcUtils;
public class Test_RefSimple {
/**返回一個JavaBean (用Java反射機制)
* @param args
* @throws SQLException
*/
public static void main(String[] args) throws SQLException {
// TODO Auto-generated method stub
JdbcUtils jdbcUtils = new JdbcUtils();
jdbcUtils.getConnection();
String sql = "select * from userinfo where username = ?";
List<Object> params = new ArrayList<Object>();
params.add("rose");
try {
UserInfo userInfo = jdbcUtils.findSimpleRefResult(sql, params, UserInfo.class);
System.out.println(userInfo);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally{
jdbcUtils.releaseConn();
}
}
}
運行結果: