SpringAI实现数据库增删改查

SpringAI实现数据库增删改查

起男 13 2025-06-20

SpringAI实现数据库增删改查

数据库表结构

    CREATE TABLE `t_user` (
        `id` int NOT NULL AUTO_INCREMENT,
        `username` varchar(50) DEFAULT NULL,
        `password` varchar(50) DEFAULT NULL,
        `age` int DEFAULT NULL,
        `create_time` datetime DEFAULT NULL,
        `is_deleted` int DEFAULT NULL,
        PRIMARY KEY (`id`)
    )

提示词

查询

根据用户需求和提供数据库表结构,生成查询sql
语法要求使用mysql语法,只能生成查询的sql
只返回生成的sql,不要返回其他
只能查询逻辑删除字段,值为0的数据

用户需求:{question}
数据库表结构:{ddl}
当前时间:{date}

新增

根据用户需求和提供数据库表结构,生成插入sql
语法要求使用mysql语法,只能生成插入的sql
只返回生成的sql,不要返回其他
尽量补全字段,如果有必填字段未获取到则只返回 1
新增的数据逻辑删除字段为0

用户需求:{question}
数据库表结构:{ddl}
当前时间:{date}

修改

根据用户需求和提供数据库表结构,生成修改sql
语法要求使用mysql语法,只能生成修改的sql
只返回生成的sql,不要返回其他
修改的sql必须有条件,否则只返回 1

用户需求:{question}
数据库表结构:{ddl}
当前时间:{date}

删除

根据用户需求和提供数据库表结构,生成逻辑删除sql,即将逻辑删除字段设置为1
语法要求使用mysql语法,只能生成逻辑删除的sql
只返回生成的sql,不要返回其他
删除的sql必须有条件,否则只返回 1

用户需求:{question}
数据库表结构:{ddl}
当前时间:{date}

类型判断

根据用户的输入判断对应的操作类型
类型只有一种,匹配最接近的
类型只能是:SELECT,UPDATE,INSERT,DELETE
只返回类型,不要返回其他东西

用户输入:{question}

controller

@RestController
@RequestMapping("sql")
@Slf4j
public class SqlController {
    @Autowired
    private ChatClient chatClient;
    @Autowired
    private JdbcTemplate jdbcTemplate;
    
    @Value("classpath:sql/schema.sql")
    private Resource ddl;

    @Value("classpath:st/type.st")
    private Resource typeTemp;
    @Value("classpath:st/query.st")
    private Resource queryTemp;
    @Value("classpath:st/save.st")
    private Resource saveTemp;
    @Value("classpath:st/update.st")
    private Resource updateTemp;
    @Value("classpath:st/delete.st")
    private Resource deleteTemp;

    @SneakyThrows
    @GetMapping("{message}")
    public Object sql(@PathVariable String message){
        //判断操作类型
        String type = chatClient.prompt()
                .user(us -> us.text(typeTemp).param("question", message))
                .call()
                .content();
        log.info("sql type:{}",type);
        //根据类型返回对应模板
        Resource temp = switch (type){
            case "SELECT" -> queryTemp;
            case "INSERT" -> saveTemp;
            case "UPDATE" -> updateTemp;
            case "DELETE" -> deleteTemp;
            default -> null;
        };
        //数据库表结构
        String schema = ddl.getContentAsString(Charset.defaultCharset());
        //生成sql
        String sql = chatClient.prompt()
                .user(us -> us.text(temp)//使用模板
                        .param("question", message)//设置参数
                        .param("ddl", schema)
                        .param("date", LocalDateTime.now().toString()))
                .call()
                .content();
        log.info("sql:{}",sql);
        //执行sql
        if ("SELECT".equals(type)){
            //查询数据库
            return jdbcTemplate.queryForList(sql);
        }else {
            if ("1".equals(sql)) {
                return "操作异常";
            }
            //写数据库
            jdbcTemplate.execute(sql);
            return "ok";
        }
    }
}