功能实现 —— 数据库管理(Hutool-db - 简单使用增删改查)

Hutool - Db
基础学习:
--- 官方文档
--- 个人整理文档
源代码:Wset - Gitee.com

搭建环境

本文以mariadb作为测试数据库
测试api工具:postman
数据库和api测试工具可自行选择

1. 引入依赖

        <!--引入Hutool依赖-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.7.2</version>
        </dependency>
        <!--引入mariadb驱动依赖-->
        <dependency>
            <groupId>org.mariadb.jdbc</groupId>
            <artifactId>mariadb-java-client</artifactId>
            <version>2.1.2</version>
        </dependency>

2. mariadb数据库创建user和article测试表

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `sex` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `age` int(11) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, 'san.zhang', 'man', 22);
INSERT INTO `user` VALUES (2, '李四', '女', 18);

SET FOREIGN_KEY_CHECKS = 1;
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for article
-- ----------------------------
DROP TABLE IF EXISTS `article`;
DROP TABLE IF EXISTS `article`;
CREATE TABLE `article`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `authId` int(11) NOT NULL,
  `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `authIId`(`authId`) USING BTREE,
  CONSTRAINT `authIId` FOREIGN KEY (`authId`) REFERENCES `user` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE = InnoDB AUTO_INCREMENT = 15 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of article
-- ----------------------------
INSERT INTO `article` VALUES (1, 'hello world', 1, 'say hi');
INSERT INTO `article` VALUES (2, '你好', 2, 'hello');

SET FOREIGN_KEY_CHECKS = 1;

3. 设置db.setting

## 基本配置信息
# JDBC URL,根据不同的数据库,使用相应的JDBC连接字符串
url = jdbc:mariadb://192.168.205.131:3306/test
# 用户名,此处也可以使用 user 代替
username = root
# 密码,此处也可以使用 pass 代替
password = root

## 可选配置
# 是否在日志中显示执行的SQL
showSql = true
# 是否格式化显示的SQL
formatSql = false
# 是否显示SQL参数
showParams = true
# 打印SQL的日志等级,默认debug
sqlLevel = debug

简单测试连通

package com.west.server.test;

import java.sql.SQLException;
import java.util.List;

import cn.hutool.db.Db;
import cn.hutool.db.Entity;

public class dbTest {

    public static void main(String[] args) throws SQLException {
        List<Entity> list =  Db.use().findAll("user");
        System.out.print(list);
    }

}

返回数据则成功连通


testReq.png

创建service层

  1. 在service目录下创建dbManagerService.java文件
package com.west.server.service;

import java.util.List;

import cn.hutool.db.Entity;
import cn.hutool.db.PageResult;
import cn.hutool.db.meta.Table;

public interface dbManagerService {
    //获取当前库的所有表名
    List<String> getAllTablesName();
    
    //获取表结构
    Table getTableStructure(String tableName);

    //插入数据
    boolean addData(Entity data);

    //插入数据并返回自增主键
    Long addDataForGeneratedKey(Entity data);

    //删除数据
    boolean delData(Entity where);

    //更新数据
    boolean updateData(Entity data,Entity where);

    //查询表全部数据
    List<Entity> findAllList(String tableName);

    //按条件进行查询,含模糊查询
    List<Entity> findAllList(Entity where);

    //模糊查询
    List<Entity> findLikeList(String tableName,String field,String value);

    //分页查询
    PageResult<Entity> getPage(Entity where ,int pages,int pageSize);

    //自定义查询SQL
    List<Entity> customerRSqL(String sql);

    //自定义增删改SQL
    boolean customerCUDSql(String sql);
}
  1. 在serviceImpl目录下创建dbManagerServiceImpl.java文件
package com.west.server.service.serviceImpl;

import java.sql.SQLException;
import java.util.List;

import com.west.server.service.dbManagerService;

import org.springframework.stereotype.Repository;

import cn.hutool.db.Db;
import cn.hutool.db.Entity;
import cn.hutool.db.Page;
import cn.hutool.db.PageResult;
import cn.hutool.db.ds.DSFactory;
import cn.hutool.db.meta.MetaUtil;
import cn.hutool.db.meta.Table;
import cn.hutool.db.sql.Condition.LikeType;

@Repository
public class dbManagerServiceImpl implements dbManagerService {

    @Override
    public List<String> getAllTablesName() {
        // TODO Auto-generated method stub
        return MetaUtil.getTables(DSFactory.get());
    }

    @Override
    public Table getTableStructure(String tableName) {
        // TODO Auto-generated method stub
        return MetaUtil.getTableMeta(DSFactory.get(), tableName);
    }

    @Override
    public boolean addData(Entity data) {
        // TODO Auto-generated method stub
        boolean result = false;
        try {
            if (Db.use().insert(data) == 1)
                result = true;
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return result;
    }

    @Override
    public Long addDataForGeneratedKey(Entity data) {
        // TODO Auto-generated method stub
        try {
            return Db.use().insertForGeneratedKey(data);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return (long) 0;
        }
    }

    @Override
    public boolean delData(Entity where) {
        // TODO Auto-generated method stub
        boolean result = false;
        try {
            if (Db.use().del(where) == 1)
                result = true;
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return result;
    }

    @Override
    public boolean updateData(Entity data, Entity where) {
        // TODO Auto-generated method stub
         // TODO Auto-generated method stub
         boolean result = false;
         try {
             if (Db.use().update(data,where) == 1)
                 result = true;
         } catch (SQLException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
         return result;
    }

    @Override
    public List<Entity> findAllList(String tableName) {
        // TODO Auto-generated method stub
        try {
            return Db.use().findAll(tableName);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return null;
        }
    }

    @Override
    public List<Entity> findAllList(Entity where) {
         // TODO Auto-generated method stub
         try {
            return Db.use().findAll(where);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return null;
        }
    }

    @Override
    public List<Entity> findLikeList(String tableName, String field, String value) {
         // TODO Auto-generated method stub
         try {
            return Db.use().findLike(tableName,field,value,LikeType.Contains);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return null;
        }
    }

    @Override
    public PageResult<Entity> getPage(Entity where, int pages, int pageSize) {
        // TODO Auto-generated method stub
        try {
            return Db.use().page(where, new Page(pages, pageSize));
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return null;
        }
    }

    @Override
    public List<Entity> customerRSqL(String sql) {
        // TODO Auto-generated method stub
        try {
            return Db.use().query(sql);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

    @Override
    public boolean customerCUDSql(String sql) {
        // TODO Auto-generated method stub
        boolean result = false;
         try {
             if (Db.use().execute(sql) == 1)
                 result = true;
         } catch (SQLException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
         return result;
    }
    
}

创建controller层

package com.west.server.controller;

import java.util.List;

import com.west.server.service.dbManagerService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import cn.hutool.db.Entity;
import cn.hutool.db.meta.Table;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;

@RequestMapping("/dbManager")
@RestController
public class dbManagerController {
    @Autowired
    dbManagerService dManagerService;

    
    /**
     * 获取当前库的所有表名
     * API测试URL:http://localhost:8080/dbManager/getAllTablesName
     * @return
     */
    @GetMapping("/getAllTablesName")
    public JSONObject getAllTablesName(){
        List<String> lis = dManagerService.getAllTablesName();
        JSONObject jsonObject = JSONUtil.createObj()
            .putOnce("count", lis.size())
            .putOnce("data", lis);
        return jsonObject;
    }

    /**
     * 获取表结构
     * API测试URL:http://localhost:8080/dbManager/getTableStructure/?tablename=article
     * @param tablename 对应数据库的表名
     * @return
     */
    @GetMapping("/getTableStructure")
    public JSONObject getTableStructure(@RequestParam("tablename") String tablename){
        Table table = dManagerService.getTableStructure(tablename);
        JSONObject jsonObject = JSONUtil.createObj()
            .putOnce("count", table.getColumns().size())
            .putOnce("data", table.getColumns());
        return jsonObject;
    }

    /**
    * 插入数据
     * API测试URL:http://localhost:8080/dbManager/addData
     * @param request 传入数据:JSON
     * 格式:
     * {
        "#table":"对应数据库的表名",
        "tablename" : "{{tablename}}",
        "#data":"需要插入的数据,例如:{id:1,title:你好},data能为空",
        "data":{{data}} 
        }
     * @return
     */
    @PostMapping("/addData")
    public String addData(@RequestBody JSONObject request){
        Entity data = Entity.create(request.getStr("tablename")).parseBean(request.get("data"));
        if (dManagerService.addData(data)) return "success";
        return "error";
        
    }

    /**
    * 插入数据并返回自增主键
     * API测试URL:http://localhost:8080/dbManager/addDataForGeneratedKey
     * @param request 传入数据:JSON
     * 格式:
     * {
        "#table":"对应数据库的表名",
        "tablename" : "{{tablename}}",
        "#data":"需要插入的数据,例如:{id:1,title:你好},data能为空",
        "data":{{data}} 
        }
     * @return
     */
    @PostMapping("/addDataForGeneratedKey")
    public Long addDataForGeneratedKey(@RequestBody JSONObject request){
        Entity data = Entity.create(request.getStr("tablename")).parseBean(request.get("data"));
        return dManagerService.addDataForGeneratedKey(data); 
    }

    /**
    * 删除数据
     * API测试URL:http://localhost:8080/dbManager/delData
     * @param request 传入数据:JSON
     * 格式:
        {
            "#table":"需要修改的数据库表名",
            "tablename" : "{{tablename}}",
            "#where":"限制条件,例如:{id:1},where不能为空",
            "where":{{where}}
        }
     * @return
     */
    @PostMapping("/delData")
    public String delData(@RequestBody JSONObject request){
        Entity where = Entity.create(request.getStr("tablename")).parseBean(request.get("where"));
        if (dManagerService.delData(where)) return "success";
        return "error";
    }

    /**
    * 更新数据
     * API测试URL:http://localhost:8080/dbManager/updateData
     * @param request 传入数据:JSON
     * 格式:
        {
            "#table":"对应数据库的表名",
            "tablename" : "{{tablename}}",
            "#data":"需要插入的数据,例如:{id:1,title:你好},data不能为空",
            "data":{{data}},
            "#where":"限制条件,例如:{id:1},where不能为空",
            "where":{{where}}
        }
     * @return
     */
    @PostMapping("/updateData")
    public String updateData(@RequestBody JSONObject request){
        Entity data = Entity.create(request.getStr("tablename")).parseBean(request.get("data"));
        Entity where = Entity.create(request.getStr("tablename")).parseBean(request.get("where"));
        if (dManagerService.updateData(data, where)) return "success";
        return "error";
    }

    /**
     * 查询表全部数据
     * API测试URL:http://localhost:8080/dbManager/findTableAllList?tablename=article
     * @param tablename 对应数据库的表名
     * @return
     */
    @GetMapping("/findTableAllList")
    public JSONObject findAllList(@RequestParam("tablename") String tablename){
        List<Entity> lis = dManagerService.findAllList(tablename);
        JSONObject jsonObject = JSONUtil.createObj()
            .putOnce("count", lis.size())
            .putOnce("data", lis);
        return jsonObject;
    }

    /**
    * 按条件进行查询,含模糊查询
     * API测试URL:http://localhost:8080/dbManager/findTableAllList
     * @param request 传入数据:JSON
     * 格式:
        {
            "#table":"需要修改的数据库表名",
            "tablename" : "{{tablename}}",
            "#where":"限制条件,例如:{id:1},where不能为空",
            "where":{{where}}
        }
     * @return
     */
    @PostMapping("/findTableAllList")
    public JSONObject findAllList(@RequestBody JSONObject request){
        Entity where = Entity.create(request.getStr("tablename")).parseBean(request.get("where"));
        List<Entity> lis = dManagerService.findAllList(where);
        JSONObject jsonObject = JSONUtil.createObj()
            .putOnce("count", lis.size())
            .putOnce("data", lis);
        return jsonObject;
    }

    /**
     * 模糊查询
     * API测试URL:http://localhost:8080/dbManager/findTableAllList?tablename=article
     * @param tablename 对应数据库的表名
     * @param field 字段名
     * @param value 对应值
     * @return
     */
    @GetMapping("/findTableLikeList")
    public JSONObject findLikeList(@RequestParam("tablename") String tablename,@RequestParam("field") String field,@RequestParam("value") String value){
        List<Entity> lis = dManagerService.findLikeList(tablename,field,value);
        JSONObject jsonObject = JSONUtil.createObj()
            .putOnce("count", lis.size())
            .putOnce("data", lis);
        return jsonObject;
    }

    /**
    * 分页查询
     * API测试URL:http://localhost:8080/dbManager/getPage
     * @param request 传入数据:JSON
     * 格式:
        {
            "#table":"需要修改的数据库表名",
            "tablename" : "{{tablename}}",
            "#where":"限制条件,例如:{id:1},where不能为空",
            "where":{{where}},
            "#pages":"页码",
            "pages":{{pages}},
            "#pageSize":"每页数量",
            "pageSize":{{pagesize}}
        }
     * @return
     */
    @PostMapping("/getPage")
    public JSONObject getPage(@RequestBody JSONObject request){
        Entity where = Entity.create(request.getStr("tablename")).parseBean(request.get("where"));
        List<Entity> lis = dManagerService.getPage(where, request.getInt("pages"), request.getInt("pageSize"));
        JSONObject jsonObject = JSONUtil.createObj()
            .putOnce("count", lis.size())
            .putOnce("data", lis);
        return jsonObject;
    }

    /**
     * 自定义查询语句
     * API测试URL:http://localhost:8080/dbManager/customerRSqL
     * @param request 传入数据:JSON
     * 格式:
        {
            "#sql": "自定义sql语句",
            "sql": "{{selectSQL}}"
        }
     * @return
     */
    @PostMapping("/customerRSqL")
    public JSONObject customerRSqL(@RequestBody JSONObject request){
        List<Entity> lis = dManagerService.customerRSqL(request.getStr("sql"));
        JSONObject jsonObject = JSONUtil.createObj()
            .putOnce("count", lis.size())
            .putOnce("data", lis);
        return jsonObject;
    }
    
    /**
     * 自定义查询语句
     * API测试URL:http://localhost:8080/dbManager/customerCUDSql
     * @param request 传入数据:JSON
     * 格式:
        {
            "#sql": "自定义sql语句",
            "sql": "{{selectSQL}}"
        }
     * @return
     */
    @PostMapping("/customerCUDSql")
    public String customerCUDSql(@RequestBody JSONObject request){
        if (dManagerService.customerCUDSql(request.getStr("sql"))) return "success";
        return "error";
    }
}

测试数据

  1. 按dbManagerController 测试URL进行测试
  2. 自行到Gitee(https://gitee.com/waiter-chen/wset/tree/V0.0.1)下载postmanData配置文件导入到postman进行测试
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容