JDBC操作技巧

WBOY
リリース: 2016-06-07 15:29:42
オリジナル
1204 人が閲覧しました

对于纯JDBC连接数据库连接工具如下: public static final String DBDRIVER=com.microsoft.sqlserver.jdbc.SQLServerDriver; public static final String DBURL=jdbc:sqlserver://10.81.35.35:1433;databaseName=Company; public static final String DBUSER

对于纯JDBC连接数据库连接工具如下:

public static final String DBDRIVER="com.microsoft.sqlserver.jdbc.SQLServerDriver";
    public static final String DBURL="jdbc:sqlserver://10.81.35.35:1433;databaseName=Company";
    public static final String DBUSERNAMW="sa";
    public static final String DBPSD="1111111";
    private Connection conn=null;
   
    public DataBaseConnection(){
        try{
            Class.forName(DBDRIVER);
            conn=DriverManager.getConnection(DBURL,DBUSERNAMW,DBPSD);
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    public Connection getConnection(){
        return this.conn ;
    }
   
    public void close() throws SQLException{
        if(this.conn!=null){
            conn.close();
        }
    }
ログイン後にコピー

然后我们便是采用PreparedStatement对SQL语句进行预处理,如下:
PreparedStatement pstm = null;
        String sql = "insert into Person(UserName,Password) values(?,?)";
        try {
            pstm = this.conn.prepareStatement(sql);
            pstm.setString(1, person.getUserName());
            pstm.setString(2, person.getPassword());
            int count = pstm.executeUpdate();
            if (count > 0) {
                flag = true;
            }
        } catch (Exception e) {
            throw e;
        } finally {
            try {
                pstm.close();
            } catch (Exception e) {
            }
        }
ログイン後にコピー

这是我们最常用的一种操作方式,可是问题就来了,我们所要操作的,必须对sql中的字段很明确,比如我们按条件来查询的时候,我们就必须对条件的字段很清楚,可是,当数据库字段增多的时候,我们所要查询的条件规则很多,是不是每一个条件,我们就要写一个方法呢?显然,这种是直接的思维,然而这样思维却增加了很多代码的冗余,又或者说是,每次变换条件或者新增条件的时候,我们都必须对方法进行修改,甚至是增加。于是乎,我们想有没有一种方式可以传递字段名称进去查询,如where ?=?

本人亲测,这种方式是不存在的,因为预处理字段的时候,PreparedStatement会自动在字符串上加引号,那此时就不能达到我们想要的效果(如想要的是where name=? 得到的却是 where 'name'=?),本人曾经在这样的问题上纠结了很久。最终找到一种破解的方式,这里借鉴了IBatis的Map传参方式。希望同行爱好者,我们除了要学会使用框架或插件,得找个时间去研究一下它的原理(源码)哦。

对于where ?=? 显然是不可取,但是对于字符串占位就可以的。例子如下:

public List<person> findByParams(Map<string object> params)
            throws Exception {
        Iterator it = params.entrySet().iterator();
        List<person> list = new ArrayList<person>();
        Person person = null;
        String key = null;
        Object value = null;
        PreparedStatement pstm = null;
        while (it.hasNext()) {
            Map.Entry<string object> entry = (Map.Entry<string object>) it
                    .next();
            key = entry.getKey();
            value = entry.getValue();
        }
      <span style="color:#FF0000;">  String sql = String.format(
                "select userid,username,password from person where %s=?", key);</span>
        pstm = this.conn.prepareStatement(sql);
        pstm.setObject(1, value);
        ResultSet rs = pstm.executeQuery();
        while(rs.next()) {
            person = new Person();
            person.setUserID(rs.getInt(1));
            person.setUserName(rs.getString(2));
            person.setPassword(rs.getString(3));
        }
        rs.close();
        pstm.close();
        return list;
    }</string></string></person></person></string></person>
ログイン後にコピー

哈哈 此种方式可以替代where ?=?,参照ibatis

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート