其实,我更喜欢写 SQL

此文章充满了个人的主观色彩,如果引起了大家的不适,那我也没办法。

其实,我更喜欢写 SQL,如果在此基础上再稍微方便一些就更好了,所以,我理想中的持久层应该是这样的。

对于单表的增删改查

由于它不需要各种 join,所以我们关心的只不过是字段,参数和条件而已,所以必须要有一种方式让我们只需要关注这三点,不需要去写那些固定模式的 SQL,比如这样。

ParamPO paramPO = new ParamPO();
paramPO.setUserName("a");
paramPO.setUserEmail("test@qq.com");

int result = MagicDBUtils.get(jdbcTemplate).insert("表名", paramPO);

又或者这样

/ 构建查询条件
ConditionBuilder conditionBuilder = ConditionBuilder.createCondition()
            .add("id > ?", 10)
            .add("and (name = ? or age > ?)", "bee", 10)
            .add("order by create_time", Condition.NOT_WHERE);

// 执行查询
List<ParamPO> result = MagicDBUtils.get(jdbcTemplate).select("表名", conditionBuilder, ParamPO.class);

注意看上面的代码示例,他跟现有的框架有什么区别?答案就在这行

.add("and (name = ? or age > ?)", "bee", 10)

现有的框架如果要实现这样的条件是一件很头疼的事,而我们可以直接把查询条件写出来,不需要去 set 一堆对象。

其他框架只能很方便的实现这种(也许是我孤陋寡闻,如果说错了欢迎大家来拍砖)

.add("id > ?", 10)

这就是其他框架的写法,不仅没有我们灵活,而且还不够直观,需要能一眼看懂方法名是什么意思。大家可以把这段代码跟上面的那段比一比,哪段更直观简直不言而喻。

ImsCardGoodsExample.Criteria criteria = cardGoodsExample.createCriteria()
                .andIccidEqualTo(iccid) // 需要看懂英文equal
                .andEndTimeLessThanOrEqualTo(new Date()); // 至于这句是什么意思?到底是>=还是<=,别装了,英文很好的程序员占比真不大

对于其他操作

由于需要各种统计,函数,join,这个时候无论代码设计的多么出色都不可能有 SQL 灵活好用,而且我们几乎都会在 navicat 等各种客户端里写一遍 SQL,验证成功了才会把他应用到程序里去。所以在这个场景下我个人认为没有什么方式比把 SQL 直接拷贝到程序里更方便的方式了,所以他必须能很友好的支持原生 SQL。

比如查询

ParamPO paramPO = new ParamPO();
paramPO.setId(5);
paramPO.setUserName("a");

// 采用{}占位符的写法
List<ParamPO> result = MagicDBUtils.get(jdbcTemplate).selectList("select * from xt_message_board where id > {id} and user_name != {user_name}", paramPO, ParamPO.class);

// 采用 ? 占位符的写法
List<ParamPO> result = MagicDBUtils.get(jdbcTemplate).selectList("select * from xt_message_board where id > ? and user_name != ?", new Object[]{5, "a"}, ParamPO.class);

又或者增删改

ParamPO paramPO = new ParamPO();
paramPO.setUserName("testTx222");
paramPO.setUserEmail("testTx222@qq.com");
paramPO.setId(4);

// 采用{}占位符的写法
int result = MagicDBUtils.get(jdbcTemplate).exec("update xt_message_board set user_name = {user_name} , user_email = {user_email} where id = {id}", paramPO);

// 采用 ? 占位符的写法
int result = MagicDBUtils.get(jdbcTemplate).exec("update xt_message_board set user_name = ? , user_email = ? where id = ?", new Object[]{"testTx222","testTx222@qq.com", 4});

分个页而已,有没有必要引入三方插件啊?

简简单单一句话搞定,当然了,只支持 mysql 哈,为什么不支持别的?因为我懒(其实是大部分公司都不舍得买 oracle,db2 等数据库,所以我觉得这个懒可以偷)

// 查询条件
ParamPO paramPO = new ParamPO();
paramPO.setId(5);
paramPO.setUserName("a");

// 查询参数
PageParamModel pageParamModel = new PageParamModel();
pageParamModel.setCurrentPage(1);
pageParamModel.setPageSize(10);
pageParamModel.setParam(paramPO);// 把查询条件set进去

// 使用默认countSql查询
PageModel<ParamPO> pageModel =  MagicDBUtils.get(jdbcTemplate).selectPage("select * from xt_message_board where id > {id} and user_name != {user_name}", pageParamModel, ParamPO.class);

// 使用自定义countSql查询
String countSql = "自己定义countSql";

PageModel<ParamPO> pageModel =  MagicDBUtils.get(jdbcTemplate).selectPageCustomCountSql("select * from xt_message_board where id > {id} and user_name != {user_name}", countSql, pageParamModel, ParamPO.class);

SQL 写在代码里很难看?

现在已经 2024 年的年底了,90 年出生的程序员都已经达到 35 岁退休的年龄了,所以不要再守着 JDK8 过日子了,试一试 JDK17

String sql = """
             select 
                 id,name,age,create_time
             from 
                 user_info
             where 
                 name = {name} and age > {age}
            """;

最重要的是

