大家帮看看这种 Java 写 sql 的代码可取吗

2020-10-27 12:10:01 +08:00
 madworks

@Override public DataListPage getDataListPageByFirstClass(DataListParams dataListParams, String firstClass, String branchStoreId) {

    String mainStoreId = BusinessUtils.getMainStoreId(branchStoreId);

    String listHql = CONSTRUCTOR
            + " FROM TCmsLesson cl, TCmsLessonStoreRel r"
            + " WHERE cl.firstClass = :firstClass"
            + " AND cl.isValid = 1"
            + " AND cl.id = r.lessonId"
            + " AND r.storeId in (:mainStoreId , :branchStoreId , '0000000')";

    String countHql = "SELECT COUNT(cl.id) FROM"
            + " TCmsLesson cl, TCmsLessonStoreRel r"
            + " WHERE cl.firstClass = :firstClass"
            + " AND cl.isValid = 1"
            + " AND cl.id = r.lessonId"
            + " AND r.storeId in (:mainStoreId , :branchStoreId , '0000000')";

    dataListParams.setDateParam("cl.createDate");

    return super.getDataListPageByHql(listHql, countHql, dataListParams, firstClass, mainStoreId, branchStoreId);
}

private List<T> listDataByHql(String hql, DataListParams dataListParams, Object... values) {
	if (StringUtils.isNotEmpty(dataListParams.getBeginTime())
			&& StringUtils.isNotEmpty(dataListParams.getEndTime())) {
		hql = hql + " AND " + dataListParams.getDateParam() + " BETWEEN '" + dataListParams.getBeginTime()
				+ "' AND '" + dataListParams.getEndTime() + "'";
	} else if (StringUtils.isNotEmpty(dataListParams.getBeginTime())) {
		hql = hql + " AND " + dataListParams.getDateParam() + " >= '" + dataListParams.getBeginTime() + "'";
	} else if (StringUtils.isNotEmpty(dataListParams.getEndTime())) {
		hql = hql + " AND " + dataListParams.getDateParam() + " <= '" + dataListParams.getEndTime() + "'";
	}

	if (StringUtils.isNotEmpty(dataListParams.getOrderBy())) {
		hql = hql + " ORDER BY " + dataListParams.getOrderBy();
	}

	if (dataListParams.isDesc()) {
		hql = hql + " DESC";
	}

	if (dataListParams.getPage() != null) {
		return this.listByPage(hql, dataListParams.getPage(), values);
	} else {
		return dataListParams.getSize() == 0
				? this.listByParamsAndPosition(hql, dataListParams.getStartPosition(), values)
				: this.listBySizeAndPosition(hql, dataListParams.getSize(), dataListParams.getStartPosition(),
						values);
	}
}
3739 次点击
所在节点    Java
35 条回复
Kirsk
2020-10-27 12:15:54 +08:00
罗里八嗦 直接删掉 类型控制应该在逻辑层 dao 只负责执行
chendy
2020-10-27 12:18:28 +08:00
很有毅力
试试 Criteria ?
geligaoli
2020-10-27 12:46:24 +08:00
用字符串拼 sql 的,直接开
rodrick
2020-10-27 12:52:29 +08:00
虽然很久不搞 java 你要小项目简单 sql 这么搞搞就算了,正规项目这么搞不说别的,写起来不累么,看的都累
EscYezi
2020-10-27 12:52:58 +08:00
以后维护起来很蛋疼
wilsonWei
2020-10-27 13:26:49 +08:00
字符串拼接有注入风险吧,看起来也不清晰
THESDZ
2020-10-27 13:41:44 +08:00
如果一段代码让人看下去的欲望都没有,还是算了吧....
THESDZ
2020-10-27 13:42:15 +08:00
@THESDZ #7 特别复杂的业务除外(防杠)
Resource
2020-10-27 13:47:14 +08:00
不可取
zouzou0208
2020-10-27 13:47:38 +08:00
这样拼接并且不做保护的话很容易注入的。在 para 里加个 or 1=1 后面就可以加东西了。
madworks
2020-10-27 13:48:59 +08:00
@THESDZ 框架层面呢,我公司用的一个中台系统 orm 框架里就是 sql 拼接的,数据层次非常多
zouzou0208
2020-10-27 13:51:41 +08:00
@madworks 那样一般都有正则或者其他的保护的。
THESDZ
2020-10-27 13:53:09 +08:00
@madworks 框架层面的一般是基于反射或者代理等,每一个方法进行封装,查看主体逻辑的时候,配合注释(方法上的 javadoc)看起来并不会难受,而上面的代码,从列名到表名都是手敲的....
supuwoerc
2020-10-27 13:55:42 +08:00
作为前端路过,刚学完预编译 sql,这样拼接字符串是不是会出现 sql 注入的问题,而且看着好累啊 =。=||
madworks
2020-10-27 13:55:42 +08:00
@THESDZ 这种代码感觉 3,4 年前 hibernate 这样写的很普遍
THESDZ
2020-10-27 14:00:52 +08:00
@madworks 是指题目中的代码?hibernate 了解不多,但是据我了解它的目的是让程序员不写 sql,hibernate 应该不会这么写,最起码业务内容和转 sql 是分开考虑的,不会根据逻辑拼接 sql
fallinlovewith
2020-10-27 14:18:21 +08:00
见过用 String sql = " "+ " "+ "....";
也见过 StringBuilder sb = new StringBuilder();
sb.append("")
.append("")
......
fengpan567
2020-10-27 14:31:54 +08:00
这么拼接不怕 sql 注入?
buruliu
2020-10-27 14:36:26 +08:00
hql 。
doudou1523102
2020-10-27 14:47:06 +08:00
看的头痛

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/718981

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX