一、硬编码问题
From 维基百科:
硬编码(hard-coding)是指在软件实现上,将输出或输入的相关参数(例如:路径、输出的形式或格式)直接以常量的方式撰写在源代码中,而非在执行期间由外界指定的设置、资源、资料或格式做出适当回应。
在Java代码当中,对于User类,user_id属性对应的数据库表中的字段(列名)为user_id
。
public class User {
private Long userId;
}
使用QueryWrapper直接根据数据库表的列名进行查询的方式就属于硬编码。
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("user_id", 5);
List<User> users = userDao.selectList(wrapper);
上面这类硬编码代码有一个缺点,如果实际开发环境中,数据库表结构经常发生变动,与变动的列相关的代码都需要进行修改。
二、使用lambda解决硬编码问题
为了解决上述问题,可以使用lambda,有两种方案可供选择:
第一种:仍然使用QueryWrapper
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.lambda().eq(User::getUserId, 5);
List<User> users = userDao.selectList(wrapper);
第二种:使用LambdaQueryWrapper
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getUserId, 5);
List<User> users = userDao.selectList(wrapper);
在使用Lambda后,即使数据库表结构发生变化,只要User类中的属性名userId
不变,上述代码便不需要进行修改,大大降低了后期代码的维护成本。当然,前提是要建立好实体类与数据库表的映射关系。
三、关于QueryWrapper性能的一点讨论
使用QueryWrapper可以方便我们通过Java代码对数据库进行操作,避免编写过多的SQL语句。
考虑如下情况,仅需要在代码中获取所有的用户的userName
,不需要其他字段。如果用QueryWrapper,返回的对象包含所有的属性,只不过除userName
外其他字段均为null。
在这种情况下,应该是直接用SQL语句进行查询,效率高一点吧。(不太确定,大家有什么见解可以评论一下,这个后续有时间了,做个对比实验看看。)