它只不过是对 Spring 的 JdbcTemplate 做了一个小小的扩展,也就是这玩意儿

@Resource
private JdbcTemplate jdbcTemplate;

所以稳定性,各方面都不用担心,而且使用起来超级方便,也就是说你只需要在 https://start.springboot.io 网站建立一个 springboot 项目,然后再添加一个依赖就好了,不需要去查阅 mybaits 怎么整合,分页插件怎么整合等一堆事。

所以你们打算尝试一下吗?

项目官网:https://magician-io.com

<think>嗯,用户想了解在SQL Server Management Studio中如何查询用代码创建的表。这个问题很实用,因为用户可能刚通过SQL脚本创建了表,现在需要验证结果或进行后续操作。 从引用来看,用户提供了几个相关的引用片段:[1]介绍了SSMS的基本功能,[2][5]涉及CREATE TABLE语法,[3]提到切换数据库上下文,[4]则关于代码片段管理。这些正好覆盖了查询表所需的几个关键技术点:SQL语法、环境设置和工具使用。 用户可能是个刚开始接触SQL Server的开发人员或DBA,因为问题聚焦在基础操作上。ta应该已经成功创建了表,现在需要确认表是否存在及查看结构。考虑到SSMS的图形界面操作比命令行更友好,我会优先推荐图形化方法,同时补充SQL查询方案。 值得注意的是引用[3]特别强调了数据库上下文切换的重要性,这往往是新手容易忽略的关键步骤。因此回复中需要突出这个细节,比如用加粗提示。另外引用[5]展示的建表示例正好可以作为演示样本,直接引用能增加可信度。 关于实现路径,其实有三种主流方法: 1)最直观的是对象资源管理器,适合喜欢点击操作的用户 2)利用查询编辑器的系统视图查询,适合需要精确控制的场景 3)脚本生成功能则能同时看到表结构和关联对象 最后生成的相关问题要覆盖用户可能的后续需求,比如表不存在时的排查步骤,或者查看表数据的方法。毕竟按经验,用户确认表存在后,下一步往往就是查询数据内容了。 </think>在 SQL Server Management Studio (SSMS) 中查询使用代码(`CREATE TABLE`语句)创建的表,主要有以下三种常用方法: --- ### 📍 方法一:使用对象资源管理器 (图形界面) 1. **连接数据库**:在左侧“对象资源管理器”中连接到目标 SQL Server 实例。 2. **展开数据库**:定位到创建表的数据库(如 `TutorialDB`)> 展开“表”文件夹。 3. **查找表**:在表列表中查找目标表名(如 `StudentInfo`)。 > **关键点**:若看不到新建的表,右键点击“表”文件夹选择“刷新”[^3]。 --- ### 🔍 方法二:使用系统视图查询 (T-SQL) 在查询编辑器中执行查询语句: ```sql USE TutorialDB; -- 切换到目标数据库[^3] SELECT * FROM sys.tables WHERE name = 'StudentInfo'; -- 替换为你的表名 ``` * **结果**:返回表的详细信息(创建时间、对象ID等)。 #### 查看表结构(列/约束): ```sql USE TutorialDB; SELECT c.name AS '列名', t.name AS '数据类型', c.max_length AS '长度', c.is_nullable AS '允许空值' FROM sys.columns c JOIN sys.types t ON c.user_type_id = t.user_type_id WHERE c.object_id = OBJECT_ID('StudentInfo'); -- 替换表名 -- 查看主键/唯一约束(引用[5]示例) SELECT kc.name AS '约束名', c.name AS '列名' FROM sys.key_constraints kc JOIN sys.index_columns ic ON kc.parent_object_id = ic.object_id AND kc.unique_index_id = ic.index_id JOIN sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id WHERE kc.parent_object_id = OBJECT_ID('StudentInfo'); ``` --- ### 📜 方法三:生成表脚本 (查看完整定义) 1. 在“对象资源管理器”中右键点击目标表。 2. 选择 **“编表脚本为” > “CREATE 到” > “新查询编辑器窗口”**。 3. 在新窗口中查看完整的 `CREATE TABLE` 语句(含所有列、数据类型、约束)[^2][^5]。 --- ### ✨ 总结建议 | **场景** | **推荐方法** | |--------------------------|----------------------------------| | 快速确认表是否存在 | 对象资源管理器刷新列表 ✅ | | 获取表的元数据详情 | 查询 `sys.tables` + `sys.columns` | | 查看完整建表语句(含约束)| 生成表脚本功能 🔧 | > ⚠️ **注意**:操作前务必确认连接上下文(当前数据库)是否正确 [^3],否则可能找不到目标表。 --- ### 💡相关问题 1. 如何查看通过SQL代码创建的表中具体存储的数据? 2. 若在 `sys.tables` 中查不到新建的表,可能有哪些原因及解决方法? 3. 如何通过SSMS快速复制已存在表的结构(不包含数据)? 4. 在SSMS中如何修改通过代码创建的表的约束(如增加唯一键)? [^1]: SSMS核心功能概述 [^2]: `CREATE TABLE` 语法结构解析 [^3]: 切换数据库上下文的关键步骤 [^5]: 表约束(主键/唯一键)的代码实现示例
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值