Java刚入门的菜鸟一枚,最近在完成一个JDBC连接数据库的小项目中,想到一种小思路:可以写一个带泛型的通用方法,直接将任意对象添加到MySql数据库指定的表中。这样可以在一定程度上减少SQL语句,提高代码的通用性。

1. 带泛型的增删改查dao层接口

public interface GeneralDao {
    <T> int addMess(T t);
    //删:写的很简单,根据表名、主键名、主键id来删除某行数据
    int deleteMess(Integer id, String tableName, String primeKey);
    <T> int alterMess(T t, Integer id,String primeKey);
    <T> List<T> selectMess(T t, Class<T> clazz, String... params);
    //分页查询:
    <T> PageInfo<T> findMessByPage1(T t, Class<T> clazz, String nowPage, String pageNum, String... params);

优点: 不用写单表增删改查的sql语句,减少一些工作量。

缺点: 不能适用于连表查询,使用的时候具有局限性,java中实体类名、属性名必须要与MySql中的表名、字段名完全对应。

2.接口的具体实现和关键工具类方法

  • 新增一条数据
  • public <T> int addMess(T t) {
        //需要表名、表的字段数量(即实体类的属性数量),字段名
        String[] allFieldName = TableUtil.getAllFieldName(t);
        String s = StringUtil.getMark(allFieldName.length, "?");
        String sql = "INSERT INTO " + TableUtil.getClassName(t).toLowerCase() + "(" + StringUtil.getMark("", allFieldName) + ") VALUES(" + s + ");";
        return JDBCUtil.operateDML(sql, TableUtil.getInstanceAllField(t));
    
  • 删除一条数据
  • public int deleteMess(Integer id, String tableName, String primeKey) {
        //需要对象的id
        String sql = "delete from " + tableName + " where " + primeKey + " =?";
        return JDBCUtil.operateDML(sql, id);
    

    -修改一条数据

    public <T> int alterMess(T t, Integer id,String primeKey) {
        String[] allFieldName = TableUtil.getAllNotNullFieldName(t);
        String sql = "UPDATE " + TableUtil.getClassName(t).toLowerCase() + " SET " + StringUtil.getMark(" = ?", allFieldName) + " WHERE "+primeKey+" = " + id + ";";
        return JDBCUtil.operateDML(sql, TableUtil.getInstanceAllNotNullField(t));
    
  • 查询一条数据
  • public <T> List<T> selectMess(T t, Class<T> clazz, String... params) {
        String selectSql = StringUtil.getSelectSql(t, params);
        return JDBCUtil.operateDQL(clazz, selectSql);
    
  • 工具类方法 int JDBCUtil.operateDML(String sql,Object...parmas) --人人都写过的JDBC执行DML语句的万能方法
  • List<T> JDBCUtil.operateDQL(Class clazz,String selectSql,Object...parmas)--执行DQL语句的万能方法

    Field[] TableUtil.getAllFieldName(T t) --获取泛型对象的所有成员属性

    String StringUtil.getMark(int fieldLength, String mark) --根据成员属性的个数拼接字符

    String[] TableUtil.getAllFieldName(T t) --获取泛型对象的属性名

    Object[] TableUtil.getInstanceAllField(T t) --获取泛型对象的所有属性值

    String[] TableUtil.getAllNotNullFieldName(T t) --获取泛型对象的所有非空属性名

    Object[] TableUtil.getInstanceAllNotNullField(T t) --获取泛型对象的所有非空属性值

    String StringUtil.getSelectSql(t, params) --获取泛型对象的查询语句:t中非空的属性为查询条件,parmas为模糊查询的字段数组

    具体工具类方法的实现在下一篇

    分类:
    后端
  •