1. 程式人生 > >Java JDBC基本操作(增,刪,改,查)總結

Java JDBC基本操作(增,刪,改,查)總結

</pre><pre>
package trade.axht.java.dao;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.dbutils.QueryRunner;

import trade.axht.java.conn.JDBCUtils;

import java.util.*;
import java.lang.reflect.*;
import java.sql.*;
/**
 * 
*基類帶泛型,派生類可以帶泛型引數繼承該類,通過反射對Beans物件操作
 * @author Administrator
 *
 * @param <T>
 */
public class DAO<T> {//帶泛型的基類,派生類可以帶具體beans泛型引數繼承該類

	public Class<T> clazz;
	@SuppressWarnings({ "unchecked", "rawtypes" })
	public DAO(){
	
		System.out.println(getClass()); //列印class trade.axht.java.dao.userImpl.****DaoImpl
		Type type=getClass().getGenericSuperclass();  
		System.out.println(type);
		/**獲取繼承【該類(DAO<T>)】帶具體泛型的基類 或者獲取此類的基類(Object),簡單的講就是誰繼承Dao<T>這個類後,在載入的時候,就會來載入這個建構函式。載入class的物件為Dao<T>的派生類。派生類的基類就是Dao<T>,並能獲取基類帶有的具體泛型。
		JDK文件描述是這樣的:返回表示此Class所表示的實體(類、介面、基本型別或 void)的直接超類的Type。如果超類是引數化型別,則返回的物件必須準確反映源///程式碼中所使用的實際型別引數。
		所以最終列印為**/
		ParameterizedType parameterizedType=(ParameterizedType)type;//ParameterizedType 表示引數化型別,如 Collection<String>。
		System.out.println(parameterizedType);
		Type[] ars=parameterizedType.getActualTypeArguments();/**返回表示此型別實際型別引數的物件的陣列。就是返回Collection<T,V,...>中的泛型引數T,V型別的Type表示形式。Type 是 Java 程式語言中所有型別的公共高階介面。它們包括原始型別、引數化型別、陣列型別、型別變數和基本型別。**/
		System.out.println(ars);
		clazz=(Class) ars[0];//獲取泛型引數的第一個Class物件
		System.out.println(clazz);
	//	System.out.println(clazz);
	}
	/**
	 * 增,刪,改操作
	 * @param sql
	 * @param args
	 * @return
	 */
	public  int executeUpdate(String sql,Object...args){
		Connection connection=JDBCUtils.getConnection();
		PreparedStatement preparedStatement=null;
		try {
			preparedStatement=connection.prepareStatement(sql);
			if(args!=null&&args.length>0){
				for(int i=0;i<args.length;i++){
					preparedStatement.setObject(i+1, args[i]);
				}
			}
			return preparedStatement.executeUpdate();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return -1;
		}finally {
			JDBCUtils.releaseConnection(connection, preparedStatement, null);
		}
	}

	/**
	 * 查詢
	 * @param clazz
	 * @param sql
	 * @param args
	 * @return
	 */
	public  List<T> getForList(String sql, Object... args) {

		List<T> list = new ArrayList<>();

		Connection connection = null;
		PreparedStatement preparedStatement = null;
		ResultSet resultSet = null;

		try {
			//1. 得到結果集
			connection = JDBCUtils.getConnection();
			preparedStatement = connection.prepareStatement(sql);
			if(args!=null&&args.length>0){
				for (int i = 0; i < args.length; i++) {
					preparedStatement.setObject(i + 1, args[i]);
				}
			}

			resultSet = preparedStatement.executeQuery();
			
			//2處理結果解,得到Map的list,其中一個Map物件就是一條記錄。
			//Map的key為resultSet中的列的別名,Map的value為列的值
			List<Map<String, Object>> values = 
					handleResultSetToMapList(resultSet);
			
			//3.把List<Map<String,Object>> 轉化成Class物件(clazz)的例項集List<T>
			list = transfterMapListToBeanList( values);

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCUtils.releaseConnection(connection,preparedStatement,resultSet);
		}

		return list;
	}
	
	
	public List<T> transfterMapListToBeanList(List<Map<String, Object>> values) throws InstantiationException,
			IllegalAccessException, InvocationTargetException {

		List<T> result = new ArrayList<>();

		T bean = null;

		if (values.size() > 0) {
			for (Map<String, Object> m : values) {
				bean = clazz.newInstance();
				for (Map.Entry<String, Object> entry : m.entrySet()) {
					String propertyName = entry.getKey();//資料庫表中的欄位名稱
					Object value = entry.getValue();//資料庫表中欄位的值
					//利用org.apache.commons.beanutils.BeanUtils工具類反射設定物件屬性
					BeanUtils.setProperty(bean, propertyName, value);
					
				/*	try {
						ReflectorUtil.setProperty(bean, propertyName, value);
					} catch (NoSuchFieldException | SecurityException | IllegalArgumentException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}*/
				}
				result.add(bean);
			}
		}

		return result;
	}
	
	
	public List<Map<String, Object>> handleResultSetToMapList(
			ResultSet resultSet) throws SQLException {
		
		List<Map<String, Object>> values = new ArrayList<>();
		//獲取列名
		List<String> columnLabels = getColumnLabels(resultSet);
		Map<String, Object> map = null;
		while (resultSet.next()) {
			map = new HashMap<>();

			for (String columnLabel : columnLabels) {
				Object value = resultSet.getObject(columnLabel);
				map.put(columnLabel, value);
			}
			values.add(map);
		}
		return values;
	}
	//獲取資料庫表中的欄位名稱集合
	private  List<String> getColumnLabels(ResultSet rs) throws SQLException {
		List<String> labels = new ArrayList<>();

		ResultSetMetaData rsmd = rs.getMetaData();
		for (int i = 0; i < rsmd.getColumnCount(); i++) {
			labels.add(rsmd.getColumnLabel(i + 1));
		}

		return labels;
	}
	public int getCount(String sql,String...id){
		Connection connection=null;
		ResultSet resultSet=null;
		PreparedStatement preparedStatement=null;
		try {
			 connection=JDBCUtils.getConnection();
			 resultSet=null;
			 preparedStatement=connection.prepareStatement(sql);
			if(id!=null&&id.length>0){
				for(int i=1;i<=id.length;i++)
				preparedStatement.setString(i, id[i-1]);
			}
			resultSet=preparedStatement.executeQuery();
			if(resultSet.next()){
				return resultSet.getInt(1);
			}
			else {
				return 0;
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return 0;
		}finally{
			JDBCUtils.releaseConnection(connection, preparedStatement, resultSet);
		}
	}
	
}


定義ManagerDaoImpl,該類繼承與Dao

package trade.axht.java.dao.userImpl;

import trade.axht.java.dao.DAO;
import trade.axht.java.dao.ManagerDAO;
import trade.axht.java.domain.Manager;

public class ManagerDaoImpl  extends DAO<Manager> {

	@Override
	public int getCount(Manager manager) {
		// TODO Auto-generated method stub
		String sql="select Count(*) from tb_manager where username=? and password=?";
		return getCount(sql, manager.getUsername(),manager.getPassword());
	
	}

}
Beans型別的Manager類
package trade.axht.java.domain;

public class Manager {
	private int id;
	private String username;
	private String password;
	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 getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public Manager() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Manager(int id, String username, String password) {
		super();
		this.id = id;
		this.username = username;
		this.password = password;
	}
	
}

資料庫連線操作類
package trade.axht.java.conn;

import javax.sql.*;
import java.sql.*;
import java.util.*;
import java.io.*;

public class JDBCUtils {
	private static DataSource  dataSource=null;

