IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> java设计工具实现oracle中增删改差(create、drop、update,insert,delete,select) -> 正文阅读

[大数据]java设计工具实现oracle中增删改差(create、drop、update,insert,delete,select)

经历一个挺有意思的项目学习了另外一种可以更加合理的操作数据的方法下面是最近的项目总结。

需求:

需要我制作一个功能,要求能够进行数据库的update和delete操作,但是要求能够备份对应的数据,并且做好异常捕捉。

实现:

功能在使用的时候对于功能进行限制,要求将需要进行操作预置到指定的数据库表中,我们在前台进行展示,不会限制where以后的条件,但是做好删除或者更新字段的限制,这样可以最大程度的是功能变成强大并且能够合理的限制这个功能,避免有的用户恶意进行删除。

前段设计

在这里插入图片描述
在这里插入图片描述
就是在数据库中预支对应的字段,但是对于字段的修改之前一直没有想法,因为最初的设想是需要把需要更改的字段放到数据库中的一个一行记录的一个字段中,但是前段怎么使用确实是没有想好。因为我们的前段确实很难,至少我认为很难,动态生成文本框其实是可以的,但是要的急没有时间去思考我就用了最愚蠢的办法,
在这里插入图片描述

直接新建了10个文本框来处理,只需要控制文本框的显隐问题就可以了,这样前段的问题其实就处理完了。

后端设计

其实我认为难点在后端,我要修改或者删除记录,功能读取数据库的表中的记录,前段输入筛选条件,进行删除或者更新记录的时候,需要将需要更改或者删除的记录备份起来,然后在进行这个操作。难点就在备份这个问题上面了,首先我们需要先备份一下原来的表,其次如果有之前的表,我们要将我们的要修改的数据或者要删除的数据插入到备份的表中,这就要求我们去新建一个跟我们要操作表表结构一样的表,并且要多几个字段,要记录这个操作是修改还是删除,操作的时间,只有当备份表成功生成并且将将备份数据成功插入,才可以对于旧的表进行更新或者删除操作。

新建表
    //创建对应的表
    @Transactional
    @Modifying
    public JSONObject createTablename(String tablenameOld,String tablenameNew) {

        int i = entityManager.createNativeQuery("create table"+" "+tablenameNew+" "+" as select * from "+" "+tablenameOld+" "+" where 1=2").executeUpdate();
        int i1 = entityManager.createNativeQuery("alter table "+" "+tablenameNew+" "+" add (altertable_type  varchar2(10),altertable_name  varchar2(50),altertable_time  varchar2(40))").executeUpdate();

        // 修改时间类型
        alterTableType(tablenameNew);

        return null;
    }

这个其实是包括了新建表和添加字段,一定一定不能够忘记上面的两个备注@Transactional @Modifying一定不要忘记否则会提示报错。

