TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
废话少说先上代码:
9 E* |* X6 D$ V复制内容到剪贴板9 ^. e2 ]1 J. Y x/ h
代码:
) N' W {1 ?: G) |int iPage = 0;, X5 T V. ?" a* j
int iPerPage = 20;) w! g" s8 |* g0 [8 l
String sName = "admin";& Y$ [( e5 `' \
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 ": V3 p( K5 B8 k# [4 a. J3 F! C
+ sName + " and n_valid = 1 and user.c_dept != -1 limit " + iPage + "," + iPerPage;5 U! z& P; E* Z4 _# ?- b' N* r; o
大家写的代码是不是这个样子的呢?$ d e& h$ A9 {& [) \0 S+ f
我相信很多人会说,我的代码比这个写的好多了。" [- N7 O! Q1 m) b; s
好的看下面的代码:$ T0 Z1 k5 I3 g! }1 `! m- G
复制内容到剪贴板
" c6 @% Y" Y4 m% F+ l; |代码:' G# s+ U4 T4 M: O7 S* Q
int iPage = 0;
! s: y% ?4 z9 B o int iPerPage = 20;6 a% ~, q% e9 T9 m: C
String sName = "admin";
' q- \* ~+ q& o# {0 _ String sSql = "select "
" B; T( d" a. D, }' E + " user.c_name name, " 3 i: T* w. f& o0 A4 @
+ " (select dept.c_name "
8 _$ \/ A9 U* o; }. \ + " from db_aty_t_aty_dept dept "0 j* ]8 X8 p! p# k& K
+ " where " - d% y+ }& [# Q# \0 w
+ " dept.c_id=user.c_dept) dept,"
; h9 u. i" O% T + " user.c_gzdh gzdh "
* v N9 \9 ]2 B# X0 x8 n- H9 \5 a + "from "
( @ x, E! }: g% \/ d+ z4 t + " dt_aty.t_aty_user user "
2 |2 P7 M" x$ c" M X' h + "where "
" @& ^$ w! J8 R4 ~+ s% J + " user.c_dept like " + sName - [6 e7 v, q# p( ^: K1 e
+ " and " $ O7 `! H* m* P% b, }; a$ M
+ " n_valid = 1 "
6 {8 z* ?; J$ e% x7 I + " and "
' O3 @4 e4 i K8 ~1 F2 W + " user.c_dept != -1 " , ^$ Z2 b2 o: s
+ "limit " + iPage + "," + iPerPage;
; [; X6 A M) h那么这个代码大家满意么?9 D7 H1 p4 |1 P6 `0 c$ ]0 j
还是有人会说,还可以改进,那么好的。! d. { h8 E* z1 L) ]
继续看代码:$ F4 P4 V$ E( r; l2 I9 J( ?; w( _
复制内容到剪贴板) C/ V; H: t& K& Z1 A
代码:
6 S3 C* X7 b+ G' V9 t- k7 Cint iPage = 0;0 ?0 ?' M# V( F, q- A2 f1 O
int iPerPage = 20;
' F6 N j- k1 [ v8 _ String sName = "admin";8 {" u' x$ b, d8 w
String sSql = "select " 8 C4 [4 Z) N7 E
+ " user.c_name name, "
* ]* M$ F" j- q4 l + " (select dept.c_name ") @- M7 y$ j. d
+ " from db_aty_t_aty_dept dept "
# S9 W6 s' U, E, f1 W + " where "
. ^. V2 r3 ^. a* S/ y, D + " dept.c_id=user.c_dept) dept," 0 e2 }' X8 l7 ~: M/ d9 ^
+ " user.c_gzdh gzdh "
9 y/ i% i2 R4 m- g H( f + "from "
" q' L2 ]# \9 ^+ {" ~- t + " dt_aty.t_aty_user user " 2 }8 G# E7 S" Z( W& T+ ]# r
+ "where "
+ g: G7 L# d. ]' p) z/ R& i2 h: c8 G) r + " user.c_dept like ?"
8 g& m6 P. A' E" s f( ~ + " and " % W* Q8 J+ d6 H
+ " n_valid = 1 " L5 q+ O" r1 u* V6 K
+ " and " _2 ~; T+ R4 Z8 z
+ " user.c_dept != -1 "
# `$ s# q. m( `% H9 n u* B + "limit ?,?";- `- C" }8 i, E. j9 j& s
这个可以了吧!还是有人会说,我还可以改进,那么恭喜你。
3 f" P( E$ l; f- ^看最后一段代码:
* n' y: ]" b# @* ^4 ~( A8 \5 C: X复制内容到剪贴板
, M$ M8 O* E' T* B; U代码:
' Z6 n' Q* N% B- _" H& b+ w5 V% pint iPage = 0;+ n. y; d5 k9 s, f! E% d7 |. T1 u
int iPerPage = 20;
9 h; }' b+ k/ G5 a8 I String sName = "admin";$ k) ]% E" [% a9 Z! T! i) d
StringBuilder sbSql = new StringBuilder();
( F/ m I6 v3 c/ G& s sbSql.append("select ");
2 {; ]2 _( ~9 u0 d+ R sbSql.append(" user.C_name name, ");
% R- |1 }, t, d6 q# Y sbSql.append(" (select ");
, _. q1 y5 U# B4 t+ \7 T& n+ l1 C1 A sbSql.append(" dept.c_name ");3 f Q, C% ?6 E3 x) \$ v- b& A9 u0 q1 h: P
sbSql.append(" from ");9 C2 p+ w0 o/ x. K+ e, H: J
sbSql.append(" db_aty.t_aty_dept dept ");
8 {- K+ ~4 Y- |4 J, F sbSql.append(" where ");
' u* x1 l& }: o sbSql.append(" dept.c_id=user.c_dept) dept, ");
* R4 X' I2 F: R7 V q8 ^. B' n1 z sbSql.append(" user.c_gzdh gzdh ");7 f( a9 ?: g* O, Y! r
sbSql.append("from ");
4 p( u2 O. a6 ]1 S sbSql.append(" db_aty.t_aty_user user ");
" W( K4 X$ d3 ?0 z( W! \# x/ t sbSql.append("where ");
5 Q) i8 s7 W, m7 O' L' E) z sbSql.append(" user.c_dept like ? ");( E% S* \+ i3 N) M3 ?4 l
sbSql.append(" and ");" g8 `) y7 A, \) D/ R
sbSql.append(" n_valid = 1 ");
# f2 i+ G( e" c# N sbSql.append(" and ");3 s& j0 K8 S0 x/ W
sbSql.append(" user.c_dept != -1 ");0 A4 M# B+ x4 z4 y) [
sbSql.append("limit ?,?");( n/ Y0 ^8 [5 f# O8 [" ]
看过这四段代码大家,可能会有疑问,这是为什么呢?. {% ~, X7 y1 f) a& s# @. ~
我总结了几点:
+ c) W0 H4 d4 j" B: r0 a7 v+ B4 Y1、大家可能注意到了变量的命名方式,可能大家平时写代码的时候注意不到这个,不过这也是个人的习惯问题的。其实按照自己的命名规则来写没有问题,问题在于我们在工作中写的代码不会只有自己看的。后期维护的人员也会看的,这样可以让维护人员直观的了解变量的数据类型。8 `, u9 U; b1 e( O: P0 E( o
$ D0 N" u- e8 h- X
2、为什么不用字符拼接而是用通配符?很多的答案我相信都是一致的,没错就是防注入。但是可能很多意识不到还有一个问题就是数据库解析。数据库接受到程序传入的SQL语句的时候,如果是拼接的字符串数据库会自动进行解析工作,那么大量SQL涌入的时候,效率就可想而知了。( w* y9 s- o" W ?. g/ V
: b V+ ^9 u1 S) E! ~: u$ W
3、为什么摒弃了最熟悉的String类型而是用StringBuilder类型。我们首先来看String类型定义的特殊性,如果用new的方式我就不用说了,大家用new的方式定义String类型的时候比较少,即使是那么定义了。大家一定会知道只要是new就一定会创建一个字符串。
R. |0 w. B7 |
& Q! i' [4 g5 H1 s( ^( m- ~+ k字符串拼接的过程,先搜索字符串池中字符串对象。如果存在就会把该字符串地址赋值给定义的字符串变量。如果不存在就会重新创建对象。在这种拼接的过程中创建很多对象,那么对性能要求比较高,而且效率很低下。6 x. {& c+ H7 P1 U& m
还有人可能问了,为什么不是StringBuffer,因为这里不需要线程安全,只要效率。所以选择StringBuilder就可以了。* D$ E1 b0 u9 ^
. E8 h2 f9 C& C0 ~! B2 V" k
4、最后一个可能是大家不太注意的问题就是,SQL的格式。一段良好的代码它的可读性是最珍贵的。说一个人有多牛,不是说这个人可以写出别人看不懂的代码,而是看有多少人可以读懂他的代码。所以SQL的格式也非常重要。: D P# I. j- T/ P9 y
3 z8 E0 y2 x& B5 b0 z/ u- i/ f# R* ` o1 i3 v$ ?
看沙发吧!我不知道我写帖子里面带有什么词语了,就是不能通过。
. y) p4 [& I" n$ f* B' A# z* W
. `/ ?8 i- t1 |2 F, e) w. x0 t, i这次就说这么多,我希望大家多多参与进来,不过看昨天大家回复的帖子。很多人愿意被动的接受知识,而不愿意去主动探索去寻找知识。这样的态度是不对的,希望这个帖子可以让更多参与进来,不是我一个人写,而是所有人写。写出自己对编程的思考,自己的想法,自己的技巧。
- l3 J/ ?5 @; c% I, V/ ]) \; a: b; v! p" n& [9 U0 I$ r0 g' u1 a
0 f3 u2 \1 p% {( `) L
|
-
总评分: 帮币 + 2
查看全部评分
|