您现在的位置是:首页 > 文章详情

其实,我更喜欢写SQL

日期:2024-11-14点击:102

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

其实,我更喜欢写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); // 使用默认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

原文链接:https://my.oschina.net/yuyenews/blog/16511909
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章