JDBC 实现通用的增删改查基础类方法

java中关于数据的管理有很多的框架,如hibernate、mybatis等,但我最开始学习的就是JDBC,我觉得JDBC还是很不错的,它让我更深层次的了解了数据的操作,今天我将我写过的JDBC基础类再写一遍!加深下记忆!!!

先将通用的增查实现类BaseDAO贴上

package com.shude.DAO;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import com.shude.DAO.im.IBaseDAO;
import com.shude.util.ConfigUtil;
import com.shude.util.JdbcUtil;
import com.shude.util.PageUtil;
/**
 * 通用的增删改查实现类
 * @author Administrator
 *
 * @param <E>
 */
public class BaseDAO<E> implements IBaseDAO<E> {
	protected static ConfigUtil configUtil;
	protected Class<?> cls;
	/**
	 * 获取包名、类名
	 */
	public BaseDAO(){
		Class<?> clsTemp = this.getClass();
		Type type = clsTemp.getGenericSuperclass();
		if (type instanceof ParameterizedType) {
			Type[] types = ((ParameterizedType) type).getActualTypeArguments();
			cls = (Class<?>) types[0];
		}
	}
	/**
	 * 获取对应类的数据库中的表名
	 */
	static{
		configUtil = ConfigUtil.newInstance("/tabORM.properties");
	}

	/**
	 * 保存方法
	 */
	public boolean saveInfo(E e) {
		boolean flag = true;
		try {
			Class<?> cls = e.getClass();
			//获取表名
			String tableName = configUtil.getVal(cls.getName());
			//获取主键
			String prykey = getPrimKey(tableName);
			//记录数据列
			List<String> filedList = new ArrayList<String>();
			//获取sql语句
			String sql = getsavesql(tableName,prykey,filedList);
			//执行sql
			flag = excuteSQL(sql,e,filedList);
		} catch (Exception e1) {
			flag = false;
			e1.printStackTrace();
		}
		return flag;
	}

	/**
	 * 修改方法
	 */
	public void modifyInfo(E e) {
		Class<?> cls = e.getClass();
		//获取表名
		String tableName = configUtil.getVal(cls.getName());
		//获取主键
		String prykey = getPrimKey(tableName);
		//记录数据列
		List<String> filedList = new ArrayList<String>();
		//获取sql语句
		String sql = getmodifysql(tableName,prykey,filedList);
		//添加主键到集合
		filedList.add(prykey);
		//执行sql
		excuteSQL(sql,e,filedList);
	}

	/**
	 * 删除方法
	 */
	public void deleteInfo(Object id) {
		//获取表名
		String tableName = configUtil.getVal(cls.getName());
		//获取主键
		String prykey = getPrimKey(tableName);
		//获取sql语句
		String sql = "update "+tableName+" set status='1' where "+prykey+"=?";
		Connection conn = null;
		PreparedStatement pstm = null;
		try {
			conn = JdbcUtil.getConn();
			pstm = conn.prepareStatement(sql);
			pstm.setObject(1, id);
			pstm.execute();
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			JdbcUtil.closeConn(conn);
		}
	}
	/**
	 * 查询全部方法
	 */
	public void queryinfo(PageUtil<E> pageUtil) {
		E e = pageUtil.getEntity();
		//获取表名
		String tableName = configUtil.getVal(cls.getName());
		//获取查询条件
		Map<String,Object> paramMap = getParamMap(e);
		//获取sql
		String sql = getquerySQL(paramMap,tableName);
		sql += " limit ?,?";
		paramMap.put("pageSize", (pageUtil.getPageSize() - 1)*pageUtil.getPageNum());
		paramMap.put("pageNum", pageUtil.getPageNum());
		//执行SQL
		excutQuery(pageUtil,sql,paramMap,tableName);

	}

	/**
	 * 单个查询方法
	 */
	public E queryById(Object id) {
		//获取表名
				String tableName = configUtil.getVal(cls.getName());
				//获取主键
				String prykey = getPrimKey(tableName);
				//获取sql
				String sql = "select * from "+tableName+" where 1 = 1 and "+prykey+" = ?";
				//执行SQL
				Connection conn = null;
				PreparedStatement pstm = null;
				ResultSet rs = null;
				E e = null;
				try {
					conn = JdbcUtil.getConn();
					pstm = conn.prepareStatement(sql);
					pstm.setObject(1, id);
					rs = pstm.executeQuery();
					List<E> list = getEntityList(rs);
					e = list.get(0);
				} catch (Exception ex) {
					ex.printStackTrace();
				}finally{
					JdbcUtil.closeConn(conn);
				}
				return e;
	}

