jdbc操作mysql(四):利用反射封装

前言

  • 有了前面利用注解拼接sql语句,下面来看一下利用反射获取类的属性和方法
  • 不过好像有一个问题,数据库中的表名和字段中带有下划线该如何解决呢

实践操作

  • 工具类:获取connection对象
public class JDBCUtil {
	public static Connection getConnection() {
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");
			String url = "jdbc:mysql://localhost/jdbctest";
			String user = "root";
			String password = "root";
			Connection connection = DriverManager.getConnection(url, user, password);
			return connection;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
}

  • 拼接sql语句,利用反射封装
public interface BaseMapper<T> {
	/**
	 * default关键字,修饰接口中的方法时,方法可以拥有方法体
	 * 拼接sql语句,例如向user表插入数据:insert into user (id, username, age, sex, password) value (?, ?, ?, ?, ?);
	 */
	default int insert(T t) throws Exception {
		StringBuilder sb = new StringBuilder("insert into ");  // 动态构建
		sb.append(t.getClass().getSimpleName());  // 获取类名
		sb.append("(");
		Method[] methods = t.getClass().getDeclaredMethods();
		int i = 0;
		for(Method m : methods) {
			if(m.getName().startsWith("get")) {  // startsWith方法用于判断是否以指定前缀开头
				Object o = m.invoke(t, null);  // 将获取的方法名参数化
				if(o != null) {
					sb.append(m.getName().substring(3));
					sb.append(",");
					i ++;
				}
			}
		}
		//截取掉最后一个逗号,添加一个右括号
		String s = sb.substring(0, sb.length() -1) + ")";
		StringBuilder sb1 = new StringBuilder(s);
		sb1.append(" values(");
		for(int j = 0; j < i; j++) {
			sb1.append("?,");
		}
		//截取掉最后一个逗号,添加一个右括号
		String sql = sb1.substring(0, sb1.length()-1) + ")";
		Connection conn = JDBCUtil.getConnection();
		PreparedStatement ps = conn.prepareStatement(sql);
		int j = 1;
		for(Method m : methods) {
			if(m.getName().startsWith("get")) {
				Object o = m.invoke(t, null);
				if(o != null) {
					ps.setObject(j, o);  // 注入对应的参数
					j++;
				}
			}
		}
		int insert = ps.executeUpdate();
		return insert;
	}
	
	/**
	 * 获取表中所有数据
	 * 例如获取user表中的所有数据:select * from user;
	 */
	default List<T> getAll(Class<T> t) throws Exception {
		String sql = "select * from " + t.getSimpleName();
		Connection conn = JDBCUtil.getConnection();
		PreparedStatement ps = conn.prepareStatement(sql);
		ResultSet rs = ps.executeQuery();
		List<T> lists = new ArrayList<T>();
		while(rs.next()) {
			T t1 = t.newInstance();
			Method[] methods = t1.getClass().getMethods();
			for(Method m : methods) {
				if(m.getName().startsWith("set")) {  // getName().substring(3) 获取属性名
					m.invoke(t1, rs.getObject(m.getName().substring(3)));  // 这里是按列名获取完一个对象后 初始化,再获取下一个对象的值
				}
			}
			lists.add(t1);  // 将对象添加到list集合
		}
		return lists;
	}
}

jdbc操作mysql(四):利用反射封装

上一篇:linux c setitimer用法说明


下一篇:Linux作业(三)-shell统计某文章中出现频率最高的N个单词并排序输出出现次数