废话少说先上代码: : T' v3 _8 U" H/ U复制内容到剪贴板6 i0 m0 r" T' u# m; S; d5 q; H+ C
代码:4 q( Y: F. `+ J$ p( C; F w
int iPage = 0; & k: p: q: @ j) c: V% H int iPerPage = 20; + {. E* \ E3 J& c2 ]7 y6 Q' A String sName = "admin"; 4 S0 B1 n' K: X6 X 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 "1 t# T) `1 g6 t7 w4 B; W
+ sName + " and n_valid = 1 and user.c_dept != -1 limit " + iPage + "," + iPerPage; [- Z; S2 T& Z' N5 O大家写的代码是不是这个样子的呢? + L+ K k3 {0 Z% G3 O) h) P8 X我相信很多人会说,我的代码比这个写的好多了。0 n* H6 F+ S2 {7 { n4 _
好的看下面的代码:7 Z" i: g( A0 \
复制内容到剪贴板 G1 |$ H1 m k& n$ h: `
代码:% v1 r0 b, V9 ]' Q2 O
int iPage = 0;0 w3 q! }& G$ A8 y/ {, a8 {2 l
int iPerPage = 20;9 |8 X1 O( J6 S/ T( I& I
String sName = "admin"; 2 @4 J5 {% T- j0 u# H' h String sSql = "select " ' v' ]) I, m4 s9 L
+ " user.c_name name, " ; M& {- c) m* ~2 U" y. m
+ " (select dept.c_name " 4 l, C5 |. `2 ?* E( w + " from db_aty_t_aty_dept dept " . _$ ]9 C1 f% _, A; k1 J + " where " ; K1 N+ x5 o" {/ P" z& f + " dept.c_id=user.c_dept) dept," ' F5 p- Z1 P/ \' I/ w& `/ n + " user.c_gzdh gzdh " + a5 E5 x, Q) o1 T o4 }' q + "from " 9 u+ V& U, m- U5 h' D' n3 a
+ " dt_aty.t_aty_user user " 5 f2 s5 K, ]& y( X A
+ "where " L# y! g9 h+ |( O" E9 Q
+ " user.c_dept like " + sName 0 M, o' c6 Y# k6 M0 X$ l7 k + " and " Z( ~* G4 B8 Z, m. P8 X + " n_valid = 1 " ) \: h. K- H% K; b' A! b2 F
+ " and " $ a# d& a u5 b# \ + " user.c_dept != -1 " ' h6 u+ @8 T8 Z$ R2 @5 [4 G& {
+ "limit " + iPage + "," + iPerPage;' k" R2 `; \- m Y% s% y. a- Z
那么这个代码大家满意么? " G1 p: u k3 \# e* w) b还是有人会说,还可以改进,那么好的。6 W2 F) y+ v! y1 n
继续看代码: 0 d- y0 G. c5 w复制内容到剪贴板2 A) S' e6 u! v
代码:! Z% t& d5 d! t3 i# ?8 v2 B
int iPage = 0; ) z6 k) ?4 f2 _8 Q. \ int iPerPage = 20; $ {) N- k0 c5 `' P" M+ z0 J$ T! s String sName = "admin"; , ?) b6 l! }; m- L* i- M5 ] String sSql = "select " " F% b I5 ~/ r" I* d$ x + " user.c_name name, " 1 I2 ~1 u& R+ H" A# B
+ " (select dept.c_name "' ~0 j/ X9 a0 l, a. @; \) W" V
+ " from db_aty_t_aty_dept dept " ( D+ B; I5 j* G4 T: t+ ? + " where " % K9 \4 h7 A$ B A + " dept.c_id=user.c_dept) dept," . d; a" G$ d% L" m
+ " user.c_gzdh gzdh " 1 x: T5 J& }0 w/ o8 [ + "from " 4 h# {- A& N$ ]7 Y8 j9 ]. q + " dt_aty.t_aty_user user " : i: v6 Y O2 \% b9 h+ z + "where " : x/ X, h4 Q- H + " user.c_dept like ?" 9 ^ {+ [# a& L9 y; }- K9 B
+ " and " * F; L# {2 \+ `. _ G2 ~0 ^ + " n_valid = 1 " ! L, P* y! N5 Z& r$ _) ~ + " and " 9 F2 e8 `6 Y: `8 N& W4 V; _2 M9 L
+ " user.c_dept != -1 " : u& z' |3 V" d9 ?2 g + "limit ?,?"; % L1 V7 X! N6 f+ F/ p! ^9 F这个可以了吧!还是有人会说,我还可以改进,那么恭喜你。$ x# z Q. _: U% E6 Q
看最后一段代码:) E" B& i2 B0 }, g2 a7 m/ K
复制内容到剪贴板 1 L; e) B( I) F代码: # {" n+ f2 n$ o# eint iPage = 0; * k4 n! K$ x: t: a; O9 U! a int iPerPage = 20;3 U4 k ?6 O0 V+ ~4 ? J
String sName = "admin"; ' |% R: K) E4 X* n/ O, a3 o0 H' r StringBuilder sbSql = new StringBuilder();6 T+ M; v7 g( q6 a
sbSql.append("select ");/ C1 B5 L* B1 a7 Q( P
sbSql.append(" user.C_name name, ");4 m% N+ @# t5 B+ k4 H0 c
sbSql.append(" (select "); 5 S* f% A4 p4 m% S* |0 ^3 p/ B sbSql.append(" dept.c_name ");+ Q+ _8 L0 r1 ?0 F; e
sbSql.append(" from ");8 K* |# U$ [2 h' T
sbSql.append(" db_aty.t_aty_dept dept "); & p( h$ w$ f, H M* I% Q( J$ _ sbSql.append(" where ");' y$ }1 L* D5 Z$ P. C
sbSql.append(" dept.c_id=user.c_dept) dept, "); & B3 {+ Y2 m2 Z6 ]% h sbSql.append(" user.c_gzdh gzdh ");) A* X) ^9 C% ^7 n
sbSql.append("from "); ( J" e. w7 d9 l0 g! z0 T+ b sbSql.append(" db_aty.t_aty_user user ");, O! a* I4 @6 c* D& [+ K
sbSql.append("where ");0 M n' p9 `, T1 B
sbSql.append(" user.c_dept like ? "); # z6 K6 J: T9 @7 @ sbSql.append(" and ");/ I2 E# d0 a, N
sbSql.append(" n_valid = 1 "); n5 y. t! a: w/ r1 m/ u& y sbSql.append(" and "); 1 J6 n: x+ K) W8 E% D sbSql.append(" user.c_dept != -1 ");% l U! W1 S0 ~
sbSql.append("limit ?,?"); ' D! h" L- Z# o$ V1 E: |看过这四段代码大家,可能会有疑问,这是为什么呢? . f. ]( o7 P! k2 [* F4 W我总结了几点:7 L6 E" p7 s- J) N8 U) g% |
1、大家可能注意到了变量的命名方式,可能大家平时写代码的时候注意不到这个,不过这也是个人的习惯问题的。其实按照自己的命名规则来写没有问题,问题在于我们在工作中写的代码不会只有自己看的。后期维护的人员也会看的,这样可以让维护人员直观的了解变量的数据类型。8 u$ d( r! A9 V
) c$ r' Q0 g* B* r/ ~3 T6 }
2、为什么不用字符拼接而是用通配符?很多的答案我相信都是一致的,没错就是防注入。但是可能很多意识不到还有一个问题就是数据库解析。数据库接受到程序传入的SQL语句的时候,如果是拼接的字符串数据库会自动进行解析工作,那么大量SQL涌入的时候,效率就可想而知了。 / |7 v9 Q% ?; F+ e6 |+ N2 ` ) B8 G' j8 T5 t# t6 d3、为什么摒弃了最熟悉的String类型而是用StringBuilder类型。我们首先来看String类型定义的特殊性,如果用new的方式我就不用说了,大家用new的方式定义String类型的时候比较少,即使是那么定义了。大家一定会知道只要是new就一定会创建一个字符串。: v( h/ I% }% P7 d' o
- J$ o# J3 `# V* ~
字符串拼接的过程,先搜索字符串池中字符串对象。如果存在就会把该字符串地址赋值给定义的字符串变量。如果不存在就会重新创建对象。在这种拼接的过程中创建很多对象,那么对性能要求比较高,而且效率很低下。( C: L5 I/ [+ B# V' A, t
还有人可能问了,为什么不是StringBuffer,因为这里不需要线程安全,只要效率。所以选择StringBuilder就可以了。$ C: W& e. f9 O ~5 X* ~7 C
' I" T, ^, P6 i8 [; h' k$ I6 D; k
4、最后一个可能是大家不太注意的问题就是,SQL的格式。一段良好的代码它的可读性是最珍贵的。说一个人有多牛,不是说这个人可以写出别人看不懂的代码,而是看有多少人可以读懂他的代码。所以SQL的格式也非常重要。 9 T3 U' G" ^2 {1 \2 a [0 I. d- i- @ [$ a4 m0 R9 c* i1 n) `1 ]1 |
看沙发吧!我不知道我写帖子里面带有什么词语了,就是不能通过。3 i7 J% c$ t. H3 c- ?5 D
1 c* L. x. M) c+ I这次就说这么多,我希望大家多多参与进来,不过看昨天大家回复的帖子。很多人愿意被动的接受知识,而不愿意去主动探索去寻找知识。这样的态度是不对的,希望这个帖子可以让更多参与进来,不是我一个人写,而是所有人写。写出自己对编程的思考,自己的想法,自己的技巧。6 Q" D% \& B# H% I( s3 Y