Java动态拼接SQL--01


    2、SQL语句的拼接

     

[csharp]  view plain  copy
  1. private void button1_Click(object sender, EventArgs e)  
  2.        {  
  3.            //先写一个基础的查询语句,即无论是否有条件,都执行这段代码。  
  4.            string sql = "select * from T_User";  
  5.            //定义一个list<string>类型的集合,用来放拼接的SQL语句  
  6.            List<string> list = new List<string>();  
  7.            //根据用户输入的情况来拼接后面的SQL语句。  
  8.            if (!string .IsNullOrEmpty(txtID.Text.Trim()))  
  9.            {  
  10.                string sqla = "Chr_UserID='" + txtID.Text.Trim() +"'";  
  11.                list.Add(sqla);  
  12.            }  
  13.            if (!string .IsNullOrEmpty(txtName.Text .Trim ()))  
  14.            {  
  15.                string sqlb = "Chr_Name='" + txtName.Text.Trim() + "'";  
  16.                list.Add(sqlb);  
  17.            }  
  18.            if (!string.IsNullOrEmpty(txtClass.Text.Trim()))  
  19.            {  
  20.                string sqlb = "Chr_Class='" + txtClass.Text.Trim() + "'";  
  21.                list.Add(sqlb);  
  22.            }  
  23.            //判断如果list中有值,即用户输入了某些条件,就开始进行SQL语句的拼接。  
  24.            if (list .Count >0)  
  25.            {  
  26.                //这个是用了string.join方法,用and作为连接符传来起list中的各个SQL语句  
  27.                sql += " where " + string.Join(" and ", list.ToArray());  
  28.            }  
  29.   
  30.            string constr = "server=.;database=Charge;uid=sa;pwd=1;";  
  31.            SqlConnection con = new SqlConnection(constr);           
  32.            con.Open();              
  33.            SqlCommand sqlcmd = new SqlCommand(sql,con);                      
  34.            SqlDataReader dr = sqlcmd.ExecuteReader();  
  35.            DataTable dt = new DataTable();  
  36.            //之后用datatable来接收读取到的数据。  
  37.            dt.Load(dr);  
  38.            //赋值给控件。  
  39.            dataGridView1.DataSource = dt;  
  40.            //最后记得关闭  
  41.            con.Close();                            
  42.        }  





关于java多条件查询SQL语句拼接的小技巧

最近在实验室做项目的时候遇到了java的多条件查询,翻看了论坛上其他大牛们的博客,都没有给出一个详细的解答。自我探索了一会后给出了下面这样的使用技巧,还算方便,仅供各位参考。

前端的页面显示


页面上方是查询所给字段名,下方是测试的查询数据

查询所给的表单代码
<form action="" >
    <table>
    <tr>
    <td><span>PMNM(内码)</span></td>
    <td><span><input name="PMNM" type="text"></span></td>
    <td><span>PMBM(编码)</span></td>
    <td><span><input name="PMBM" type="text"></span></td>
    <td><span>PMCS(名称)</span></td>
    <td><span><input name="PMCS" type="text"></span></td>
    <td><span>LBQF(类型)</span></td>
    <td><span><input name="LBQF" type="text"></span></td>
    <td><span><input name="codeSubmit" class="search-btn" 

type="submit" value="查询"></span></td>
    </tr>
    </table>
</form>
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
在后台servlet中获取表单的name
HashMap<String, Object> key=new HashMap<String, Object>();//在不知道属性类型的情况下,用HashMap<String,Object>来代替从上述表单中所获取的name值,并统一存放在HashMap中
            String PMNM=request.getParameter("PMNM");
            key.put("内码", PMNM);
            String PMCS=request.getParameter("PMCS");
            key.put("名称", PMCS);
            String PMBM=request.getParameter("PMBM");
            key.put("编码", PMBM);
            String LBQF=request.getParameter("LBQF");
            key.put("类型",LBQF);

    //调用Service层的serach方法进行查询
            ArrayList<Commmon9831> a=h.Search(key);//用ArrayList来表示所查询的结果
            request.setAttribute("a", a);
            request.getRequestDispatcher("所要跳转的显示查询结果页面").forward(request, response);

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

好了,上述的操作完成以后,就可以写DAO层中查询方法了,也是最重要的部分