	/**
	 * 获取总条数
	 * @param paramMap
	 * @param tableName
	 * @return
	 */
  private Integer getPagenumsss(Map<String, Object> paramMap, String tableName) {
  	paramMap.remove("pageSize");
		paramMap.remove("pageNum");
		String sql = getquerySQL(paramMap,tableName);
		sql = "select count(*) from ("+sql+") tempTab";
		Connection conn = null;
		PreparedStatement pstm = null;
		ResultSet rs = null;
		Integer pagenumsss = 0;
		try {
			conn = JdbcUtil.getConn();
			pstm = conn.prepareStatement(sql);
			int i = 1;
			for (Entry<String,Object> entry : paramMap.entrySet()) {
				Object val = entry.getValue();
				if(val instanceof java.lang.String){
					pstm.setString(i, "%"+val.toString()+"%");
				}else if(val instanceof java.lang.Integer){
					pstm.setInt(i, Integer.parseInt(val.toString()));
				}
				i++;
			}
			rs = pstm.executeQuery();
			while(rs.next()){
				pagenumsss = rs.getInt(1);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			JdbcUtil.closeConn(conn);
		}
		return pagenumsss;
	}
	/**
   * 获取查询SQL
   * @param paramMap
   * @param tableName
   * @return
   */
	private String getquerySQL(Map<String, Object> paramMap, String tableName) {
		StringBuffer sql = new StringBuffer();
		sql.append("select * from ")
		.append(tableName)
		.append(" where 1 = 1 and status='0' ");
		List<String> columlist = getTableColumns(tableName);
		for (Entry<String,Object> entry : paramMap.entrySet()) {
			String columName = entry.getKey();
			for (String colnName : columlist) {
				if(colnName.equalsIgnoreCase(columName)){
					if(entry.getValue() instanceof java.lang.String){
						sql.append(" and ").append(columName).append(" like ?");
					}else{
						sql.append(" and ").append(columName).append("=?");
					}
					break;
				}
			}
		}
		return sql.toString();
	}
  /**
   * 获取查询条件
   * @param e
   * @return
   */
	private Map<String, Object> getParamMap(E e) {
		Map<String,Object> paramMap = new LinkedHashMap<String,Object>();
		Field[] fields = e.getClass().getDeclaredFields();
		for (Field field : fields) {
			try {
				field.setAccessible(true);
				Object val = field.get(e);
				if(val != null && !"".equals(val.toString())){
					paramMap.put(field.getName(), val);
				}
			} catch (Exception e1) {
				e1.printStackTrace();
			}

		}
		return paramMap;
	}

	/**
   * 获取主键
   * @param tableName
   * @return
   */
	private String getPrimKey(String tableName) {
		Connection conn = null;
		DatabaseMetaData metaData = null;
		ResultSet rs = null;
		String primKeyName = null;
		try {
			conn = JdbcUtil.getConn();
			metaData = conn.getMetaData();
			rs = metaData.getPrimaryKeys(conn.getCatalog(), null, tableName.toUpperCase());
			while (rs.next()) {
				primKeyName = rs.getString("COLUMN_NAME");
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			JdbcUtil.closeConn(conn);
		}
		return primKeyName;
	}
	/**
	 * 保存方法执行SQL
	 * @param sql
	 * @param e
	 * @param filedList
	 * @return
	 */
	private boolean excuteSQL(String sql, E entity, List<String> filedList) {
		boolean flag = true;
		Connection conn = null;
		PreparedStatement pstm = null;
		try {
			conn = JdbcUtil.getConn();
			pstm = conn.prepareStatement(sql);
			//赋值
			int i = 1;
			for (String columName : filedList) {
				Object val = getFieldValue(entity,columName);
				pstm.setObject(i, val);
				i++;
			}
			pstm.execute();
		} catch (SQLException e1) {
			e1.printStackTrace();
			flag = false;
		}finally{
			JdbcUtil.closeConn(conn);
		}
		return flag;
	}
	/**
   * 获取修改方法的SQL
   * @param tableName
   * @param prykey
   * @param filedList
   * @return
   */
	private String getmodifysql(String tableName, String prykey, List<String> filedList) {
		StringBuffer sql = new StringBuffer();
		sql.append("update ").append(tableName).append(" set ");
		List<String> columnList = getTableColumns(tableName);
		for (String columnName : columnList) {
			if (!columnName.equalsIgnoreCase(prykey)) {
				filedList.add(columnName);
				sql.append(columnName).append("=?,");
			}
		}
		if (sql.toString().endsWith(",")) {
			sql = new StringBuffer(sql.substring(0,sql.length()-1));
		}
		sql.append(" where ").append(prykey).append("=?");
		return sql.toString();
	}
  /**
   * 执行查询全部SQL
   * @param pageUtil
   * @param sql
   * @param paramMap
   * @param tableName
   */
	private void excutQuery(PageUtil<E> pageUtil, String sql, Map<String, Object> paramMap, String tableName) {
		Connection conn = null;
		PreparedStatement pstm = null;
		ResultSet rs = null;
		try {
			conn = JdbcUtil.getConn();
			pstm = conn.prepareStatement(sql);
			int i = 1;
			for (Entry<String,Object> entry : paramMap.entrySet()) {
				Object val = entry.getValue();
				if(val instanceof java.lang.String){
					pstm.setString(i, "%"+val.toString()+"%");
				}else if(val instanceof java.lang.Integer){
					pstm.setInt(i, Integer.parseInt(val.toString()));
				}
				i++;
			}
			rs = pstm.executeQuery();
			List<E> list = getEntityList(rs);
			//封装查询结果
 			pageUtil.setList(list);
			//封装总条数
			pageUtil.setPageNumSum(getPagenumsss(paramMap,tableName));
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			JdbcUtil.closeConn(conn);
		}
	}
	/**
	 * 获取表中属性
	 * @param entity
	 * @param columName
	 * @return
	 */
  private Object getFieldValue(E entity, String columName) {
	  Class<?> cls = entity.getClass();
		Object value = null;
		//获取类中的所有成员属性
		Field[] fields = cls.getDeclaredFields();
		for (Field field : fields) {
			//获取属性名称
			String fieldName = field.getName();
			//判断属性名称是否与列名相同
			if (fieldName.equalsIgnoreCase(columName)) {
				//根据规则获取方法名称
				String methodName = "get"+fieldName.substring(0,1).toUpperCase()+fieldName.substring(1);
				try {
					//根据方法名称获取方法对象
					Method method = cls.getMethod(methodName);
					//执行方法并获取返回值
					value = method.invoke(entity);
				} catch (Exception e) {
					e.printStackTrace();
				}
				break;
			}
		}
		return value;
	}
/**
  * 保存方法获取SQL
  * @param tableName
  * @param prykey
  * @param filedList
  * @return
  */
	private String getsavesql(String tableName, String prykey, List<String> filedList) {
		StringBuffer sql = new StringBuffer();
		sql.append("insert into ").append(tableName).append(" (");
			List<String> columnList = getTableColumns(tableName);
			for (String string : columnList) {
				if (!string.equalsIgnoreCase(prykey)) {
					sql.append(string).append(",");
					filedList.add(string);
				}
			}
			if (sql.toString().endsWith(",")) {
				sql = new StringBuffer(sql.substring(0,sql.length()-1));
			}
			sql.append(") value (");
			for (int i = 0; i <filedList.size(); i++) {

				sql.append("?,");

			}
			if (sql.toString().endsWith(",")) {
				sql = new StringBuffer(sql.substring(0,sql.length()-1));
			}
			sql.append(")");
		return sql.toString();
	}

	/**
	 * 获取表列
	 * @param tableName
	 * @return
	 */
	private List<String> getTableColumns(String tableName) {
		List<String> columnList = new ArrayList<String>();
		Connection conn = null;
		DatabaseMetaData metaData = null;
		ResultSet rs = null;
		conn = JdbcUtil.getConn();
		try {
			metaData = conn.getMetaData();
			rs = metaData.getColumns(conn.getCatalog(),null,tableName.toUpperCase(),null);
			while (rs.next()) {
				String clumnName = rs.getString("COLUMN_NAME");
				columnList.add(clumnName);
			}
		}catch (SQLException e) {
			e.printStackTrace();
		}
		finally{
			JdbcUtil.closeConn(conn);
		}
		return columnList;
  }
  /**
   * 封装查询结果
   * @param rs
   * @return
   * @throws Exception
   */
	@SuppressWarnings("unchecked")
	private List<E> getEntityList(ResultSet rs) throws Exception {
		List<E> list = new ArrayList<E>();
		Field[] fields = cls.getDeclaredFields();
		while(rs.next()){
			E e = (E)cls.newInstance();
			for (Field field : fields) {
				try {
					field.setAccessible(true);
					String columName = field.getName();
					String fieldType = field.getType().getSimpleName();
					if("String".equals(fieldType)){
						field.set(e, rs.getString(columName));
					}else if("Integer".equals(fieldType)){
						field.set(e, rs.getInt(columName));
					}
				} catch (Exception e1) {
					e1.printStackTrace();
				}
			}
			list.add(e);
		}
		return list;
	}
}

mysql相关配置文件config.properties内容

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/dbsda10?characterEncoding=UTF-8
username=root
password=rootroot
temfile=C:\\
image=C:\\images 

配置文件读取类ConfigUtil

package com.shude.util;
import java.io.IOException;
import java.util.Properties;
/**
 * 读取配置文件
 * @author Administrator
 *
 */
public class ConfigUtil {
 private static ConfigUtil configUtil;
 private static final String DEFALT_FILE_PATH="/config.properties";
 private static String name;
 private Properties pop;
 private ConfigUtil(){
 init();
 }
 private void init() {
 pop=new Properties();
 try {
  if(name!=null)
  pop.load(ConfigUtil.class.getResourceAsStream(name));
  pop.load(ConfigUtil.class.getResourceAsStream(DEFALT_FILE_PATH));
 } catch (IOException e) {
  e.printStackTrace();
 }
 }
 public static ConfigUtil newInstance(String name){
 ConfigUtil.name=name;
 if(configUtil==null)
  configUtil=new ConfigUtil();
 return configUtil;
 }
 /**
 * 获取配置文件中右边的值
 * @param key
 * @return */
 public String getVal(String key){
 return pop.getProperty(key);
 }
}

在此之前的条件是数据库的字段名称要与实体类中的名称对应并且相同,有相关的数据表名称及实体类名称所相关的配置文件,配置文件如下:

tabORM.properties

com.shude.entity.UserInfo=user_info
com.shude.entity.RoleInfo=role_info
com.shude.entity.FabricInfo=fabric_info
com.shude.entity.ProductInfo=product_info
com.shude.entity.MateInfo=mate_info
com.shude.entity.ProgramInfo=program_info 

以上这篇JDBC 实现通用的增删改查基础类方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Hibernate中实现增删改查的步骤详解

    1.首先我们要知道什么是Hibernate Hibernate是一个轻量级的ORMapping对象.主要用来实现Java和数据库表之间的映射,除此之外还提供数据查询和数据获取的方法, 可以大幅度减少开发时人工使用SQL和JDBC处理数据的时间,解放编程人员95%的任务. 2.什么是ORM  Object-Relational-Mapping对象关系映射 ORM:是通过java对象映射到数据库表,通过操作Java对象可以完成对数据表的操作.(假如你用的是Dbutils那么还需要在Java类中写sq

  • java jdbc连接mysql数据库实现增删改查操作

    jdbc相信大家都不陌生,只要是个搞java的,最初接触j2ee的时候都是要学习这么个东西的,谁叫程序得和数据库打交道呢!而jdbc就是和数据库打交道非常基础的一个知识,也是比较接近底层的,在实际的工作中大家用得更多的其实还是比较成熟的框架,例如Hibernate.Mybatis. 但是作为这些成熟框架的底层的jdbc却也是我们应该去掌握的,只有了解了jdbc的增删改查,这样在以后如果有兴趣去研究Hibernate或者Mybatis的源代码的时候才能更好的去理解这些成熟的框架是如何去实现增删改查

  • 详解通过JDBC进行简单的增删改查(以MySQL为例)

    前言:什么是JDBC Java 数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法.JDBC也是Sun Microsystems的商标.它JDBC是面向关系型数据库的. 简单地说,就是用于执行SQL语句的一类Java API,通过JDBC使得我们可以直接使用Java编程来对关系数据库进行操作.通过封装,可以使开发人员使用纯Java API完成SQL的执行. 一.

  • JDBC增删改查和查唯一的完整代码解析

    第一部分代码(实体类) package com.wf.entity; public class Hehe{ private int hehe_id; private String hehe_name; private String hehe_gender; public int getHehe_id(){ return hehe_id; } public void setHehe_id(int heheId){ hehe_id=heheId; } public String getHehe_na

  • java操作mysql实现增删改查的方法

    本文实例讲述了java操作mysql实现增删改查的方法.分享给大家供大家参考,具体如下: 首先,需要把MySQL与Java连接的jar(mysql-connector-java-5.1.6-bin.jar)包导入工程. package com.cn.edu; import java.beans.Statement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatemen

  • JDBC 实现通用的增删改查基础类方法

    java中关于数据的管理有很多的框架,如hibernate.mybatis等,但我最开始学习的就是JDBC,我觉得JDBC还是很不错的,它让我更深层次的了解了数据的操作,今天我将我写过的JDBC基础类再写一遍!加深下记忆!!! 先将通用的增查实现类BaseDAO贴上 package com.shude.DAO; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Par

  • mysql增删改查基础语句

    语法 这里是INSERT INTO命令将数据插入到MySQL表的通用SQL语法: INSERT INTO table_name ( field1, field2,...fieldN ) VALUES ( value1, value2,...valueN ); 要插入字符串类型数据,则需要双或单引号保留到所有的值,例如: "value". 1.从命令提示符插入数据 这将使用SQL 的INSERT INTO命令将数据插入到MySQL表:tutorials_tbl 示例 root@host#

  • jdbc实现连接和增删改查功能

    JDBC的定义 JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成.JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序. jdbc的基本连接 简单的说就是加载驱动,建立连接,然后进行查询和删除等语句的操作,在java中提供了java.sql的jar包,不过我现在用的是mysql的连接和实例,在这里基本

  • MySQL表的增删改查基础教程

    1. 新增(Create) insert into [表名] (字段1, 字段2,....) value (value1, value2, ...); insert into [表名] (字段1, 字段2, ....) values (value1, ...), (value2, ...), (value3, ...); 实例: 创建一个学生成绩表 CREATE TABLE exam_result ( id INT, name VARCHAR(20), chinese DECIMAL(3,1),

  • Java基础开发之JDBC操作数据库增删改查,分页查询实例详解

    对数据库的操作无非就是增删改查,其中数查询操作最为复杂,所以将查询单独讲解,我这里用的Mysql数据库 增删改查操作 分页查询操作 1.查询结果以list返回 2.查询结果以jsonArray返回 3.查询总记录条数 先看一下相关的配置信息 public static final String USER_NAME = "root"; public static final String PWD = "123456789"; public static final S

  • Java使用jdbc连接实现对MySQL增删改查操作的全过程

    目录 1.新建项目 2.添加jar包 3.jdbc的连接 4.简单的MySQL增删改查操作 总结 1.新建项目 新建一个项目,fileànewàproject如下图: 选择Javaà下一步,如下图:(注意如果jdk推荐使用jdk1.8版本哦,如果不是可以在project SDK中更换,Add JDK,找到自己电脑上放JDK1.8的地方,没有的话自行下载哦) 继续下一步 创建项目名字(自己起就行,注意项目名不要大写),找一个存放的地址,也自己决定就行. 2.添加jar包 一般默认位置是在如下位置:

  • 详解Java数据库连接JDBC基础知识(操作数据库:增删改查)

    一.JDBC简介 JDBC是连接java应用程序和数据库之间的桥梁. 什么是JDBC? Java语言访问数据库的一种规范,是一套API. JDBC (Java Database Connectivity) API,即Java数据库编程接口,是一组标准的Java语言中的接口和类,使用这些接口和类,Java客户端程序可以访问各种不同类型的数据库.比如建立数据库连接.执行SQL语句进行数据的存取操作. JDBC代表Java数据库连接. JDBC库中所包含的API任务通常与数据库使用: 连接到数据库 创

  • Java连接 JDBC基础知识(操作数据库:增删改查)

    一.JDBC简介 JDBC是连接java应用程序和数据库之间的桥梁. 什么是JDBC? Java语言访问数据库的一种规范,是一套API. JDBC (Java Database Connectivity) API,即Java数据库编程接口,是一组标准的Java语言中的接口和类,使用这些接口和类,Java客户端程序可以访问各种不同类型的数据库.比如建立数据库连接.执行SQL语句进行数据的存取操作. JDBC代表Java数据库连接. JDBC库中所包含的API任务通常与数据库使用: 连接到数据库 创

随机推荐