首页 > 其他分享 >实例--通过反射手写持久层框架

实例--通过反射手写持久层框架

时间:2024-07-02 21:30:30浏览次数:20  
标签:declaredFields -- 实例 declaredField conn sql 手写 class append

简介

涉及技术栈:java mysql 反射 自定义注解 泛型 jdbc

持久层框架:与数据库交互的一层称为持久层(俗称dao层)

作用:可以无需写sql语句即可完成对表单的CRUD操作

引用相关jar包

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.30</version>
    </dependency>
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.2.8</version>
    </dependency>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.24</version>
    </dependency>

编写数据源properti文件

driverClassName = com.mysql.cj.jdbc.Driver
url = jdbc:mysql://localhost:数据库端口号/数据库名
username = 数据库账号
password = 数据库密码

DbUtil工具类代码

public class DbUtil {
    private static DataSource dataSource;

    static {
        try {
            Properties properties = new Properties();
            InputStream inputStream = DbUtil.class.getClassLoader().getResourceAsStream("db.properties");
            properties.load(inputStream);
            dataSource = DruidDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static Connection getConnection() throws Exception {
        Connection conn = dataSource.getConnection();
        return conn;
    }

    public static void closeAll(Connection conn, PreparedStatement ps, ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
        if (ps != null) {
            try {
                ps.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

BaseDao代码

public class BaseDao<T> {
    Connection conn;
    PreparedStatement ps;
    ResultSet rs;

    public int insert(T t) {
//        初始化sql语句
        StringBuilder sql = new StringBuilder("insert into ");
        Class<?> aClass = t.getClass();
        try {
//            获取实体类注解的值
            TableName annotation = aClass.getAnnotation(TableName.class);
//        将表名拼接到sql语句
            if (annotation != null) {
                sql.append(annotation.value()).append("(");
            } else {
                sql.append(aClass.getSimpleName()).append("(");
            }
//            获取所有实体类属性名
            Field[] declaredFields = aClass.getDeclaredFields();
            for (int i = 0; i < declaredFields.length; i++) {
                Field declaredField = declaredFields[i];
//                将属性名替换为数据库字段名
                if (declaredField.getAnnotation(Listing.class) != null) {
                    sql.append(declaredField.getAnnotation(Listing.class).value());
                } else {
                    sql.append(declaredField.getName());
                }
                if (i < declaredFields.length - 1) {
                    sql.append(",");
                } else {
                    sql.append(") value(");
                }
            }
//            获取所有实体类属性值
            for (int i = 0; i < declaredFields.length; i++) {
                Field declaredField = declaredFields[i];
                declaredField.setAccessible(true);
                if (declaredField.get(t) == null || declaredField.get(t).equals("")) {
                    sql.append((String) null);
                } else {
                    sql.append("'").append(declaredField.get(t)).append("'");
                }
                if (i < declaredFields.length - 1) {
                    sql.append(",");
                } else {
                    sql.append(")");
                }
            }
            conn = DbUtil.getConnection();
            ps = conn.prepareStatement(sql.toString());
            return ps.executeUpdate();
        } catch (Exception e) {
            System.out.println("检查配置文件是否正确引用或内容错误");
            throw new RuntimeException(e);
        } finally {
            DbUtil.closeAll(conn, ps, rs);
            System.out.println(sql);
        }
    }

    public int deleteById(T t) {
//        初始化删除sql语句
        StringBuilder sql = new StringBuilder("delete from ");
        Class<?> aClass = t.getClass();
        try {
            TableName annotation = aClass.getAnnotation(TableName.class);
            if (annotation != null) {
                sql.append(annotation.value()).append(" where ");
            } else {
                sql.append(aClass.getSimpleName()).append(" where ");
            }
            Field[] declaredFields = aClass.getDeclaredFields();
            for (int i = 0; i < declaredFields.length; i++) {
                Field declaredField = declaredFields[i];
                declaredField.setAccessible(true);
                if (declaredField.getAnnotation(PrimaryId.class) != null) {
                    sql.append(declaredField.getAnnotation(PrimaryId.class).value()).append(" = ").append("'").append(declaredField.get(t)).append("'");
                    break;
                } else if (declaredField.getName().toLowerCase().contains("id")) {
                    sql.append(declaredField.getName()).append(" = ").append("'").append(declaredField.get(t)).append("'");
                    break;
                }
            }
            conn = DbUtil.getConnection();
            ps = conn.prepareStatement(sql.toString());
            return ps.executeUpdate();
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            DbUtil.closeAll(conn, ps, rs);
            System.out.println(sql);
        }
    }

    public int updateById(T t) {
//        初始化修改sql语句
        StringBuilder sql = new StringBuilder("update ");
        Class<?> aClass = t.getClass();
        try {
            TableName annotation = aClass.getAnnotation(TableName.class);
            if (annotation != null) {
                sql.append(annotation.value()).append(" set ");
            } else {
                sql.append(aClass.getSimpleName()).append(" set ");
            }
            Field[] declaredFields = aClass.getDeclaredFields();
            for (int i = 0; i < declaredFields.length; i++) {
                Field declaredField = declaredFields[i];
                declaredField.setAccessible(true);
                if (declaredField.getAnnotation(PrimaryId.class) == null) {
                    if (declaredField.getAnnotation(Listing.class) != null) {
                        sql.append(declaredField.getAnnotation(Listing.class).value()).append(" = ").append("'").append(declaredField.get(t)).append("'");
                    } else {
                        sql.append(declaredField.getName()).append(" = ").append("'").append(declaredField.get(t)).append("'");
                    }
                } else {
                    continue;
                }
                if (i < declaredFields.length - 1) {
                    sql.append(",");
                } else {
                    sql.append(" where ");
                }
            }
            for (int i = 0; i < declaredFields.length; i++) {
                Field declaredField = declaredFields[i];
                declaredField.setAccessible(true);
                if (declaredField.getAnnotation(PrimaryId.class) != null) {
                    sql.append(declaredField.getAnnotation(PrimaryId.class).value()).append(" = ").append("'").append(declaredField.get(t)).append("'");
                    break;
                } else if (declaredField.getName().toLowerCase().contains("id")) {
                    sql.append(declaredField.getName()).append(" = ").append("'").append(declaredField.get(t)).append("'");
                    break;
                }
            }
            conn = DbUtil.getConnection();
            ps = conn.prepareStatement(sql.toString());
            return ps.executeUpdate();
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            DbUtil.closeAll(conn, ps, rs);
            System.out.println(sql);
        }
    }
}

打包分享jar文件

使用方法

一、引用jar包

导入绑定该帖的jar包

<dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.30</version>
    </dependency>
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.2.8</version>
    </dependency>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.24</version>
    </dependency>
二、编写数据源properti文件
driverClassName = com.mysql.cj.jdbc.Driver
url = jdbc:mysql://localhost:数据库端口号/数据库名
username = 数据库账号
password = 数据库密码
三、创建实体类如--User
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("user")    //表名如果和类名不同则使用该注解
public class User {
    @Listing("uid")
    @PrimaryId("uid")    //主键如果和属性名则不同使用该注解
    private Integer uid;
    @Listing("uname")    //列名如果和属性名不同则使用该注解
    private String username;
}
四、创建dao类如--UserDao

继承BaseDao并使用对应泛型,无需添加其他内容可直接使用BaseDao的三个提供的增删改方法,后续会不定时增加方法适应更多应用场合

public class UserDao extends BaseDao<User>{
}
功能测试如--修改功能测试

如需另外功能可自己在UserDao内进行拓展

public static void main(String[] args){
        UserDao userDao = new UserDao();
        System.out.println(userDao.updateById(new User(1, "a")));
    }

标签:declaredFields,--,实例,declaredField,conn,sql,手写,class,append
From: https://blog.csdn.net/Baizeh/article/details/140135859

相关文章

  • 第5章_指针(重点)
    文章目录第5章_指针1、指针的理解与定义1.1变量的访问方式1.2内存地址与指针1.3指针变量的定义1.4指针的应用场景2、指针的运算2.1取址运算符:&2.2取值运算符:*2.3指针的常用运算2.3.1指针与整数值的加减运算2.3.2指针的自增、自减运算2.3.3同类指针相减运算2.3......
  • 批量视频创作:PlugLink如何助力大规模视频生成(附源码)
    批量视频创作:PlugLink如何助力大规模视频生成传统的视频制作流程往往需要大量的人力、物力和时间投入,这不仅限制了内容产出的效率,也大大提高了成本。为了解决这一问题,PlugLink,一个开源的自动化框架,为我们提供了一种全新的解决方案。什么是PlugLink?PlugLink是一个旨在帮助......
  • 基于SpringBoot+Vue+uniapp的论文管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言......
  • 【Java学习笔记】方法的使用
    【Java学习笔记】方法的使用一、一个例子二、方法的概念及使用(一)什么是方法(二)方法的定义(三)方法调用的执行过程(四)实参和形参的关系(重要)(五)没有返回值的方法三、方法重载(一)为什么需要方法重载(二)方法重载概念(三)方法签名四、递归(一)生活中的故事(二)递归的概念(三)递归执行过程分......
  • Python基础入门知识
    目录引言      简要介绍Python语言      为什么要学习Python      Python的应用领域Python安装和环境配置      Python的下载和安装(Windows,macOS,Linux)      配置Python环境变量      安装和使用IDE(如PyCharm,VSCode)Python......
  • vue2项目的打包以及部署
        打包          当我们写好vue2的项目后,可以通过npmbuild来对项目进行打包npmbuild        打包完成后我们可以看到在当面目录下生成了dis目录,src下的文件都会被打包进这个目录里,当然打包后的文件我们不能直接在浏览器打开,需要进行部署......
  • 【Lua】脚本入门
    文章目录总述一、Lua概述二、Lua环境安装三、Lua基本语法四、Lua的库和扩展五、Lua的应用场景六、学习资源语法1.Lua基本语法示例变量和数据类型控制结构函数2.Lua标准库示例字符串操作数学函数文件I/O3.Lua作为脚本扩展示例(假设Lua嵌入在某个应用程序中)总述......
  • 两数之和 II - 输入有序数组-双指针
    题目描述:个人题解:        初始时两个指针分别指向第一个元素位置和最后一个元素的位置。每次计算两个指针指向的两个元素之和,并和目标值比较。如果两个元素之和等于目标值,则发现了唯一解。如果两个元素之和小于目标值,则将左侧指针右移一位。如果两个元素之和大于目......
  • 设计模式1-单例模式
    #单例模式    构造函数私有化。        私有化是为了阻止外部代码直接通过new关键字来实例化对象,从而确保单例唯一性,防止有子类继承破坏单例模式的唯一性    改单列对象必须由单例类自己创建    内部提供一个方法给外界调用对象.#饿汉普通实现p......
  • Windows环境下安装nvm的详细步骤
    Windows环境下安装nvm的详细步骤nvm(NodeVersionManager)是一个用于管理多个Node.js版本的工具,它允许用户在同一台机器上安装和切换不同版本的Node.js,从而解决因版本不兼容导致的各种问题。在Windows环境下安装nvm相对简单,下面将详细介绍安装步骤。一、下载nvm安......