本文講述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();
- }
- }
- }
運行結果: