데이터 베이스 MySQL 튜토리얼 采用封装及反射原理封装一个将对象装换为对数据库操作的工具类

采用封装及反射原理封装一个将对象装换为对数据库操作的工具类

Jun 07, 2016 pm 03:55 PM
원칙 반사 물체 캡슐화 도구 작동하다 데이터 베이스 사용

package project02_Order_management.dao;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet

package project02_Order_management.dao;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class BaseDao {
	/**
	 * 查询所有数据方法
	 */
	public static List findAll(Object obj, Connection conn) throws Exception {
		// 获取要操作对象的类
		Class clazz = obj.getClass();
		// 获取传入实体的所有方法;
		Method[] methods = clazz.getDeclaredMethods();
		// 获取传入实体中的所有的属性
		Field[] fields = clazz.getDeclaredFields();
		// 建立结果集List接收对象
		List list = new ArrayList();
		// 创建查询的sql语句;
		String sql = "select * from  "
				+ obj.getClass().getSimpleName().toLowerCase();
		System.out.println(sql);
		// System.out.println(sql);
		// 预编译sql语句
		PreparedStatement preparedStatement = conn.prepareStatement(sql);
		ResultSet resultSet = preparedStatement.executeQuery();
		// 从结果集中循环取出放入结果集List
		while (resultSet.next()) {
			// 查询的结果的接受对象
			Object entity = clazz.newInstance();

			// 循环类中的属性,进行复制操作
			for (int i = 0; i < fields.length; i++) {
				// 获取属性名称
				String fieldName = fields[i].getName();
				// 获取result结果集中的每个结果字段的对象
				Object fieldObject = resultSet.getObject(i + 1);
				if (fieldObject == null) {
					fieldObject = "null";// 防止数据为null时引发空指针异常
				}
				for (int j = 0; j < methods.length; j++) {
					// 比对属性名加上set后与方法名是否一致,进行对应的属性用对应的方法进行复制操作
					if (("set" + fieldName).equalsIgnoreCase(methods[j]
							.getName())) {
						// 执行传入对象的指定的方法
						methods[j].invoke(entity,
								resultSet.getObject(fieldName));
					}
				}
			}
			list.add(entity);
		}
		return list;
	}

	/**
	 * 根据id查询数据
	 * 
	 * @throws SQLException
	 * @throws IllegalAccessException
	 * @throws InstantiationException
	 * @throws InvocationTargetException
	 * @throws IllegalArgumentException
	 */
	public static Object findById(Object obj, Integer id, Connection conn)
			throws SQLException, InstantiationException,
			IllegalAccessException, IllegalArgumentException,
			InvocationTargetException {
		// 获取要操作对象的类
		Class clazz = obj.getClass();
		// 获取传入实体的所有方法;
		Method[] methods = clazz.getDeclaredMethods();
		// 获取传入实体中的所有的属性
		Field[] fields = clazz.getDeclaredFields();
		// 查询的结果的接受对象
		Object entity = null;
		// 创建查询的sql语句;
		String sql = "select * from " + clazz.getSimpleName().toLowerCase()
				+ " where id=?";
		PreparedStatement preparedStatement = conn.prepareStatement(sql);
		preparedStatement.setInt(1, id);
		ResultSet resultSet = preparedStatement.executeQuery();
		if (resultSet.next()) {
			// 根据获取的实体的类,创建实体
			entity = clazz.newInstance();

			// 循环类中的属性,进行复制操作
			for (int i = 0; i < fields.length; i++) {
				// 获取属性名称
				String fieldName = fields[i].getName();

				// 获取result结果集中的每个结果字段的对象
				Object fieldObject = resultSet.getObject(i + 1);
				if (fieldObject == null) {
					fieldObject = "null";// 防止数据为null时引发空指针异常
				}

				for (int j = 0; j < methods.length; j++) {
					// 比对属性名加上set后与方法名是否一致,进行对应的属性用对应的方法进行复制操作
					if (("set" + fieldName).equalsIgnoreCase(methods[j]
							.getName())) {
						// 执行传入对象的指定的方法
						methods[j].invoke(entity,
								resultSet.getObject(fieldName));
					}
				}
			}
		}
		return entity;
	}

	/**
	 * 分页数据查询
	 * 
	 * @param obj
	 *            传入目标对象
	 * @param conn
	 *            传入数据库连接
	 * @param startRow
	 *            传入开始的行数
	 * @param endRow
	 *            传入结束的行数
	 */
	public static List paging(Object obj, Connection conn, Integer startRow,
			Integer endRow) {
		
		
		return null;
	}

	/**
	 * 保存方法
	 */
	public static void save(Object obj, Connection conn)
			throws IllegalAccessException, IllegalArgumentException,
			InvocationTargetException, SQLException {
		Class clazz = obj.getClass();
		Method[] methods = clazz.getDeclaredMethods();
		Field[] fields = clazz.getDeclaredFields();

		// 获取操作的表单名字,[这里类名必须和表名一致]
		String table = clazz.getSimpleName().toLowerCase();
		String fieldsName = "";
		for (int i = 0; i < fields.length; i++) {
			fieldsName = fieldsName + fields[i].getName() + ",";
		}
		fieldsName = fieldsName.substring(0, fieldsName.length() - 1);

		// 占位符的设置
		String placeholder = "";
		for (int j = 0; j < fields.length; j++) {
			// 拼接属性的get的方法名
			String str = "get" + fields[j].getName();
			for (int k = 0; k < methods.length; k++) {
				if (str.equalsIgnoreCase(methods[k].getName())) {
					placeholder = placeholder + "?" + ",";
				}
			}
		}
		placeholder = placeholder.substring(0, placeholder.length() - 1);

		// 拼接sql语句
		String sql = "insert into " + table + "(" + fieldsName + ")"
				+ " values " + "(" + placeholder + ")";
		System.out.println(sql);
		PreparedStatement pst = conn.prepareStatement(sql);
		int index = 1;
		for (int j = 0; j < fields.length; j++) {
			String str = "get" + fields[j].getName();
			// 循环方法名比对
			for (int k = 0; k < methods.length; k++) {
				// 如果当前的属性拼出的get方法名,与方法明集合中的有一样的执行
				if (str.equalsIgnoreCase(methods[k].getName())) {
					// 接收指定的方法执行后的数据
					Object p = methods[k].invoke(obj);
					// 为指定的占位符进行赋值
					pst.setObject(index++, p);
				}
			}
		}
		// 执行已经加载的sql语句
		pst.executeUpdate();
	}

	/**
	 * 更新数据
	 */
	public static void update(Object obj, Connection conn) throws Exception {
		// 修改
		Class clazz = obj.getClass();
		Method[] methods = clazz.getDeclaredMethods();
		Field[] fields = clazz.getDeclaredFields();
		/*
		 * 拼接Sql
		 */
		String table = clazz.getSimpleName().toLowerCase();
		String setField = "";
		int id = 1;
		for (int i = 0; i < fields.length; i++) {
			for (int j = 0; j < methods.length; j++) {
				String strGetField = "get" + fields[i].getName();
				if (strGetField.equalsIgnoreCase(methods[j].getName())) {
					/*
					 * 拼接sql语句中的set字段,并用占位符
					 */
					setField = setField + fields[i].getName() + "= ?,";
					// 获取id
					if ("getId".equalsIgnoreCase(methods[j].getName())) {
						id = Integer
								.parseInt(methods[j].invoke(obj).toString());
					}
				}
			}
		}
		setField = setField.substring(0, setField.length() - 1);
		String sql = "update " + table + " set " + setField + " where id= ?";
		System.out.println(sql);
		PreparedStatement pst = conn.prepareStatement(sql);

		int index = 1;
		for (int j = 0; j < fields.length; j++) {
			String str = "get" + fields[j].getName();
			// 循环方法名比对
			for (int k = 0; k < methods.length; k++) {
				// 如果当前的属性拼出的get方法名,与方法明集合中的有一样的执行
				if (str.equalsIgnoreCase(methods[k].getName())) {
					// 接收指定的方法执行后的数据
					Object p = methods[k].invoke(obj);
					// 为指定的占位符进行赋值
					pst.setObject(index++, p);
				}
			}
		}
		pst.setObject(index++, id);
		pst.execute();

	}

	/**
	 * 根据id删除数据
	 * 
	 * @throws SQLException
	 */
	public static void delById(Object obj, Integer id, Connection conn)
			throws SQLException {
		System.out.println("=============");
		Class clazz = obj.getClass();
		String table = clazz.getSimpleName().toLowerCase();
		String sql = "delete from " + table + " where id=?";
		System.out.println(sql);
		PreparedStatement preparedStatement = conn.prepareStatement(sql);
		preparedStatement.setInt(1, id);
		preparedStatement.execute();
	}

}
로그인 후 복사

