jdbc操作mysql

本文講述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();
		}

	}

}

運行結果:











發佈了49 篇原創文章 · 獲贊 13 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章