java反射对数据库进行增删改查_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

//拿到每个属性,每个属性作为一个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

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

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();

}`

以上就是所有代码,本人是在维护一个很老的项目时用到过,所以顺便整理出来.需要的客官拿走即用.

第一次发帖,如有错误的地方请大家帮忙指出来,望大家多多包涵

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值