注:类名必须与表名一致,不区分大小写;

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

비즈니스 세계에서 오라클의 역할 비즈니스 세계에서 오라클의 역할 Apr 23, 2025 am 12:01 AM

Oracle은 데이터베이스 회사 일뿐 만 아니라 클라우드 컴퓨팅 및 ERP 시스템의 리더이기도합니다. 1. Oracle은 데이터베이스에서 클라우드 서비스 및 ERP 시스템에 이르기까지 포괄적 인 솔루션을 제공합니다. 2. OracleCloud는 AWS와 Azure에 도전하여 IAA, PAAS 및 SAAS 서비스를 제공합니다. 3. E-BusinessSuite 및 FusionApplications와 같은 Oracle의 ERP 시스템은 기업이 운영을 최적화하는 데 도움이됩니다.

밈 동전 교환 순위 밈 동전 메인 교환 상위 10 개 지점 밈 동전 교환 순위 밈 동전 메인 교환 상위 10 개 지점 Apr 22, 2025 am 09:57 AM

밈 동전 거래에 가장 적합한 플랫폼은 다음과 같습니다. 1. 유동성이 높은 세계 최대의 Binance, 높은 유동성과 낮은 취급 수수료; 2. 다양한 밈 동전을 지원하는 효율적인 거래 엔진 인 OKX; 3. Xbit, 분산, 교차 체인 거래 지원; 4. 혈청 주문서와 결합 된 저렴한 비용, 저렴한 비용; 5. Pancakeswap (BSC DEX), 낮은 거래 수수료 및 빠른 속도; 6. Orca (Solana Dex), 사용자 경험 최적화; 7. 코인베이스, 높은 보안, 초보자에게 적합한; 8. 아시아에서 잘 알려진 Huobi, 풍부한 거래 쌍; 9. Dexrabbit, 지능

