`
qiangshao
  • 浏览: 11566 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类

今天,在百度知道 ,一位网友问到jdbc代码简化,今天花了2个小时间给他写了个。。

阅读更多
代码如下:
用法是:传入一个类名 ,sql语句,参数是可变的
package org.ywq.common.utils;

import java.lang.reflect.Method;
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.List;

import org.ywq.entity.User;

/**
 * @author ai5qiangshao E-mail:ai5qiangshao@163.com
 * @version 创建时间:Aug 22, 2009 5:44:43 PM
 * @Package org.ywq.common.utils
 * @Description 类说明
 */
public class DBUtis<T> {

	private PreparedStatement psmt;

	private Connection conn;

	public DBUtis() {
		this.getConnection();
	}

	public Connection getConnection() {
		Connection conn = null;
		String className = "com.mysql.jdbc.Driver";
		String url = "jdbc:mysql://localhost:3306/hibernate";
		try {
			Class.forName(className);
			conn = DriverManager.getConnection(url, "root", "root");

		} catch (Exception e) {
			e.printStackTrace();
		}

		return conn;
	}

	public static void main(String[] args) throws Exception {
		DBUtis<User> db = new DBUtis<User>();
		List<User> usList = db.executeQuery(User.class,
				"select * from user limit 10");
		for (User user : usList) {
			 System.out.println(user.getUname());
		}

		DBUtis<User> db2 = new DBUtis<User>();
		User u = db2.executeQueryByPk(User.class,
				"select * from user where uid=?", 33);
		System.out.println(u.getUname());

	}

	public List<T> executeQuery(Class<T> clazz, String sql, Object... params) {
		List<T> list = new ArrayList<T>();
		ResultSet rs = null;
		try {
			this.preparedStatement(sql, params);
			rs = this.psmt.executeQuery();
			while (rs.next()) {
				ResultSetMetaData table = rs.getMetaData();
				T o = clazz.newInstance();
				invokeSetter(clazz, rs, table, o);
				list.add(o);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			close(rs);
		}
		return list;
	}

	/***************************************************************************
	 * 根据主键查询
	 * 
	 * @param clazz
	 * @param sql
	 * @param params
	 *            查询参数
	 * @return
	 */
	public T executeQueryByPk(Class<T> clazz, String sql, Object... params) {
		T o = null;
		ResultSet rs = null;
		try {
			this.preparedStatement(sql, params);
			rs = this.psmt.executeQuery();
			o = null;
			if (rs.next()) {
				ResultSetMetaData table = rs.getMetaData();
				o = clazz.newInstance();
				invokeSetter(clazz, rs, table, o);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			this.close(rs);
		}
		return o;
	}

	public Integer exucuteUpdate(String sql, Object... params) {
		Integer result = 0;
		try {
			this.preparedStatement(sql, params);
			result = this.psmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			this.close();
		}
		return result;
	}

	private void close(ResultSet rs) {
		try {
			if (rs != null)
				rs.close();
			if (this.psmt != null)
				psmt.close();
			if (this.conn != null)
				conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	private void close() {
		this.close(null);
	}

	private void preparedStatement(String sql, Object... params)
			throws SQLException {
		this.psmt = this.getConnection().prepareStatement(sql);
		setParams(params);
	}

	private void setParams(Object[] params) throws SQLException {
		if (params != null) {
			for (int i = 0; i < params.length; i++) {
				this.psmt.setObject(i + 1, params[i]);
			}
		}
	}

	/***************************************************************************
	 * 核心代码
	 * 
	 * @param clazz
	 * @param rs
	 * @param table
	 *            //表结构
	 * @param o
	 * @throws Exception
	 */
	private void invokeSetter(Class<?> clazz, ResultSet rs,
			ResultSetMetaData table, Object o) throws Exception {
		for (int i = 0; i < table.getColumnCount(); i++) {
			String column = table.getColumnName(i + 1);
			String setter = "set" + column.substring(0, 1).toUpperCase()
					+ column.substring(1);
			String getter = "get" + column.substring(0, 1).toUpperCase()
					+ column.substring(1);
			Method getterM = clazz.getDeclaredMethod(getter);
			Method setterM = clazz.getDeclaredMethod(setter,
					new Class[] { getterM.getReturnType() });
			setterM.invoke(o, rs.getObject(column));
		}
	}

}

分享到:
评论
3 楼 qiangshao 2009-08-23  
javazeke 写道
JDBC的简化代码,我前几个月也写过,和楼主的大同小异,同样我也是用的reflect,不过我的方式除了模型的字段和表的列名要相同。反射的需要。


这个方式 效率有点问题。。
2 楼 javazeke 2009-08-22  
JDBC的简化代码,我前几个月也写过,和楼主的大同小异,同样我也是用的reflect,不过我的方式除了模型的字段和表的列名要相同。反射的需要。
1 楼 qiangshao 2009-08-22  
忘了一点 :实体类基本数据类型必须是包装类

相关推荐

    【Springboot项目源码】mybatis+spring mvc+bootstrap开发停车位管理系统(调用百度地图API)

    这是一个基于Spring Boot、MyBatis、Spring MVC和Bootstrap框架开发的停车位管理系统的源码实现,同时也集成了百度地图API的功能。下面将详细讲解这个系统的关键技术点和实现过程。 **1. Spring Boot** Spring ...

    spring boot+mybatis+spring mvc+bootstrap开发停车位管理系统(调用百度地图API).rar

    为了有效地解决这一问题,本项目运用了Spring Boot、MyBatis、Spring MVC以及Bootstrap等技术框架,构建了一个智能的停车位管理系统,并集成了百度地图API,实现了车位查询、预订、导航等功能。 1. **Spring Boot**...

    jdk1.8中文百度.rar

    总的来说,JDK 1.8在提高开发效率、增强程序性能和简化代码结构方面做出了重大改进。Lambda表达式、Stream API、接口默认方法、日期时间API的更新以及并发编程的加强,都是Java开发者必须掌握的重要知识点。学习和...

    32位操作系统的jdk1.8版本

    Java Development Kit (JDK) 1.8 是Java编程语言的一个重要版本,尤其对于32位操作系统用户来说,它是开发和运行Java应用程序的基础。在这个版本中,Java引入了许多新特性和改进,使得开发者能够更高效地编写代码并...

    尚硅谷spring培训视频百度云

    Spring框架是一个开源的应用程序框架,主要用于简化Java企业级应用程序的开发过程。它提供了一种简单的方式来管理对象的生命周期,并通过依赖注入(Dependency Injection, DI)和面向切面编程(Aspect Oriented ...

    JAVA自学之路

    但是如果把时间花在spring的各种细节的研究上,花在研究中国企业应用不广泛地的spring mvc上,这个精力就太浪费了,而且学习的积极性会受到打击,谁愿意整天泡在细节的蜘蛛网中挣扎不出来呢?谁愿意天天经历风雨却...

    Oracle Instant Client 11g base 绿色版(32位)

    2. **sqlplus**:一个命令行工具,允许用户直接执行SQL语句和PL/SQL块,进行数据查询和管理。 3. **tnsnames.ora**:网络服务名配置文件,定义了如何连接到Oracle数据库服务器的细节,如服务器地址、端口和服务名。...

    java版本的养老院管理系统源码.zip

    2. **多线程支持**:养老院的日常运营涉及到多个并发操作,如同时处理多个入住申请或护理请求。Java的多线程机制能够有效处理这些并发任务,保证系统的响应速度。 3. **数据库交互**:系统通常会与数据库进行频繁...

    Java基础案例教程(第2版)_PPT.zip

    《Java基础案例教程(第2版)》是一本旨在教授初学者Java编程基础知识的教材,其PPT形式的压缩包提供了清晰、直观的教学材料。在深入探讨这些知识点之前,我们首先了解一下Java语言的基础概念。 Java是一种面向对象...

    oracle64位客户端 Instant Client v11.2.0.3.0(64-bit)

    Oracle 64位客户端Instant Client v11.2.0.3.0是Oracle数据库连接器的一个重要组件,专门设计用于64位操作系统环境。这个版本的客户端为开发者和系统管理员提供了一种轻量级的方式来连接到Oracle数据库服务器,而...

    【ssm项目源码】停车场管理系统.zip

    【ssm项目源码】停车场管理系统是一个基于Java技术栈实现的智能停车管理解决方案。这个系统采用了Spring、SpringMVC和MyBatis(SSM)三大主流框架,它们是Java Web开发中的常用组合,旨在提高开发效率和代码的可维护...

    jre1.6安装版(含32位和64位)

    标题中的"jre1.6安装版(含32位和64位)"意味着这是一个包含32位和64位版本的JRE 1.6安装包,用户可以根据自己的操作系统选择合适的版本进行安装。 JRE 1.6,也称为Java SE 6(Java Standard Edition 6),是Sun ...

    springboot.zip全套学习资源(对应B站课程)

    在"springboot.zip"这个压缩包中,我们可以预见到一系列与SpringBoot学习相关的资源。这可能包括教程文档、代码示例、视频课程等,这些都是为了帮助用户掌握SpringBoot框架。B站(哔哩哔哩)是中国的一个知名视频...

    oracle官方64位客户端-instantclient-basic-windows.x64-11.2.0.4.0.zip

    标题中的“64位客户端-instantclient-basic-windows.x64-11.2.0.4.0.zip”表明这是一个针对64位Windows系统的Oracle Instant Client基础版,版本号为11.2.0.4.0。这个压缩包包含了运行在Windows平台上,与64位Oracle...

    mysql-connector-odbc-8.0.17-winx64.rar

    总的来说,MySQL Connector/ODBC 8.0.17-winx64 是一个强大的工具,它简化了64位 Windows 用户在开发和管理基于 MySQL 的应用程序时的数据访问流程,提高了开发效率和系统的可扩展性。通过正确配置和使用,开发者...

    包含 jdk1.5免安装、jdk1.6免安装、jdk1.8(32和64)

    这个压缩包包含了三个不同版本的JDK:JDK 1.5、JDK 1.6和JDK 1.8,其中1.5和1.6是早期版本,而1.8是最流行且广泛使用的版本之一。 **JDK 1.5(也称为Java 5.0)** JDK 1.5在2004年发布,引入了许多重要的新特性,如...

    2021-2022年收藏的精品资料税务系统大比武信息技术.doc

    8. **异步传输效率**:在异步传输中,如果数据位为7位,校验位1位,停止位1位,那么通信效率为有效数据位/总位数,即7/(7+1+1)=7/9≈78%。 9. **ISO 7498-2安全机制**:ISO 7498-2描述的安全机制中不包括安全标记...

    oracle64及32客户端

    Oracle64及32客户端分别对应64位和32位操作系统,确保了在不同系统环境下都能顺利运行。Oracle客户端支持多种应用程序,包括编程语言的驱动(如Java、Python、C++等)和图形化工具,如SQL Developer、PL/SQL ...

    jdk-6u45-windows-x64

    总之,JDK 1.6是一个稳定且功能丰富的Java开发环境,尽管现在已经有了更新的版本,但在特定场景下,它仍然具有重要的实用价值。通过理解其特性、安装步骤以及开发环境的配置,开发者可以在Windows x64系统上顺利地...

Global site tag (gtag.js) - Google Analytics