修改表结构
 //创建表之后查询字段类型,将date,time转换成时间类型
    @Transactional
    @Modifying
    public JSONObject alterTableType(String tablenameNew) {

        JSONObject result = new JSONObject();

            String  sql = "select COLUMN_NAME as name,DATA_TYPE  as type from user_tab_columns  where table_name =upper('"+tablenameNew+"')";
            javax.persistence.Query query = entityManager.createNativeQuery(sql);
            query.unwrap(SQLQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
            List<Map> rows = query.getResultList();

            for (int i = 0; i < rows.size(); i++) {
                Map map = rows.get(i);
                if(map.get("TYPE").toString().length()>=4){
                    if(map.get("TYPE").toString().substring(0,4).equals("DATE")){
                        int i1 = entityManager.createNativeQuery("alter table "+" "+tablenameNew+" "+" modify ("+" "+map.get("NAME")+" "+" varchar2(30))").executeUpdate();

                    }
                    if(map.get("TYPE").toString().length()>=9&&map.get("TYPE").toString().substring(0,9).equals("TIMESTAMP")){
                        int i1 = entityManager.createNativeQuery("alter table "+" "+tablenameNew+" "+" modify ("+" "+map.get("NAME")+" "+" varchar2(30))").executeUpdate();
                    }

                }
            }

        return null;
    }

为什么要修改表结构呢?是因为我发现我从用这个方法拿到的数据办法插入到对应的数据中去,主要是时间戳这个字段,而且时间紧急,就直接把表结构改了,这是下下策但是确实好用,正好用。

select COLUMN_NAME as name,DATA_TYPE as type from user_tab_columns where table_name =upper('"+tablenameNew+"')这个是用来吧oracle中对应表的表结构查出来,但是注意查出来的都是大写可以看到我get的时候就是大写,我获取的也都是大写。

删除表
    @Transactional
    @Modifying
    public JSONObject dropTablename(String tablename) {

        int i = entityManager.createNativeQuery("drop table "+" "+tablename).executeUpdate();

        return null;
    }

就不多说了

查询
//查询是否有对应的表
    @Transactional
    @Modifying
    public JSONObject selectTablename(String tablenameOld , String tablenameNew) {
        JSONObject result = new JSONObject();

        try {
            String  sql = "select count(*) from user_tables where table_name =upper('"+tablenameNew+"')";
            javax.persistence.Query query = entityManager.createNativeQuery(sql);
            query.unwrap(SQLQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
            List<Map> rows = query.getResultList();
            String count = rows.get(0).get("COUNT(*)").toString();

            if("0".equals(count)){
                result.put("status","false");
                result.put("message","不存在对应表");
                return result;
            }else {
                JSONObject jsonObject = compareTableStructure(tablenameOld, tablenameNew);

//                if("true".equals(jsonObject.getString("status"))){
//
//                }
//                else {
//                    return jsonObject;
//                }
//                result.put("status","true");
//                result.put("message","null");
                return jsonObject;
            }


        }catch (Exception sqlex) {
            result.put("status","false");
            result.put("message","不存在对应表");
            return result;
        }
    }

这个操作是为了查询这个表是否存在,就是我们需要去验证他们在数据库中预置数据中表名字段是否正确,而且为了不报异常,我们可以直接select * from tablename但是会提示异常,你就会发现你写的事务的注解就生效了,你就没啥可以做的了,虽然确实应该生效但是我觉得会有更好的方法处理我们就应该用好的办法处理

插入
 //新表的插入操作
    @Transactional
    @Modifying
    public JSONObject insertIntotablenameNew(List<Map> rows,String tablenameNew,String datagovernancetype) {
        try{
            StringBuilder rowsName = new StringBuilder();
            StringBuilder rowsValue = new StringBuilder();

            for (int i = 0; i < rows.size(); i++) {
                Map map = rows.get(i);
                for (Object o : map.keySet()) {
                    rowsName.append( ","+o.toString());
                    Object o1 = map.get(o);
                    if(StringUtils.isEmpty(o1)){
                        rowsValue.append(", ''");
                    }else{
                        rowsValue.append( ",'"+o1.toString()+"'");
                    }
                }
            }
            if("1".equals(datagovernancetype)){
                rowsName.append(",altertable_type");
                rowsValue.append( ",'delete'");
            }else{
                rowsName.append(",altertable_type");
                rowsValue.append( ",'update'");
            }

            rowsName.append(",altertable_time");

            Date date =new Date();
            SimpleDateFormat  sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String format = sdf.format(date);
            rowsValue.append(",'"+format);
            rowsValue.append("'");

            String substringRowsName = rowsName.substring(1);
            String substringRowsValue = rowsValue.substring(1);

            //INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)

            String sql = "insert into "+" "+tablenameNew+" "+"("+" "+substringRowsName+" "+") values ("+" "+substringRowsValue+" "+")";
            int i = entityManager.createNativeQuery(sql).executeUpdate();

            JSONObject jsonObject =new JSONObject();
            jsonObject.put("status","true");

            return jsonObject;

        }
        catch (Exception e){
            JSONObject jsonObject =new JSONObject();
            jsonObject.put("status","false");

            return jsonObject;

        }

    }

插入,这个方法的作用是为了将我们查出来的时候进行插入,插入到我们的备份表中,

删除和修改
 /**
     *
     * @param tablenameOld 表名
     * @param datagovernancetype 更新类型
     * @param condition 条件
     * @param split 更细字段分离出来的内容
     * @param jsonArray 前段返回值
     * @return
     */
    @Transactional
    @Modifying
    public int updatetablenameOld(String tablenameOld,String datagovernancetype,String condition,String[] split,JSONArray jsonArray) {

        int res =0;

        String sql = "";
        //1表示delete,0表示update
        if("1".equals(datagovernancetype)){

            //DELETE FROM Person WHERE LastName = 'Wilson'
            sql = "delete from "+" "+tablenameOld+" "+"where"+" "+condition;


            res = entityManager.createNativeQuery(sql).executeUpdate();

            return res;
        }else{

            //UPDATE Person SET FirstName = 'Fred' WHERE LastName = 'Wilson'
            sql = "update "+" "+tablenameOld+" "+"set";

            for (int i = 0; i < split.length; i++) {
                String splits = split[i];
                for (int j = 0; j < jsonArray.size(); j++) {
                    JSONObject jsonObject = jsonArray.getJSONObject(j);
                    String key = jsonObject.getString("key");
                    if(key.equals(splits)){
                        sql = sql +" "+jsonObject.getString("key")+" "+"="+" '"+jsonObject.getString("value")+"' "+",";
                    }
                }
            }
            sql = sql.substring(0,sql.length()-1);
            sql = sql+"where"+" "+condition;
            res = entityManager.createNativeQuery(sql).executeUpdate();

            return res;
        }




    }

这里把删除和修改放在了一起,可以看到其实就是简单的字符串拼接。

注意

一定要注意这种写法的问题,这种写法一定要注意加空格,要不然直接就是在一起,就导致他的关键字识别不出来,你们可能会问entityManager是啥,我只能够提供一个@PersistenceContext private EntityManager entityManager;有兴趣的各位可以去搜一搜。

不足

其实还是有很多的不足的,希望大家指出来,一个表的结构被修改了,增加了字段或者字段增加了长度,导致我们备份失败,我们应该如何处理,重新建一张表用来存放内容吗?还是增加对应的字段?时间类型如何成功插入到数据库中?备份的数据应该存留预置数据的id吗?备份的数据应该保留筛选条件吗?很多的问题其实都是可以去优化的

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-03-16 22:27:35  更:2022-03-16 22:28:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:37:44-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码