무료 시장보기 소프트웨어 웹 사이트는 무엇입니까? 통화 서클에서 상위 10 개 무료 시장보기 소프트웨어 순위 무료 시장보기 소프트웨어 웹 사이트는 무엇입니까? 통화 서클에서 상위 10 개 무료 시장보기 소프트웨어 순위 Apr 22, 2025 am 10:57 AM

통화 서클의 상위 3 개 무료 시장보기 소프트웨어는 OKX, Binance 및 Gate.io입니다. 1. OKX는 다양한 차트 및 시장 분석을 지원하는 간단한 인터페이스 및 실시간 데이터를 제공합니다. 2. Binance는 강력한 기능, 정확한 데이터를 가지고 있으며 모든 종류의 거래자에게 적합합니다. 3. Gate.io는 안정성과 포괄적 성으로 유명하며 장기 및 단기 투자자에게 적합합니다.

통화 서클 시장의 실시간 데이터에 대한 상위 10 개 무료 플랫폼 권장 사항이 출시됩니다. 통화 서클 시장의 실시간 데이터에 대한 상위 10 개 무료 플랫폼 권장 사항이 출시됩니다. Apr 22, 2025 am 08:12 AM

초보자에게 적합한 cryptocurrency 데이터 플랫폼에는 CoinmarketCap 및 비소 트럼펫이 포함됩니다. 1. CoinmarketCap은 초보자 및 기본 분석 요구에 대한 글로벌 실시간 가격, 시장 가치 및 거래량 순위를 제공합니다. 2. 비소 인용문은 중국 사용자가 저 위험 잠재적 프로젝트를 신속하게 선별하는 데 적합한 중국 친화적 인 인터페이스를 제공합니다.