public ArrayList<“bean的类型”> Search(HashMap<String ,Object> key )
    {   ArrayList<Commmon9831> a=new ArrayList<Commmon9831>();
       String sql="select * from “数据库名” ";//最原始的sql查询语句
       //依次用Object类来表示HashMap中的属性值
       Object m=key.get("内码");
       Object s=key.get("名称");
       Object P=key.get("编码");
       Object L=key.get("类型");

       int count=0;//引入一个count值来控制where条件后的属性值,及在sql语句中的位置
    //注意:**完成上述操作后,并没有判断Object对象是否为空值,下面判断是否为空的方法也很重要**
    if(!(m.toString().equals(""))||!(s.toString().equals(""))||!(P.toString().equals(""))||!(L.toString().equals("")))
       {       sql=sql+" where";
       //如果上述所给条件有一个不为空,则在sql语句中加上“where”。

        if(m.toString().equals(""))
           sql=sql+"";
       else{
       //用多个if来表示查询的情况,这里是本文的重点。
       //因为不清楚所给的条件是哪一个,设置count值为0,当在HashMap值前的查询条件不为空,则count++。当count>0时,说明当前查询条件不为一,则sql=sql+“and”。
       if(count>0)
            sql=sql+" and ";

            sql=sql+" PMNM = '" +key.get("内码")+ "'";

             if(s.toString().equals(""))
           sql=sql+"";   //sql关键字指尖要存在空格,不然无法执行
       else {if(count>0)
            sql=sql+" and ";

            sql=sql+" PMCS = '" +key.get("名称")+ "'";
            count++;
        }
       if(P.toString().equals(""))
           sql=sql+"";
       else {if(count>0)
            sql=sql+" and ";

            sql=sql+" PMBM = '" +key.get("编码")+ "'";
            count++;
        }
       if(L.toString().equals(""))
           sql=sql+"";
       else {if(count>0)
            sql=sql+" and ";

            sql=sql+" LBQF = '" +key.get("类型")+ "'";
            count++;
        }
       }
       System.out.println(sql);//在控制台上打印出sql语句查看拼接结果
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
随笔:

———————————————————————————— 

拼接sql语句是多条件查询的重要部分,在上述所给的技巧中,使用一切查询情况。其中判断HashMap中键值对是否为空,利用count值来判断查询条件情况是本文的重点。



===========================================================================


使用Java注解实现拼接sql语句的功能

原创  2016年05月14日 16:18:42

使用到的两个注解类:

[java]  view plain  copy
  1. <span style="font-size:18px;">package dao;  
  2.   
  3. import java.lang.annotation.ElementType;  
  4. import java.lang.annotation.Retention;  
  5. import java.lang.annotation.RetentionPolicy;  
  6. import java.lang.annotation.Target;  
  7.   
  8. /** 
  9.  * Created by raid on 2016/5/14. 
  10.  */  
  11. @Target({ElementType.TYPE})  
  12. @Retention(RetentionPolicy.RUNTIME)  
  13. public @interface Table {  
  14.     String value();  
  15. }  
  16. </span>  


[java]  view plain  copy
  1. package dao;  
  2.   
  3. import java.lang.annotation.ElementType;  
  4. import java.lang.annotation.Retention;  
  5. import java.lang.annotation.RetentionPolicy;  
  6. import java.lang.annotation.Target;  
  7.   
  8. /** 
  9.  * Created by raid on 2016/5/14. 
  10.  */  
  11. @Target({ElementType.FIELD})  
  12. @Retention(RetentionPolicy.RUNTIME)  
  13. public @interface Column {  
  14.     String value();  
  15. }  


[java]  view plain  copy
  1. package dao;  
  2.   
  3. /** 
  4.  * Created by raid on 2016/5/14. 
  5.  */  
  6. @Table("user")  
  7. public class Filter {  
  8.   
  9.     @Column("id")  
  10.     private int id;  
  11.   
  12.     @Column("user_name")  
  13.     private String userName;  
  14.   
  15.     @Column("nick_name")  
  16.     private String nickName;  
  17.   
  18.     @Column("age")  
  19.     private int age;  
  20.   
  21.     @Column("city")  
  22.     private String city;  
  23.   
  24.     @Column("email")  
  25.     private String email;  
  26.   
  27.     @Column("mobile")  
  28.     private String mobile;  
  29.   
  30.     public int getId() {  
  31.         return id;  
  32.     }  
  33.   
  34.     public void setId(int id) {  
  35.         this.id = id;  
  36.     }  
  37.   
  38.     public String getUserName() {  
  39.         return userName;  
  40.     }  
  41.   
  42.     public void setUserName(String userName) {  
  43.         this.userName = userName;  
  44.     }  
  45.   
  46.     public String getNickName() {  
  47.         return nickName;  
  48.     }  
  49.   
  50.     public void setNickName(String nickName) {  
  51.         this.nickName = nickName;  
  52.     }  
  53.   
  54.     public int getAge() {  
  55.         return age;  
  56.     }  
  57.   
  58.     public void setAge(int age) {  
  59.         this.age = age;  
  60.     }  
  61.   
  62.     public String getCity() {  
  63.         return city;  
  64.     }  
  65.   
  66.     public void setCity(String city) {  
  67.         this.city = city;  
  68.     }  
  69.   
  70.     public String getEmail() {  
  71.         return email;  
  72.     }  
  73.   
  74.     public void setEmail(String email) {  
  75.         this.email = email;  
  76.     }  
  77.   
  78.     public String getMobile() {  
  79.         return mobile;  
  80.     }  
  81.   
  82.     public void setMobile(String mobile) {  
  83.         this.mobile = mobile;  
  84.     }  
  85. }  

demo类:

[java]  view plain  copy
  1. package dao;  
  2.   
  3. import java.lang.reflect.Field;  
  4. import java.lang.reflect.Method;  
  5.   
  6. /** 
  7.  * Created by raid on 2016/5/14. 
  8.  */  
  9. public class Test {  
  10.   
  11.     public static void main(String[] args) {  
  12.         Filter f1 = new Filter();  
  13.         f1.setId(10);//查询ID为10的用户  
  14.   
  15.         Filter f2 = new Filter();  
  16.         f2.setUserName("lucy");  
  17.   
  18.         Filter f3 = new Filter();  
  19.         f3.setEmail("123@12.com,456@45.com,789@78.com");//查询邮箱为其中任意一个  
  20.   
  21.         String sql1 = query(f1);  
  22.         String sql2 = query(f2);  
  23.         String sql3 = query(f3);  
  24.   
  25.         System.out.println(sql1);;  
  26.         System.out.println(sql2);;  
  27.         System.out.println(sql3);;  
  28.     }  
  29.   
  30.     private static String query(Filter f) {  
  31.         StringBuilder sb = new StringBuilder();  
  32.         //1.获取到class  
  33.         Class c = f.getClass();  
  34.         //2.获取到table的名字  
  35.         boolean exists = c.isAnnotationPresent(Table.class);  
  36.         if (!exists) {  
  37.             return null;  
  38.         }  
  39.         Table t = (Table) c.getAnnotation(Table.class);  
  40.   
  41.         String tableName = t.value();  
  42.   
  43.         sb.append("select * from ").append(tableName).append(" where 1=1");  
  44.   
  45.         //2.遍历所有的字段  
  46.         Field[] fArray = c.getDeclaredFields();  
  47.         for (Field field : fArray) {  
  48.             //4.处理每个字段对应的sql  
  49.             //4.1拿到字段名  
  50.             boolean fExists = field.isAnnotationPresent(Column.class);  
  51.             if (!fExists) {  
  52.                 continue;  
  53.             }  
  54.             Column column = field.getAnnotation(Column.class);  
  55.             String columName = column.value();  
  56.             //4.2拿到字段值  
  57.             String fieldName = field.getName();  
  58.             String getMethodName = "get" + fieldName.substring(0,1).toUpperCase() + fieldName.substring(1);  
  59.             Object fieldValue = null;  
  60.             try {  
  61.                 Method getMethod = c.getMethod(getMethodName);  
  62.                 fieldValue = getMethod.invoke(f);  
  63.             } catch (Exception e) {  
  64.                 e.printStackTrace();  
  65.             }  
  66.             //4.3拼装sql  
  67.             if (fieldValue == null || (fieldValue instanceof Integer && (Integer)fieldValue == 0)) {  
  68.                 continue;  
  69.             }  
  70.             if (fieldValue instanceof String) {  
  71.                 if (((String)fieldValue).contains(",")) {  
  72.                     String[] values = ((String)fieldValue).split(",");  
  73.                     fieldValue = " in(";  
  74.                     for (String v : values) {  
  75.                         fieldValue += "'" + v + "'" + ",";  
  76.                     }  
  77.                     fieldValue = ((String)fieldValue).substring(0, ((String) fieldValue).length()-1) + ")";  
  78.                 } else {  
  79.                     fieldValue = "'" + fieldValue + "'";  
  80.                 }  
  81.   
  82.             }  
  83.   
  84.             sb.append(" and ").append(fieldName).append("=").append(fieldValue);  
  85.         }  
  86.   
  87.         return sb.toString();  
  88.     }  
  89.   
  90. }  





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值