TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
废话少说先上代码:
6 Y: k( f) a( b复制内容到剪贴板
3 p* v S! O$ e3 P) W& a; e a: ~代码:
' p1 |) V8 d& |5 K u0 v7 Uint iPage = 0;
# f O e) a/ T/ N int iPerPage = 20;1 j2 u0 [3 O0 ]1 H
String sName = "admin";
$ i% F6 g5 O; l) t- y+ i String sSql = "select user.c_name name, (select dept.c_name from db_aty_t_aty_dept dept where dept.c_id=user.c_dept) dept, user.c_gzdh gzdh from dt_aty.t_aty_user user where user.c_dept like "& g+ C+ ?: V; E6 l7 X
+ sName + " and n_valid = 1 and user.c_dept != -1 limit " + iPage + "," + iPerPage;
, V* f0 K8 o7 N c/ b大家写的代码是不是这个样子的呢?' |6 \ L. J( s9 @& D! b
我相信很多人会说,我的代码比这个写的好多了。0 @' h& S" D% ]; R
好的看下面的代码:1 t6 ^+ Q5 a( z
复制内容到剪贴板
2 |7 P- h) t' l! w: n( E代码:
# ? x0 V5 S- d/ H8 p) U" `: C9 L" Iint iPage = 0;3 x' J' P: U4 T$ a/ M
int iPerPage = 20;
3 u% f7 s# S) m1 E String sName = "admin";( |7 j- B& Q+ m
String sSql = "select "
! ?! A* B) R5 Q7 z# V* g! c + " user.c_name name, " 3 o4 L# c: A) v) i0 b& B8 ^7 i
+ " (select dept.c_name "
! S/ [3 M- T- [ ?* ] + " from db_aty_t_aty_dept dept "
/ t5 Q3 H) B8 a# v + " where " : A4 O$ O2 E0 j: @1 C( a" A" [
+ " dept.c_id=user.c_dept) dept,"
# Z( E4 j" v& Z, m7 q + " user.c_gzdh gzdh "
% x' A" ?- V" g& A2 X2 v + "from "
- W x( w3 O* v/ ?( B% x9 f$ {% Y + " dt_aty.t_aty_user user " 5 F' l2 S6 W$ a. ]4 S1 E; ]
+ "where " ) x5 z5 K- t- S* r" T: w
+ " user.c_dept like " + sName 3 S$ r) ?' S6 n+ V. ~% c
+ " and "
" C* @8 n- g& u. n + " n_valid = 1 " & g, W" K, P$ @% \
+ " and " ! k% |- f/ `6 f/ e- c% a9 g b
+ " user.c_dept != -1 "
/ l% s- D. Y2 Z0 q + "limit " + iPage + "," + iPerPage;
: S% S0 Z8 K. b. C5 [* H. G那么这个代码大家满意么?
: Y" l8 i, a1 n还是有人会说,还可以改进,那么好的。; i/ g: T. H( \+ V5 m8 q
继续看代码:) D5 @5 d/ N* @ y5 L9 w5 P
复制内容到剪贴板" m& l+ D* }* r0 o& Y/ E; R
代码:# b8 f h; h! e# V d8 k
int iPage = 0;7 f9 @/ {* g) |) J1 \4 ?% V# I! Y- z
int iPerPage = 20;, I( S; E: g# O" u$ _" w5 B; H
String sName = "admin";4 D# ?8 D* P( y0 h# I7 A/ j
String sSql = "select "
* |( D$ A& b1 e9 | ~7 s + " user.c_name name, " " y# b* m# R3 T6 d! X: c
+ " (select dept.c_name "# u; T, s+ k% Z" O
+ " from db_aty_t_aty_dept dept "7 J# T0 Z- g, t
+ " where " ! o2 y8 B8 B( h& [" ^* N7 ~% f/ A* W
+ " dept.c_id=user.c_dept) dept,"
2 s# x7 `/ K% ]# R + " user.c_gzdh gzdh "
3 a8 Y3 x2 w0 }# Y# w; M4 A8 x6 N + "from "
' v* {) t/ w X9 a- J1 k6 m0 B + " dt_aty.t_aty_user user " 2 }. `' o- Z+ q ~* S b
+ "where "
2 [& G7 [$ }8 ^; A$ f4 \ + " user.c_dept like ?"
- n ]. G0 E4 w5 S + " and " / p3 Q+ V* t1 a1 t5 K+ `4 `% r
+ " n_valid = 1 " % ~% F- i7 P: \8 W2 A( s
+ " and "
; T; o9 z8 s, R$ B8 U0 U + " user.c_dept != -1 "
) J4 t4 H/ p" M% ?& p4 u$ K + "limit ?,?"; j( W* ^$ B- m" R6 q) V
这个可以了吧!还是有人会说,我还可以改进,那么恭喜你。
2 g/ o7 l1 y p$ ?' |- L0 J看最后一段代码:+ j0 B5 p, \% f3 f' w
复制内容到剪贴板
+ C7 O6 ]. k+ t代码:
8 M; T: I' I. H8 T, Nint iPage = 0;. }/ j) y& `1 B6 b9 `
int iPerPage = 20;
0 o- ~, c* h7 g& } String sName = "admin";* h3 [2 w9 C& z. m- I0 R* f# W
StringBuilder sbSql = new StringBuilder();
9 \" E: x5 u& Q, E8 Z sbSql.append("select ");6 Q& x, `* c) t0 e6 V7 H7 T+ O
sbSql.append(" user.C_name name, ");% D& n6 {: g' R
sbSql.append(" (select ");
, k3 Q8 C3 d7 ?4 i8 Y2 p1 P sbSql.append(" dept.c_name ");) E$ q Z: m5 p/ @( k6 J
sbSql.append(" from ");
, K* j) a: W4 S' P$ N8 L sbSql.append(" db_aty.t_aty_dept dept ");+ [4 v3 [. ]( J6 Q
sbSql.append(" where ");
- b v4 ~9 s! {1 Q0 c5 k% ^ sbSql.append(" dept.c_id=user.c_dept) dept, ");, H6 x- r) i1 _
sbSql.append(" user.c_gzdh gzdh ");- f! W. c6 e/ W0 A- H
sbSql.append("from ");7 M9 ?0 P; q a* b! n' S
sbSql.append(" db_aty.t_aty_user user ");6 j' f) i) M s- ^7 x% l! [; }
sbSql.append("where ");
3 i6 ]1 [# {5 m) G ^ sbSql.append(" user.c_dept like ? ");
/ d7 L+ t* J- o T+ O sbSql.append(" and ");
: @5 Z6 ]4 b; U1 B2 @6 a7 Y sbSql.append(" n_valid = 1 ");; m6 D& Q8 u1 t6 X
sbSql.append(" and ");. N4 T+ p& w% b
sbSql.append(" user.c_dept != -1 ");* ?/ Y) l8 y( v. Z' h
sbSql.append("limit ?,?"); b5 ?% K* B- H8 X
看过这四段代码大家,可能会有疑问,这是为什么呢?
- \4 k7 p' n3 z. s+ |& q: C) ^* v我总结了几点:
. b6 Q' n9 T/ u/ Q# f! m8 x$ @1、大家可能注意到了变量的命名方式,可能大家平时写代码的时候注意不到这个,不过这也是个人的习惯问题的。其实按照自己的命名规则来写没有问题,问题在于我们在工作中写的代码不会只有自己看的。后期维护的人员也会看的,这样可以让维护人员直观的了解变量的数据类型。
+ s0 |3 {7 M0 F! F# J# J2 B4 o7 K v0 [3 ^: g4 A9 c- L- r
2、为什么不用字符拼接而是用通配符?很多的答案我相信都是一致的,没错就是防注入。但是可能很多意识不到还有一个问题就是数据库解析。数据库接受到程序传入的SQL语句的时候,如果是拼接的字符串数据库会自动进行解析工作,那么大量SQL涌入的时候,效率就可想而知了。- o: Q0 d3 H1 i- W: R4 i% t
+ \& v( X5 c0 q( {' M: l
3、为什么摒弃了最熟悉的String类型而是用StringBuilder类型。我们首先来看String类型定义的特殊性,如果用new的方式我就不用说了,大家用new的方式定义String类型的时候比较少,即使是那么定义了。大家一定会知道只要是new就一定会创建一个字符串。
7 B8 \: \) f) w5 F! e
3 f$ W# |5 s; T: O字符串拼接的过程,先搜索字符串池中字符串对象。如果存在就会把该字符串地址赋值给定义的字符串变量。如果不存在就会重新创建对象。在这种拼接的过程中创建很多对象,那么对性能要求比较高,而且效率很低下。
& ~9 ^" z" j( @8 r还有人可能问了,为什么不是StringBuffer,因为这里不需要线程安全,只要效率。所以选择StringBuilder就可以了。
/ C' ]9 `/ Z* p3 H H
( f! f, J$ ?; r, W; z; z4、最后一个可能是大家不太注意的问题就是,SQL的格式。一段良好的代码它的可读性是最珍贵的。说一个人有多牛,不是说这个人可以写出别人看不懂的代码,而是看有多少人可以读懂他的代码。所以SQL的格式也非常重要。1 H4 Q9 X; K; _; U$ G# @6 A
4 @- T4 H, |6 y! Z; N: s
( G+ \& N- E, m) t( Q0 H( ]8 H+ ]2 M看沙发吧!我不知道我写帖子里面带有什么词语了,就是不能通过。
* E$ y6 j: u* R# o- s% A! c# n& y2 K) l
这次就说这么多,我希望大家多多参与进来,不过看昨天大家回复的帖子。很多人愿意被动的接受知识,而不愿意去主动探索去寻找知识。这样的态度是不对的,希望这个帖子可以让更多参与进来,不是我一个人写,而是所有人写。写出自己对编程的思考,自己的想法,自己的技巧。9 p/ x6 I/ E: F# W, h
& ~* P, ~$ n" A5 a3 q( E, b4 z0 I
( ~: u6 E; g! S5 O5 O- E: f, @' g
|
-
总评分: 帮币 + 2
查看全部评分
|