我的日常

登录/注册
您现在的位置:论坛 盖世程序员(我猜到了开头 却没有猜到结局) 盖世程序员 > 代码中的感悟
总共48087条微博

动态微博

查看: 1952|回复: 4

代码中的感悟

[复制链接]
admin    

1244

主题

544

听众

1万

金钱

管理员

  • TA的每日心情

    2021-2-2 11:21
  • 签到天数: 36 天

    [LV.5]常住居民I

    管理员

    跳转到指定楼层
    楼主
    发表于 2014-04-07 17:31:53 |只看该作者 |倒序浏览
    废话少说先上代码:
    ' b. O5 S9 c* |2 A2 V- }' n) \复制内容到剪贴板/ d1 N) D/ @- W; [  L
    代码:: p; A5 w2 r1 _/ f( i3 k5 m  f7 k
    int iPage = 0;2 O6 s! t: O6 e" |5 t$ C8 n  w
            int iPerPage = 20;
    ; J9 _& j5 m" m; `        String sName = "admin";/ a3 ?0 U* ?0 V, k& r
            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 "6 H/ ]+ u0 _, B  b5 M# w: s! |9 ?
                    + sName + " and n_valid = 1 and user.c_dept != -1 limit " + iPage + "," + iPerPage;* J' o- ]7 j2 y" F; j  B
    大家写的代码是不是这个样子的呢?& }' Y2 z5 l; t9 w1 g! Z2 `. l
    我相信很多人会说,我的代码比这个写的好多了。
    ' O+ H1 ]: ~! S! ]好的看下面的代码:% R- `: A+ J( E1 j8 P; O2 L
    复制内容到剪贴板
    " T( l1 l$ ]$ ?! C& N$ N8 y: K: j代码:
    & `8 q# K# a8 v% S1 zint iPage = 0;" H  L7 D% \. ?. c* @9 k
            int iPerPage = 20;
    8 _$ P2 ?) w2 @& H! y0 x0 B        String sName = "admin";
    & g: i* o  N" `5 o9 {$ ]        String sSql =  "select " 5 P: V6 s# h4 S+ ^7 w- r
                        + "     user.c_name name, " ! e7 G0 h) M) q: M
                        + "     (select dept.c_name "8 v6 m& L& K6 d( \9 v
                        + "          from db_aty_t_aty_dept dept "3 N* a; m* U# J* R. |
                        + "     where " - F$ a" |. q& X4 C) b: w! q
                        + "         dept.c_id=user.c_dept) dept,"
    * f" o9 _* n) c! Y/ {                    + "     user.c_gzdh gzdh "# G7 T8 i( C+ S4 Y% W; q7 M9 F
                        + "from "
    3 T: y& }0 U% S: Z& Y* g2 i                    + "     dt_aty.t_aty_user user "
    : h! F6 ^% m. g, V' z                    + "where "
    ( `5 r- a3 ]! e4 f0 B  s& J4 K                    + "     user.c_dept like " + sName
    7 G5 ^) P7 ]0 s1 ?                    + "     and "
    5 H8 E0 ]/ P6 N                    + "     n_valid = 1 " 6 r: E" u; _; n2 A9 p. S4 p8 }
                        + "     and "
    " w8 o- c( C, U: w# N' G                    + "     user.c_dept != -1 "
    ' b! X' S8 C9 e- B( x9 Q5 g                    + "limit " + iPage + "," + iPerPage;, j5 O4 A2 b8 m
    那么这个代码大家满意么?6 W) l) B' P1 |! r
    还是有人会说,还可以改进,那么好的。
    ( R' T* H5 ^7 E8 v/ t+ S4 T继续看代码:% Z. m% q6 a' ^  Z2 ]3 Q
    复制内容到剪贴板  O5 }! y2 S4 R! L/ B* \4 _: |
    代码:
    1 D1 s0 _7 `/ v; aint iPage = 0;
    5 j$ {/ g! M/ ]: X4 @& X        int iPerPage = 20;
    + k6 Y+ V4 X: A        String sName = "admin";9 B& f# M( A: ?7 ^
            String sSql =  "select "
    . }" A3 X( u2 q7 `0 G$ G$ H                    + "     user.c_name name, "
    ) N; Q& x( f6 t# D                    + "     (select dept.c_name "
    0 [% N% P. i3 [& P4 K  m                    + "          from db_aty_t_aty_dept dept "
    0 D; t& {& ?7 D& z3 _, ~                    + "     where " 2 b8 X: H8 f& I- I2 P& ~7 p) ?
                        + "         dept.c_id=user.c_dept) dept,"
    $ u# a. \% C$ g: n) [" M; \0 p                    + "     user.c_gzdh gzdh "
    4 }$ P$ \' h( W- V1 u" @& T                    + "from "
    3 o3 D: E% {; O; s/ O* j* B( i                    + "     dt_aty.t_aty_user user " : b8 N8 q3 K) \$ b) x3 l
                        + "where " - e1 U9 a# n) c7 e1 ~% ^$ Y
                        + "     user.c_dept like ?"
    - g' r2 B" T$ o7 W9 e                    + "     and "
    ( @6 E# p) J) p0 t; g& j* g- C; x                    + "     n_valid = 1 "
    8 w+ T9 [9 C+ @                    + "     and "
    ' f: x  u2 S- V% N" U                    + "     user.c_dept != -1 "
    : y( A" N. _! Z6 Y                    + "limit ?,?";
      D3 ~# K  i9 v% |7 t' q这个可以了吧!还是有人会说,我还可以改进,那么恭喜你。
    3 v- T. c# _- ?看最后一段代码:( w! }4 d  ~! c) m
    复制内容到剪贴板
    ' ~7 z4 \: k" {$ l4 w4 \1 N代码:
    7 [& D9 ~- s$ N( e/ ]& A. j" fint iPage = 0;( R* L( f' y$ ?' q  e- M: |! l$ g
            int iPerPage = 20;
    8 Q  V/ k# T* P6 _- ~0 i        String sName = "admin";( Z( ^4 x/ v7 j: M9 O0 G
            StringBuilder sbSql = new StringBuilder();, A6 Z, B& v# w' g0 Z3 N4 l0 Q
            sbSql.append("select ");& v& W$ i. u+ J# S/ ^& z. {
            sbSql.append("  user.C_name name, ");
    , E& x4 r+ a+ p  d( C4 |        sbSql.append("  (select ");1 a# U7 O4 a0 n9 J8 l: Y. k; e4 c
            sbSql.append("      dept.c_name ");+ k. s) H8 i" \$ a( ~0 C+ q
            sbSql.append("   from ");2 I$ P  k4 ?( ~- r: P$ p8 E+ W
            sbSql.append("      db_aty.t_aty_dept dept ");" h) B- z$ ]) m. |
            sbSql.append("   where ");
    - y4 q: p% o5 _) \$ Z' Q: ~        sbSql.append("      dept.c_id=user.c_dept) dept, ");
    5 w" V) ]/ R; W2 t# ~# ^4 v% F        sbSql.append("  user.c_gzdh gzdh ");
    : N: a8 X+ s2 E6 f' W        sbSql.append("from ");9 A) f! q8 f  L! S& Q2 `
            sbSql.append("  db_aty.t_aty_user user ");
    3 p: W5 E$ w1 D8 ^! V/ c& [" }        sbSql.append("where ");1 q& R6 n- y9 _/ q7 |
            sbSql.append("  user.c_dept like ? ");
    & S2 n6 x9 M0 B5 }+ t" Z        sbSql.append("  and ");, m* B7 l" W, d7 |! x) Q0 q
            sbSql.append("  n_valid = 1 ");
    ! G, S  `( w0 T( c        sbSql.append("  and ");4 @1 H, O- B# U7 I4 t: t% Z
            sbSql.append("  user.c_dept != -1 ");. u5 W8 t, |" h7 G3 X" n
            sbSql.append("limit ?,?");3 T6 ]. w- Q6 m  {7 p) w6 k8 ~
    看过这四段代码大家,可能会有疑问,这是为什么呢?' @3 @; P  i& ~% @8 u0 }6 ~
    我总结了几点:" Y. r4 K  e6 ^1 M
    1、大家可能注意到了变量的命名方式,可能大家平时写代码的时候注意不到这个,不过这也是个人的习惯问题的。其实按照自己的命名规则来写没有问题,问题在于我们在工作中写的代码不会只有自己看的。后期维护的人员也会看的,这样可以让维护人员直观的了解变量的数据类型。
    ; @8 m! `4 ~' Q$ f3 J7 a3 i! z3 L8 d
    2、为什么不用字符拼接而是用通配符?很多的答案我相信都是一致的,没错就是防注入。但是可能很多意识不到还有一个问题就是数据库解析。数据库接受到程序传入的SQL语句的时候,如果是拼接的字符串数据库会自动进行解析工作,那么大量SQL涌入的时候,效率就可想而知了。' ?, e5 z- Q9 L# k; D" b2 w
    # j/ W0 {5 F7 u
    3、为什么摒弃了最熟悉的String类型而是用StringBuilder类型。我们首先来看String类型定义的特殊性,如果用new的方式我就不用说了,大家用new的方式定义String类型的时候比较少,即使是那么定义了。大家一定会知道只要是new就一定会创建一个字符串。$ M) R# E( r3 F
    8 d" H8 Y6 X3 \' H/ o; D& \
    字符串拼接的过程,先搜索字符串池中字符串对象。如果存在就会把该字符串地址赋值给定义的字符串变量。如果不存在就会重新创建对象。在这种拼接的过程中创建很多对象,那么对性能要求比较高,而且效率很低下。
    " Q7 m8 x3 J7 ]$ }1 ^还有人可能问了,为什么不是StringBuffer,因为这里不需要线程安全,只要效率。所以选择StringBuilder就可以了。6 a* V7 V( H$ f  Y' I

    ! s, q. c( f5 Q& E$ _# ]4、最后一个可能是大家不太注意的问题就是,SQL的格式。一段良好的代码它的可读性是最珍贵的。说一个人有多牛,不是说这个人可以写出别人看不懂的代码,而是看有多少人可以读懂他的代码。所以SQL的格式也非常重要。
    # p3 M8 f" ~/ c  w; \4 k& F! f
    , f/ \0 r. T- Z, ~
    ) Z# b  _4 o! F, [( W' z* }; c看沙发吧!我不知道我写帖子里面带有什么词语了,就是不能通过。# H1 r9 U/ W/ k/ t" B, v2 Y+ h

    $ N2 z% |. P9 K$ n/ o( m这次就说这么多,我希望大家多多参与进来,不过看昨天大家回复的帖子。很多人愿意被动的接受知识,而不愿意去主动探索去寻找知识。这样的态度是不对的,希望这个帖子可以让更多参与进来,不是我一个人写,而是所有人写。写出自己对编程的思考,自己的想法,自己的技巧。
    5 f3 @4 z8 N" s- L5 K: v
    8 l0 L9 ?# p' m9 j
    ' n) M  E" j4 |: \7 H% w2 a

    科帮网 1、本主题所有言论和图片纯属会员个人意见,与本社区立场无关
    2、本站所有主题由该帖子作者发表,该帖子作者与科帮网享有帖子相关版权
    3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和科帮网的同意
    4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
    5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
    6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
    7、科帮网管理员和版主有权不事先通知发贴者而删除本文


    JAVA爱好者①群:JAVA爱好者① JAVA爱好者②群:JAVA爱好者② JAVA爱好者③ : JAVA爱好者③

    已有 1 人评分帮币 收起 理由
    xiaomi用户 + 2 很给力!

    总评分:  帮币 + 2         查看全部评分

    8

    主题

    2

    听众

    657

    金钱

    四袋长老

    该用户从未签到

    沙发
    发表于 2014-11-21 11:15:59 |只看该作者
    这样写的话  会不会有SQL注入呢
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

    2021-2-2 11:21
  • 签到天数: 36 天

    [LV.5]常住居民I

    管理员

    板凳
    发表于 2014-11-21 11:45:43 |只看该作者
    blue的神秘世界 发表于 2014-11-21 03:15
    * ~% d9 F; P" {' q; ^% {这样写的话  会不会有SQL注入呢

    1 Z7 b7 {4 t! C2 [8 T/ \# n0 e* v! B+ D最后的代码 使用 ?号  不会出现 sql注入问题
    回复

    使用道具 举报

    4

    主题

    0

    听众

    240

    金钱

    三袋弟子

    该用户从未签到

    地板
    发表于 2015-03-21 11:48:50 |只看该作者
    7 }, |! r; d, Q. R; M4 p& H; _

      A8 S; J. s! G经典 超好   就是这个样的
    已有 1 人评分帮币 收起 理由
    admin + 5 神马都是浮云

    总评分:  帮币 + 5         查看全部评分

    回复

    使用道具 举报

    3

    主题

    0

    听众

    110

    金钱

    三袋弟子

    该用户从未签到

    5#
    发表于 2015-03-23 13:58:49 |只看该作者
    其实每个人,都有每个人的写法
    已有 1 人评分帮币 收起 理由
    admin + 5 神马都是浮云

    总评分:  帮币 + 5         查看全部评分

    回复

    使用道具 举报

    快速回复
    您需要登录后才可以回帖 登录 | 立即注册

       

    关闭

    站长推荐上一条 /1 下一条

    发布主题 快速回复 返回列表 联系我们 官方QQ群 科帮网手机客户端
    快速回复 返回顶部 返回列表