java反射实现mysql通用增删查改

不依赖任何jar,原生实现mysql通用增删改查操作.
开门见山,上代码(注:以下代码中所有的Object参数均为对应数据表的javaBean实体类)
`//首先建立连接(重点在后面,这里简单写一下)
public Connection getConn() throws Exception {
	Class.forName("com.mysql.jdbc.Driver");
	String url = "jdbc:mysql://localhost:3306/test" ;
	String username = "root";
	String password = "root";
	Connection conn = DriverManager.getConnection(url, username, password);
	return conn;
}

/**
 * 查询操作,这个重点在对获取的到的结果集进行解析,转换成List
 * */
public List select(Object obj,Connection conn) throws Exception{
	List list = new ArrayList();
	Class cla = obj.getClass();
	//得到类名 作为表名查询
	String claname = cla.getSimpleName();
	//得到属性数组
	Field[] fieldArr = cla.getDeclaredFields();
	String sql = "SELECT * FROM "+claname+"";
	Statement st = conn.prepareStatement(sql);
	ResultSet rs = st.executeQuery(sql);
	while(rs.next()){
		//调用无参构造方法。实例化对象obj
		Object realObj= cla.newInstance();
		for(int i = 0;i<fieldArr.length;i++){
			//拿到每个属性,每个属性作为一个Field类的对象
			Field field = fieldArr[i];
			field.setAccessible(true);
			Class fieldClass = field.getType();
			//设置属性值
			setValue(fieldClass, field, realObj, rs);
		}
		list.add(realObj);
	}
	return list;
}

/**
 * 查询赋值,通过此方法解析ResultSet将字段值赋值到对象的属性中
 * */
public void setValue(Class fieldClass,Field field,Object obj,ResultSet rs) throws Exception {
	//如下为常用数据类型,如果不够用,手动添加即可
	if(fieldClass.toString().equals("int")){
		field.set(obj, rs.getInt(field.getName()));
	}else if(fieldClass.toString().equals("long")) {
		field.set(obj, rs.getLong(field.getName()));
	}else if(fieldClass.toString().equals("float")) {
		field.set(obj, rs.getFloat(field.getName()));
	}else if(fieldClass.toString().equals("double")) {
		field.set(obj, rs.getDouble(field.getName()));
	}else if(fieldClass.toString().equals("boolean")) {
		field.set(obj, rs.getBoolean(field.getName()));
	}else if(fieldClass.toString().equals("class java.lang.String")){
		field.set(obj,rs.getString(field.getName()));
	}else if(fieldClass.toString().equals("class java.util.Date")){
		field.set(obj,rs.getDate(field.getName()));
	}
}

/**
 * 插入操作,重点在于sql语句拼接
 * */
public int add (Object obj,Connection conn) throws Exception{
	Class cla = obj.getClass();
		//得到类名
		String claname = cla.getSimpleName();
		//得到属性数组
		Field[] fieldArr = cla.getDeclaredFields();
		String attributeName = "";
		String value = "";
		for(int i =0;i<fieldArr.length;i++){
			Field field = fieldArr[i];
			field.setAccessible(true);
			Class fieldClass = field.getType();
			attributeName = attributeName+field.getName()+",";
			value = getValueSql(fieldClass, field, value, obj);
		}
		//去掉末位逗号
		attributeName = attributeName.substring(0,attributeName.length()-1);
		value = value.substring(0, value.length()-1);
		String sql = "INSERT INTO "+claname+"("+attributeName+" ) VALUES ("+value+")";
		Statement st = conn.prepareStatement(sql);
		return st.executeUpdate(sql);
}

/**
 * 插入操作,获取对象属性值,转换拼接成sql语句
 * */
public String getValueSql(Class fieldClass,Field field,String value,Object obj) throws Exception {
	//如下为常用数据类型,如果不够用,手动添加即可
	if(fieldClass.toString().equals("class java.lang.String")){
		value = value+"'"+(String)field.get(obj)+"',";
	}else if(fieldClass.toString().equals("int")){
		value = value +(Integer)field.get(obj)+",";
	}else if(fieldClass.toString().equals("long")){
		value = value +(Long)field.get(obj)+",";
	}else if(fieldClass.toString().equals("float")){
		value = value +(Float)field.get(obj)+",";
	}else if(fieldClass.toString().equals("double")){
		value = value +(Double)field.get(obj)+",";
	}else if(fieldClass.toString().equals("boolean")){
		value = value +(Boolean)field.get(obj)+",";
	}else if(fieldClass.toString().equals("class java.util.Date")){
		value = value +"'"+formatTimeString(((Date)field.get(obj)).getTime() / 1000)+"',";
	}
	return value;
}

/**
 * 时间类型转换
 * */
public static String formatTimeString(long time) {
	DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	Date date = new Date();
	date.setTime(time * 1000);
	Calendar cal = Calendar.getInstance();
	cal.setTime(date);
	int iDstOffset = cal.get(Calendar.DST_OFFSET);
	if (iDstOffset > 0) {
		date.setTime(time * 1000 - iDstOffset);
	}
	return fmt.format(date);
}

/**
 * 更新操作,重点在sql语句的拼接
 * */
public int update(Object obj,String where,Connection conn) throws Exception{
	Class cla = obj.getClass();
	Field[] fieldArr = cla.getDeclaredFields();
	String valueSql = "";
	for(int i =0;i<fieldArr.length;i++){
		Field field = fieldArr[i];
		field.setAccessible(true);
		Class fieldClass = field.getType();
		valueSql = getValueSql(valueSql, field, fieldClass, obj);
	}
	valueSql = valueSql.substring(0, valueSql.length() - 1);
	String sql = "UPDATE  "+cla.getSimpleName() +" SET "+valueSql+where;
	Statement st = conn.prepareStatement(sql);
	return st.executeUpdate(sql);
}

/**
 * 更新操作,获取对象属性值,拼接sql
 * */
public String getValueSql(String valueSql,Field field,Class fieldClass,Object obj) throws Exception {
	valueSql = valueSql+field.getName()+"=";
	if(fieldClass.toString().equals("class java.lang.String")){
		valueSql = valueSql+"'"+(String)field.get(obj)+"',";
	}else if(fieldClass.toString().equals("int")){
		valueSql= valueSql +(Integer)field.get(obj)+",";
	}else if(fieldClass.toString().equals("long")){
		valueSql= valueSql +(Long)field.get(obj)+",";
	}else if(fieldClass.toString().equals("float")){
		valueSql= valueSql +(Float)field.get(obj)+",";
	}else if(fieldClass.toString().equals("double")){
		valueSql= valueSql +(Double)field.get(obj)+",";
	}else if(fieldClass.toString().equals("boolean")){
		valueSql= valueSql +(Boolean)field.get(obj)+",";
	}else if(fieldClass.toString().equals("class java.util.Date")){
		valueSql= valueSql +"'"+formatTimeString(((Date)field.get(obj)).getTime() / 1000)+"',";
	}
	return valueSql;
}

/**
 * 删除操作, 这个就是简单封装了个方法
 * */
public int delete(Connection conn,String tableName,String keyName,int keyValue) throws SQLException {
	String sql = "DELETE from "+tableName+" where "+keyName+"="+keyValue;
	PreparedStatement st = conn.prepareStatement(sql);
	return st.executeUpdate();
}`
以上就是所有代码,本人是在维护一个很老的项目时用到过,所以顺便整理出来.需要的客官拿走即用.
第一次发帖,如有错误的地方请大家帮忙指出来,望大家多多包涵

转载于:https://my.oschina.net/u/3299589/blog/3049523

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值