	static{                                                                                                                                                                                                           
		Properties properties=new Properties();
		InputStream in=JDBCUtils.class.getClassLoader().getResourceAsStream("dbcp.properties");//載入配置檔案
		try {
		<span style="white-space:pre">	</span>properties.load(in);
		
			dataSource=org.apache.commons.dbcp2.BasicDataSourceFactory.createDataSource(properties);//利用資料庫連線池(dbcp2)獲取資料來源
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			System.out.println("資料庫連接出錯!");
			e.printStackTrace();
		}
	}
	public static Connection getConnection(){
		try {
			return dataSource.getConnection();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			
			e.printStackTrace();
			return null;
		}
	}
	public static void releaseConnection(Connection connection,Statement statement,ResultSet resultSet) {
		if (connection!=null) {
			try {
				connection.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		if (statement!=null) {
			try {
				statement.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		if (resultSet!=null) {
			try {
				resultSet.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}

資料庫配置檔案 jdcp.properties
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/blog
username=root
password=brozer
initialSize=5
maxIdle=10
maxTotal=50
maxWaitMillis=5000
minIdle=5

匯入的包


相關推薦

Java JDBC基本操作(,,,)總結

</pre><pre> package trade.axht.java.dao; import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.dbutils

C 實現對XML檔案的基本操作(建立xml檔案, xml節點資訊)

                XML:Extensible Markup Language(可擴充套件標記語言)的縮寫,是用來定義其它語言的一種元語言,其前身是SGML(Standard Generalized Markup Language,標準通用標記語言)。它沒有標籤集(tag set),也沒有語法規

Elasticsearch 操作深入詳解

引言: 對於剛接觸ES的童鞋,經常搞不明白ES的各個概念的含義。尤其對“索引”二字更是與關係型資料庫混淆的不行。本文通過對比關係型資料庫,將ES中常見的增、刪、改、查操作進行圖文呈現。能加深你對ES的理解。同時,也列舉了kibana下的圖形化展示。 ES Restful API GET、POST

MYSQL的 基本語句)

DML語句—— -------------------------------------插入單條資料記錄--------------------------------- 插入語法: INSERT INTO 表名 [(欄位名列表)] VALUES (值列表);

PySpark︱DataFrame操作指南:////合併/統計與資料處理

筆者最近需要使用pyspark進行資料整理,於是乎給自己整理一份使用指南。pyspark.dataframe跟pandas的差別還是挺大的。 1、——– 查 ——– — 1.1 行元素查詢操作 — 像SQL那樣列印列表前20元素 sho

網站的 / / / 時常用的 sql 語句

ima sql語句 crud 分享 學習數據庫 image sel 參數 表結構 最近在學習數據庫 php + mysql 的基本的 crud 的操作,記錄碰到的坑供自己參考。crud中需要用到的sql語句還是比較多的,共包括以下幾個內容: 查詢所有數據 查詢表中某個字段

1-24.list的,,,

height 返回值 字符 xtend int span spa () nbsp 增: 1.append(通過元素增加,默認加在最後print(a.append(‘hgf‘))) 2.extend( 叠代的去增,就是把字符串的字符逐個去給這個列表加上去) 3.insert(

基礎MySQL +

mysql> SHOW DATABASES; 檢視資料庫資訊,預設是4個庫, +--------------------+ | Database | +--------------------+ | informat

struts2實現CRUD( )

CRUD是Create(建立)、Read(讀取)、Update(更新)和Delete(刪除) 首先,肯定是要與資料互動的,所以我們先寫一個bean類 程式碼如下: public class Food { private Integer id; private S

mybatis抽取基類BaseMapper(通用///)

目前專案當中使用mapper.xml檔案方式對資料庫進行操作,但是每個裡邊都有增/刪/改/查,為了方便開發,把這些公共的程式碼提取出來,不用當做基類,不用每個Mapper檔案都寫了 準備工作: 1:資料庫表 CREATE TABLE `t_permission` (

ArrayList的

本節的程式碼主要使用並實現List介面的ArrayList類。 主要的功能和方法如下: *使用ArrayList()的構造方法構造一個初始容量為10的空列表 *使用ArrayList(int initialCapaity)構造方法,構造具有初始容量的空列表*當需要儲存大量資

html5的localStorage之【

分享一下我老師大神的人工智慧教程吧。零基礎,通俗易懂!風趣幽默!http://www.captainbed.net/ 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

好用的SQL TVP~~獨家贈送[---]的例子

/// <summary> /// Data access layer. Gets products by the collection of the specific product' ID. /// </summary> /// <param name="conn"

GreenDao的簡單使用說明(二)單表的,,,

        通過上一篇文章,我們已經把GreenDao框架架起來了,而且三個基礎操作類和Users的使用者類也建立起來了,哪麼下面我們就來實現一下,對於這個單表的增,刪,改,查功能.         這裡說明一下,因為是做一個簡單的例子,所以這裡我對資料庫的操作,沒有做

學習 linq to ADO.NET 例項筆記(二)-- / / /

實體類: [Table(Name = "AA")] public class ClassDemo { [Column(IsPrimaryKey = true, UpdateCheck = UpdateCheck.Never, IsVers

AngularJs實現,,,(全)

<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> <script type="text

vue 前端實現 無重新整理式 以及 vue實現分頁

<div class="row" id="app"> <div class="col-md-12 col-sm-12 col-xs-12"> <div class="x_panel"> <div class="x_t

easyui table 屬性頁面 及 按鈕 close按鈕

<%@ page language="java" contentType="text/html; charset=UTF-8"     pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transition

js陣列的管理[,,,]

今天在設計表單的時候遇到對陣列的一些處理的問題,比如說怎麼建立一個數組,然後牽扯到陣列的增刪改查的方法。請看APIFF: Firefox, N: Netscape, IE: Internet Explorer方法描述FFNIE連線兩個或更多的陣列,並返回結果。144把陣列的所

python基礎中的四大天王----

fine tuple define 就是 實例 開放 之前 count dot 列表-list-[] 輸入內存儲存容器 發生改變通常直接變化,讓我們看看下面列子 增---默認在最後添加 #append()--括號中可以是數字,可以是字符串,可以是元祖,可以是