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";
}
}
}