상위 10 개 디지털 가상 통화 앱 순위 : 통화 서클 트레이딩의 상위 10 개 디지털 환전 교환 상위 10 개 디지털 가상 통화 앱 순위 : 통화 서클 트레이딩의 상위 10 개 디지털 환전 교환 Apr 22, 2025 pm 03:00 PM

상위 10 개 디지털 가상 통화 앱은 다음과 같습니다. 1. OKX, 2. BINANCE, 3. GATE.IO, 4. COINBASE, 5. KRAKEN, 6. HUOBI, 7. KUCOIN, 8. BITFINEX, 9. BITSTAMP, 10. POLONIEX. 이러한 거래소는 거래량, 사용자 경험 및 보안과 같은 요소를 기반으로 선택되며 모두 다양한 디지털 통화 거래 서비스 및 효율적인 거래 경험을 제공합니다.

신뢰할 수 있고 사용하기 쉬운 가상 환전 앱 권장 사항 통화 서클에서 상위 10 개 교환의 최신 순위 신뢰할 수 있고 사용하기 쉬운 가상 환전 앱 권장 사항 통화 서클에서 상위 10 개 교환의 최신 순위 Apr 22, 2025 pm 01:21 PM

신뢰할 수 있고 사용하기 쉬운 가상 환전 앱은 다음과 같습니다. 1. Binance, 2. OKX, 3. Gate.io, 4. Coinbase, 5. Kraken, 6. Huobi Global, 7. Bitfinex, 8. Kucoin, 9. Poloniex. 이 플랫폼은 거래량, 사용자 경험 및 보안에 가장 적합한 것으로 선정되었으며 모두 등록, 확인, 입금, 인출 및 거래 운영을 제공합니다.

2025 년의 디지털 통화 거래 플랫폼은 무엇입니까? 상위 10 개 디지털 통화 앱의 최신 순위 2025 년의 디지털 통화 거래 플랫폼은 무엇입니까? 상위 10 개 디지털 통화 앱의 최신 순위 Apr 22, 2025 pm 03:09 PM

상위 10 개 가상 통화 시청 플랫폼에 대한 권장 앱 : 1. OKX, 2. BINANCE, 3. GATE.IO, 4. HUOBI, 5. COINBASE, 6. KRAKE, 7. BITFINEX, 8. KUCOIN, 9. BITSTAMP, 실시간 시장 트렌드, 기술적 인 분석 및 사용자 제공 기준을 제공하는 데 도움이됩니다.

초보자에게 적합한 디지털 통화 거래 앱은 무엇입니까? 한 기사에서 동전 원에 대해 알아보십시오 초보자에게 적합한 디지털 통화 거래 앱은 무엇입니까? 한 기사에서 동전 원에 대해 알아보십시오 Apr 22, 2025 am 08:45 AM

초보자에게 적합한 디지털 통화 거래 플랫폼을 선택할 때는 보안, 사용 편의성, 교육 자원 및 비용 투명성을 고려해야합니다. 1. 냉장 저장, 2 요인 검증 및 자산 보험을 제공하는 플랫폼에 우선 순위가 부여됩니다. 2. 간단한 인터페이스와 명확한 작동이있는 앱은 초보자에게 더 적합합니다. 3. 플랫폼은 튜토리얼 및 시장 분석과 같은 학습 도구를 제공해야합니다. 4. 거래 수수료 및 현금 인출 수수료와 같은 숨겨진 비용에주의하십시오.

See all articles