用反射机制实现对数据库数据的增、查例子

基本原理;保存数据时,把需要保存的对象的属性值全部取出来再拼凑sql语句 
              查询时,将查询到的数据全部包装成一个java对象。 
        先定规则: 
            1)数据库的每一个表对象一个实体类,表中的每一个字段对应实体类的中的一个属性。并且实体类的名字和表的名字相同,属性名和字段名相同,大小写没有关系,因为数据库一般不区分大小写。

            2)为实体类中的每一个属性添加标准的set和get方法。 

1、首先数据库得有一个表,表名为User。如图:



2、创建一个实体类

/*
 * 实体类信息
 * */
public class User {
	private int id;
	private String name;
	private String password;
	private int age;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

}

3、编写连接数据库的工厂类

import java.sql.Connection;
import java.sql.DriverManager;

/*
 * 连接数据库
 * */
public class Connect2DBFactory {
	public static Connection getDBConnection() {
		Connection conn = null;
		try {
			Class.forName("com.mysql.jdbc.Driver");
			String url = "jdbc:mysql://localhost:3306/ssh";
			String user = "root";
			String password = "tiger";
			conn = DriverManager.getConnection(url, user, password);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return conn;
	}
}

4、编写操作数据库的Dao类

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

import com.zl.entity.User;
import com.zl.utils.Connect2DBFactory;

/*
 * 通过反射拼接得到sql语句
 * */
public class PersonDao {
	// 得到保存对象的sql
	public static String getsaveObjectSql(Object object) {
		// 定义一个sql字符串
		String sql = "insert into ";
		// 得到对象的类
		Class c = object.getClass();
		// 得到对象中所有的方法,包括继承父类的方法
		Method[] methods = c.getMethods();
		// 得到对象中所有的属性
		Field[] fields = c.getFields();
		// 得到对象类的名字
		String cName = c.getName();
		// 从类的名字中解析出表名,左包含右不包含
		String tableName = cName.substring(cName.lastIndexOf(".") + 1, cName.length());
		// 拼接sql语句
		sql = sql + tableName + "(";
		List<String> filedlist = new ArrayList<String>();
		List valueList = new ArrayList();
		for (Method method : methods) {
			String methodName = method.getName();
			if (methodName.startsWith("get") && !methodName.startsWith("getClass")) {
				String fieldname = methodName.substring(3, methodName.length());
				filedlist.add(fieldname);
				System.out.println("字段名字----->" + fieldname);
				try {
					Object value = method.invoke(object, null);
					System.out.println("执行方法返回的值:" + value);
					if(value instanceof String){
						valueList.add("\""+value+"\"");
						 System.out.println("字段值------>" + value);				
					}else{
						valueList.add(value);	
						System.out.println("字段值------>" + value);	
					}
				} catch (Exception e) {
					e.printStackTrace();
			}

			}
		}
		for (int i = 0; i < filedlist.size(); i++) {
			if (i < filedlist.size() - 1) {
				sql = sql + filedlist.get(i) + ",";
			}
			if (i == filedlist.size() - 1) {
				sql = sql + filedlist.get(i) + ")" + " values" + "(";
			}

		}
		for (int i = 0; i < valueList.size(); i++) {
			if (i < valueList.size() - 1) {
				sql = sql + valueList.get(i) + ",";
			}
			if (i == valueList.size() - 1) {
				sql = sql + valueList.get(i) + ")";
			}
		}

		return sql;
	}

	// 增加对象到数据库
	public static boolean savePerson(User user) {
		Connection con = Connect2DBFactory.getDBConnection();
		String sql = getsaveObjectSql(user);
		try {
			// Statement statement=(Statement) con.createStatement();
			PreparedStatement psmt = con.prepareStatement(sql);
			psmt.executeUpdate();
			return true;
		} catch (SQLException e) {
			e.printStackTrace();
			return false;
		}
	}

	// 从数据库查询数据
	public static String getQuerysql(Object object, String where, Object[] conditions) {
		Connection conn = Connect2DBFactory.getDBConnection();
		String fullclassname = object.getClass().getName();
		String className = fullclassname.substring(fullclassname.lastIndexOf(".") + 1, fullclassname.length());
		String sql = null;
		PreparedStatement ps;
		// 后面可以拼接where 1=1
		if (where == null) {
			sql = "select * from " + className + " where 1=1";
			return sql;
		} else {
			sql = "select * from " + className + " where 1=1 and " + where;
			String selectSql = sql + " Array:";
			try {
				ps = conn.prepareStatement(sql);
				// sql语句中的填充占位符
				if (conditions.length == 0) {
					return sql;
				}

				for (int i = 0; i < conditions.length; i++) {
					// if(){} int,string,date
					if (conditions[i] instanceof Integer) {
						ps.setInt(i + 1, (int) conditions[i]);
						// selectSql = selectSql + " :" +
						// conditions[i].toString();
						// System.out.println();

						// while (set.next()) {
						// System.out.println(set.getString("name").toString());
						// }
					}
					if (conditions[i] instanceof String) {
						ps.setString(i + 1, (String) conditions[i]);
					}
					if (conditions[i] instanceof Date) {
						ps.setTimestamp(i + 1, (Timestamp) conditions[i]);
					}

					// ps.setInt(i, conditions[i]);
				}
				ResultSet set = ps.executeQuery();
				String array = null;
				for (Object o : conditions) {
					if (o == conditions[0]) {
						array = o.toString();
					} else {
						array = array + "," + o.toString();
					}

				}
				System.out.println(selectSql + "[" + array + "]");
			} catch (SQLException e) {
				e.printStackTrace();
			}

			return sql;
		}

	}

	public static List<User> queryPerson(User user) {
		String sql = PersonDao.getQuerysql(user, null, null);
		Connection conn = Connect2DBFactory.getDBConnection();
		PreparedStatement psmt;
		ResultSet results;
		List<User> users;
		try {
			psmt = conn.prepareStatement(sql);
			results = psmt.executeQuery();
			users = new ArrayList<User>();
			while (results.next()) {
				User u = new User();
				int id = Integer.parseInt(results.getString("id"));
				String name = results.getString("name");
				String password = results.getString("password");
				int age = Integer.parseInt(results.getString("age"));
				u.setId(id);
				u.setName(name);
				u.setPassword(password);
				u.setAge(age);
				users.add(u);
			}
			return users;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}

}

5、编写测试类进行测试

import java.util.List;

import org.junit.Test;

import com.zl.dao.PersonDao;
import com.zl.entity.User;

/*
 * 测试类,测试写好的方法
 * */
public class TestPerson {

	@Test
	public void testsave() {
		User user = new User();
		user.setAge(20);
		user.setId(2);
		user.setName("小燕子");
		user.setPassword("芝麻开门");
		// System.out.println(PersonDao.getsaveObjectSql(user));
		PersonDao.savePerson(user);

	}

	@Test
	public void testselect() {
		User user = new User();
		int id = 2;
		String name = "小燕子";
		// System.out.println(PersonDao.getQuerysql(user, null, null));
		System.out.println(PersonDao.getQuerysql(user, "id=? and name=?", new Object[] { id, name }));
	}

	@Test
	public void testquery() {
		User user = new User();
		List<User> users = PersonDao.queryPerson(user);
		for (User u : users) {
			System.out.println(u.getName());
		}
		System.out.println(PersonDao.queryPerson(user).size());
	}
}

打印结果:

testselect():

select * from User where 1=1 and id=? and name=? Array:[2,小燕子]
select * from User where 1=1 and id=? and name=?

testquery():

zl
小燕子
2


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值